Skip to content

Commit c90e5cc

Browse files
fabinschpre-commit-ci[bot]jcarpent
authored
Fix preconditioner (#24)
* dense/preconditioner: fix alloc delta (same as sparse) * dense/preconditioner: make sure no division by 0 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update include/proxsuite/proxqp/dense/preconditioner/ruiz.hpp Co-authored-by: Justin Carpentier <[email protected]> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * dense/preconditioner: fix delta Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Justin Carpentier <[email protected]>
1 parent dec17b0 commit c90e5cc

File tree

1 file changed

+48
-28
lines changed
  • include/proxsuite/proxqp/dense/preconditioner

1 file changed

+48
-28
lines changed

include/proxsuite/proxqp/dense/preconditioner/ruiz.hpp

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ template<typename T>
2929
auto
3030
ruiz_scale_qp_in_place( //
3131
VectorViewMut<T> delta_,
32-
VectorViewMut<T> tmp_delta_preallocated,
3332
std::ostream* logger_ptr,
3433
QpViewBoxMut<T> qp,
3534
T epsilon,
3635
isize max_iter,
37-
Symmetry sym) -> T
36+
Symmetry sym,
37+
proxsuite::linalg::veg::dynstack::DynStackMut stack) -> T
3838
{
3939

4040
T c(1);
@@ -62,7 +62,7 @@ ruiz_scale_qp_in_place( //
6262

6363
T gamma = T(1);
6464

65-
auto delta = tmp_delta_preallocated.to_eigen();
65+
LDLT_TEMP_VEC(T, delta, n + n_eq + n_in, stack);
6666

6767
i64 iter = 1;
6868

@@ -86,45 +86,66 @@ ruiz_scale_qp_in_place( //
8686
for (isize k = 0; k < n; ++k) {
8787
switch (sym) {
8888
case Symmetry::upper: { // upper triangular part
89-
delta(k) = T(1) / (sqrt(std::max({
90-
infty_norm(H.col(k).head(k)),
91-
infty_norm(H.row(k).tail(n - k)),
92-
infty_norm(A.col(k)),
93-
infty_norm(C.col(k)),
94-
})) +
95-
machine_eps);
89+
T aux = sqrt(std::max({
90+
infty_norm(H.col(k).head(k)),
91+
infty_norm(H.row(k).tail(n - k)),
92+
infty_norm(A.col(k)),
93+
infty_norm(C.col(k)),
94+
}));
95+
if (aux == T(0)) {
96+
delta(k) = T(1);
97+
} else {
98+
delta(k) = T(1) / (aux + machine_eps);
99+
}
96100
break;
97101
}
98102
case Symmetry::lower: { // lower triangular part
99-
delta(k) = T(1) / (sqrt(std::max({
100-
infty_norm(H.row(k).head(k)),
101-
infty_norm(H.col(k).tail(n - k)),
102-
infty_norm(A.col(k)),
103-
infty_norm(C.col(k)),
104-
})) +
105-
machine_eps);
103+
104+
T aux = sqrt(std::max({
105+
infty_norm(H.col(k).head(k)),
106+
infty_norm(H.col(k).tail(n - k)),
107+
infty_norm(A.col(k)),
108+
infty_norm(C.col(k)),
109+
}));
110+
if (aux == T(0)) {
111+
delta(k) = T(1);
112+
} else {
113+
delta(k) = T(1) / (aux + machine_eps);
114+
}
106115
break;
107116
}
108117
case Symmetry::general: {
109-
delta(k) = T(1) / (sqrt(std::max({
110-
infty_norm(H.col(k)),
111-
infty_norm(A.col(k)),
112-
infty_norm(C.col(k)),
113-
})) +
114-
machine_eps);
115118

119+
T aux = sqrt(std::max({
120+
infty_norm(H.col(k)),
121+
infty_norm(A.col(k)),
122+
infty_norm(C.col(k)),
123+
}));
124+
if (aux == T(0)) {
125+
delta(k) = T(1);
126+
} else {
127+
delta(k) = T(1) / (aux + machine_eps);
128+
}
116129
break;
117130
}
118131
}
119132
}
120133

121134
for (isize k = 0; k < n_eq; ++k) {
122135
T aux = sqrt(infty_norm(A.row(k)));
123-
delta(n + k) = T(1) / (aux + machine_eps);
136+
if (aux == T(0)) {
137+
delta(n + k) = T(1);
138+
} else {
139+
delta(n + k) = T(1) / (aux + machine_eps);
140+
}
124141
}
125142
for (isize k = 0; k < n_in; ++k) {
126143
T aux = sqrt(infty_norm(C.row(k)));
127-
delta(k + n + n_eq) = T(1) / (aux + machine_eps);
144+
if (aux == T(0)) {
145+
delta(k + n + n_eq) = T(1);
146+
} else {
147+
delta(k + n + n_eq) = T(1) / (aux + machine_eps);
148+
}
128149
}
129150
}
130151
{
@@ -300,14 +321,13 @@ struct RuizEquilibration
300321
{
301322
if (execute_preconditioner) {
302323
delta.setOnes();
303-
LDLT_TEMP_VEC(T, tmp_delta, qp.H.rows + qp.A.rows + qp.C.rows, stack);
304324
c = detail::ruiz_scale_qp_in_place({ proxqp::from_eigen, delta },
305-
{ proxqp::from_eigen, tmp_delta },
306325
logger_ptr,
307326
qp,
308327
epsilon,
309328
max_iter,
310-
sym);
329+
sym,
330+
stack);
311331
} else {
312332

313333
auto H = qp.H.to_eigen();

0 commit comments

Comments
 (0)