Skip to content

Commit 4c0a27a

Browse files
committed
all: move to helpers {negative,positive}_parts and other related helpers
1 parent 5021061 commit 4c0a27a

17 files changed

+929
-1063
lines changed

include/proxsuite/helpers/common.hpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,38 @@ struct infinite_bound
2424
}
2525
};
2626

27+
#define PROXSUITE_DEDUCE_RET(...) \
28+
noexcept(noexcept(__VA_ARGS__)) \
29+
->typename std::remove_const<decltype(__VA_ARGS__)>::type \
30+
{ \
31+
return __VA_ARGS__; \
32+
} \
33+
static_assert(true, ".")
34+
35+
/// @brief \brief Returns the part of the expression which is lower than value
36+
template<typename T, typename Scalar>
37+
auto
38+
lower_than(T const& expr, const Scalar value) PROXSUITE_DEDUCE_RET(
39+
(expr.array() < value).select(expr, T::Zero(expr.rows())));
40+
41+
/// @brief \brief Returns the part of the expression which is greater than value
42+
template<typename T, typename Scalar>
43+
auto
44+
greater_than(T const& expr, const Scalar value) PROXSUITE_DEDUCE_RET(
45+
(expr.array() > value).select(expr, T::Zero(expr.rows())));
46+
47+
/// @brief \brief Returns the positive part of an expression
48+
template<typename T>
49+
auto
50+
positive_part(T const& expr)
51+
PROXSUITE_DEDUCE_RET((expr.array() > 0).select(expr, T::Zero(expr.rows())));
52+
53+
/// @brief \brief Returns the negative part of an expression
54+
template<typename T>
55+
auto
56+
negative_part(T const& expr)
57+
PROXSUITE_DEDUCE_RET((expr.array() < 0).select(expr, T::Zero(expr.rows())));
58+
2759
} // helpers
2860
} // proxsuite
2961

include/proxsuite/proxqp/dense/solver.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,8 +459,8 @@ compute_inner_loop_saddle_point(const Model<T>& qpmodel,
459459
{
460460

461461
qpwork.active_part_z =
462-
positive_part(qpwork.primal_residual_in_scaled_up) +
463-
negative_part(qpwork.primal_residual_in_scaled_low) -
462+
helpers::positive_part(qpwork.primal_residual_in_scaled_up) +
463+
helpers::negative_part(qpwork.primal_residual_in_scaled_low) -
464464
qpresults.z * qpresults.info.mu_in; // contains now : [Cx-u+z_prev*mu_in]+
465465
// + [Cx-l+z_prev*mu_in]- - z*mu_in
466466

include/proxsuite/proxqp/dense/utils.hpp

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -113,38 +113,6 @@ save_data(const std::string& filename, const ::Eigen::MatrixBase<Derived>& mat)
113113
}
114114
}
115115

116-
#define LDLT_DEDUCE_RET(...) \
117-
noexcept(noexcept(__VA_ARGS__)) \
118-
->typename std::remove_const<decltype(__VA_ARGS__)>::type \
119-
{ \
120-
return __VA_ARGS__; \
121-
} \
122-
static_assert(true, ".")
123-
124-
/// @brief \brief Returns the part of the expression which is lower than value
125-
template<typename T, typename Scalar>
126-
auto
127-
lower_than(T const& expr, const Scalar value)
128-
LDLT_DEDUCE_RET((expr.array() < value).select(expr, T::Zero(expr.rows())));
129-
130-
/// @brief \brief Returns the part of the expression which is greater than value
131-
template<typename T, typename Scalar>
132-
auto
133-
greater_than(T const& expr, const Scalar value)
134-
LDLT_DEDUCE_RET((expr.array() > value).select(expr, T::Zero(expr.rows())));
135-
136-
/// @brief \brief Returns the positive part of an expression
137-
template<typename T>
138-
auto
139-
positive_part(T const& expr)
140-
LDLT_DEDUCE_RET((expr.array() > 0).select(expr, T::Zero(expr.rows())));
141-
142-
/// @brief \brief Returns the negative part of an expression
143-
template<typename T>
144-
auto
145-
negative_part(T const& expr)
146-
LDLT_DEDUCE_RET((expr.array() < 0).select(expr, T::Zero(expr.rows())));
147-
148116
/*!
149117
* Derives the global primal residual of the QP problem.
150118
*
@@ -199,8 +167,8 @@ global_primal_residual(const Model<T>& qpmodel,
199167
primal_feasibility_in_rhs_0 = infty_norm(qpwork.primal_residual_in_scaled_up);
200168

201169
qpwork.primal_residual_in_scaled_low =
202-
positive_part(qpwork.primal_residual_in_scaled_up - qpmodel.u) +
203-
negative_part(qpwork.primal_residual_in_scaled_up - qpmodel.l);
170+
helpers::positive_part(qpwork.primal_residual_in_scaled_up - qpmodel.u) +
171+
helpers::negative_part(qpwork.primal_residual_in_scaled_up - qpmodel.l);
204172
qpwork.primal_residual_eq_scaled -= qpmodel.b;
205173

206174
primal_feasibility_in_lhs = infty_norm(qpwork.primal_residual_in_scaled_low);
@@ -255,8 +223,8 @@ global_primal_residual_infeasibility(
255223
ruiz.unscale_dual_residual_in_place(ATdy);
256224
ruiz.unscale_dual_residual_in_place(CTdz);
257225
T eq_inf = dy.to_eigen().dot(qpwork.b_scaled);
258-
T in_inf = positive_part(dz.to_eigen()).dot(qpwork.u_scaled) -
259-
positive_part(-dz.to_eigen()).dot(qpwork.l_scaled);
226+
T in_inf = helpers::positive_part(dz.to_eigen()).dot(qpwork.u_scaled) -
227+
helpers::negative_part(dz.to_eigen()).dot(qpwork.l_scaled);
260228
ruiz.unscale_dual_in_place_eq(dy);
261229
ruiz.unscale_dual_in_place_in(dz);
262230

@@ -429,14 +397,14 @@ global_dual_residual(Results<T>& qpresults,
429397
ruiz.unscale_dual_in_place_in(VectorViewMut<T>{ from_eigen, qpresults.z });
430398

431399
const T zu =
432-
positive_part(qpresults.z)
433-
.dot(lower_than(qpmodel.u, helpers::infinite_bound<T>::value()));
400+
helpers::positive_part(qpresults.z)
401+
.dot(helpers::lower_than(qpmodel.u, helpers::infinite_bound<T>::value()));
434402
rhs_duality_gap = std::max(rhs_duality_gap, std::abs(zu));
435403
duality_gap += zu;
436404

437-
const T zl =
438-
negative_part(qpresults.z)
439-
.dot(greater_than(qpmodel.l, -helpers::infinite_bound<T>::value()));
405+
const T zl = helpers::negative_part(qpresults.z)
406+
.dot(helpers::greater_than(
407+
qpmodel.l, -helpers::infinite_bound<T>::value()));
440408
rhs_duality_gap = std::max(rhs_duality_gap, std::abs(zl));
441409
duality_gap += zl;
442410

include/proxsuite/proxqp/dense/wrapper.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ object Qp.solve(); // solve the problem
5858
// Verify solution accuracy
5959
T pri_res = std::max(
6060
(qp.A * Qp.results.x - qp.b).lpNorm<Eigen::Infinity>(),
61-
(proxqp::dense::positive_part(qp.C * Qp.results.x -
62-
qp.u) + proxqp::dense::negative_part(qp.C * Qp.results.x - qp.l))
61+
(helpers::positive_part(qp.C * Qp.results.x -
62+
qp.u) + helpers::negative_part(qp.C * Qp.results.x - qp.l))
6363
.lpNorm<Eigen::Infinity>());
6464
T dua_res = (qp.H * Qp.results.x + qp.g + qp.A.transpose() *
6565
Qp.results.y + qp.C.transpose() * Qp.results.z) .lpNorm<Eigen::Infinity>();

include/proxsuite/proxqp/sparse/solver.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,8 +1136,8 @@ qp_solve(Results<T>& results,
11361136
primal_residual_in_scaled_up += alpha * Cdx;
11371137

11381138
T err_in = std::max({
1139-
(infty_norm(detail::negative_part(primal_residual_in_scaled_lo) +
1140-
detail::positive_part(primal_residual_in_scaled_up) -
1139+
(infty_norm(helpers::negative_part(primal_residual_in_scaled_lo) +
1140+
helpers::positive_part(primal_residual_in_scaled_up) -
11411141
results.info.mu_in * z_e)),
11421142
(infty_norm(primal_residual_eq_scaled)),
11431143
(infty_norm(dual_residual_scaled)),

include/proxsuite/proxqp/sparse/utils.hpp

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -102,30 +102,6 @@ print_setup_header(const Settings<T>& settings,
102102

103103
namespace detail {
104104

105-
/// @brief \brief Returns the part of the expression which is lower than value
106-
template<typename T, typename Scalar>
107-
auto
108-
lower_than(T const& expr, const Scalar value)
109-
VEG_DEDUCE_RET((expr.array() < value).select(expr, T::Zero(expr.rows())));
110-
111-
/// @brief \brief Returns the part of the expression which is greater than value
112-
template<typename T, typename Scalar>
113-
auto
114-
greater_than(T const& expr, const Scalar value)
115-
VEG_DEDUCE_RET((expr.array() > value).select(expr, T::Zero(expr.rows())));
116-
117-
/// @brief \brief Returns the positive part of an expression
118-
template<typename T>
119-
auto
120-
positive_part(T const& expr)
121-
VEG_DEDUCE_RET((expr.array() > 0).select(expr, T::Zero(expr.rows())));
122-
123-
/// @brief \brief Returns the negative part of an expression
124-
template<typename T>
125-
auto
126-
negative_part(T const& expr)
127-
VEG_DEDUCE_RET((expr.array() < 0).select(expr, T::Zero(expr.rows())));
128-
129105
template<typename T, typename I>
130106
VEG_NO_INLINE void
131107
noalias_gevmmv_add_impl( //
@@ -518,8 +494,8 @@ global_primal_residual_infeasibility(VectorViewMut<T> ATdy,
518494
ruiz.unscale_dual_residual_in_place(ATdy);
519495
ruiz.unscale_dual_residual_in_place(CTdz);
520496
T eq_inf = dy.to_eigen().dot(qp_scaled.b.to_eigen());
521-
T in_inf = positive_part(dz.to_eigen()).dot(qp_scaled.u.to_eigen()) -
522-
positive_part(-dz.to_eigen()).dot(qp_scaled.l.to_eigen());
497+
T in_inf = helpers::positive_part(dz.to_eigen()).dot(qp_scaled.u.to_eigen()) -
498+
helpers::negative_part(dz.to_eigen()).dot(qp_scaled.l.to_eigen());
523499
ruiz.unscale_dual_in_place_eq(dy);
524500
ruiz.unscale_dual_in_place_in(dz);
525501

@@ -690,13 +666,13 @@ unscaled_primal_dual_residual(
690666

691667
precond.unscale_dual_in_place_in({ proxsuite::proxqp::from_eigen, z_e });
692668

693-
const T zl = negative_part(z_e).dot(
694-
greater_than(data.l, -helpers::infinite_bound<T>::value()));
669+
const T zl = helpers::negative_part(z_e).dot(
670+
helpers::greater_than(data.l, -helpers::infinite_bound<T>::value()));
695671
results.info.duality_gap += zl;
696672
rhs_duality_gap = std::max(rhs_duality_gap, std::abs(zl));
697673

698-
const T zu = positive_part(z_e).dot(
699-
lower_than(data.u, helpers::infinite_bound<T>::value()));
674+
const T zu = helpers::positive_part(z_e).dot(
675+
helpers::lower_than(data.u, helpers::infinite_bound<T>::value()));
700676
results.info.duality_gap += zu;
701677
rhs_duality_gap = std::max(rhs_duality_gap, std::abs(zu));
702678

@@ -746,8 +722,8 @@ unscaled_primal_dual_residual(
746722
auto l = data.l;
747723
auto u = data.u;
748724
primal_residual_in_scaled_lo =
749-
positive_part(primal_residual_in_scaled_up - u) +
750-
negative_part(primal_residual_in_scaled_up - l);
725+
helpers::positive_part(primal_residual_in_scaled_up - u) +
726+
helpers::negative_part(primal_residual_in_scaled_up - l);
751727

752728
primal_residual_eq_scaled -= b;
753729
T primal_feasibility_eq_lhs = infty_norm(primal_residual_eq_scaled);

include/proxsuite/proxqp/sparse/wrapper.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ ::proxsuite::proxqp::test::rand::vector_rand<T>(n_in); auto u = (l.array() +
6868
// Verify solution accuracy
6969
T pri_res = std::max(
7070
(qp.A * Qp.results.x - qp.b).lpNorm<Eigen::Infinity>(),
71-
(proxqp::dense::positive_part(qp.C * Qp.results.x -
72-
qp.u) + proxqp::dense::negative_part(qp.C * Qp.results.x - qp.l))
71+
(helpers::positive_part(qp.C * Qp.results.x -
72+
qp.u) + helpers::negative_part(qp.C * Qp.results.x - qp.l))
7373
.lpNorm<Eigen::Infinity>());
7474
T dua_res = (qp.H * Qp.results.x + qp.g + qp.A.transpose() *
7575
Qp.results.y + qp.C.transpose() * Qp.results.z) .lpNorm<Eigen::Infinity>();

test/src/cvxpy.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ DOCTEST_TEST_CASE("3 dim test case from cvxpy, check feasibility")
4242
Results<T> results = dense::solve<T>(
4343
H, g, nullopt, nullopt, C, l, u, nullopt, nullopt, nullopt, eps_abs, 0);
4444

45-
T pri_res = (dense::positive_part(C * results.x - u) +
46-
dense::negative_part(C * results.x - l))
45+
T pri_res = (helpers::positive_part(C * results.x - u) +
46+
helpers::negative_part(C * results.x - l))
4747
.lpNorm<Eigen::Infinity>();
4848
T dua_res =
4949
(H * results.x + g + C.transpose() * results.z).lpNorm<Eigen::Infinity>();
@@ -82,8 +82,8 @@ DOCTEST_TEST_CASE("simple test case from cvxpy, check feasibility")
8282
Results<T> results = dense::solve<T>(
8383
H, g, nullopt, nullopt, C, l, u, nullopt, nullopt, nullopt, eps_abs, 0);
8484

85-
T pri_res = (dense::positive_part(C * results.x - u) +
86-
dense::negative_part(C * results.x - l))
85+
T pri_res = (helpers::positive_part(C * results.x - u) +
86+
helpers::negative_part(C * results.x - l))
8787
.lpNorm<Eigen::Infinity>();
8888
T dua_res =
8989
(H * results.x + g + C.transpose() * results.z).lpNorm<Eigen::Infinity>();
@@ -140,8 +140,8 @@ DOCTEST_TEST_CASE("simple test case from cvxpy, init with solution, check that "
140140
z << 0.0;
141141
qp.solve(x, nullopt, z);
142142

143-
T pri_res = (dense::positive_part(C * qp.results.x - u) +
144-
dense::negative_part(C * qp.results.x - l))
143+
T pri_res = (helpers::positive_part(C * qp.results.x - u) +
144+
helpers::negative_part(C * qp.results.x - l))
145145
.lpNorm<Eigen::Infinity>();
146146
T dua_res = (H * qp.results.x + g + C.transpose() * qp.results.z)
147147
.lpNorm<Eigen::Infinity>();

test/src/dense_maros_meszaros.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ TEST_CASE("dense maros meszaros using the api")
136136

137137
T prim_eq = proxqp::dense::infty_norm(A * x - b);
138138
T prim_in =
139-
proxqp::dense::infty_norm(proxqp::dense::positive_part(C * x - u) +
140-
proxqp::dense::negative_part(C * x - l));
139+
proxqp::dense::infty_norm(helpers::positive_part(C * x - u) +
140+
helpers::negative_part(C * x - l));
141141
std::cout << "primal residual " << std::max(prim_eq, prim_in)
142142
<< std::endl;
143143
std::cout << "dual residual "

test/src/dense_qp_eq.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ DOCTEST_TEST_CASE("sparse random strongly convex qp with equality constraints "
8484
qp.solve();
8585
T pri_res = std::max(
8686
(qp_random.A * qp.results.x - qp_random.b).lpNorm<Eigen::Infinity>(),
87-
(proxqp::dense::positive_part(qp_random.C * qp.results.x - qp_random.u) +
88-
proxqp::dense::negative_part(qp_random.C * qp.results.x - qp_random.l))
87+
(helpers::positive_part(qp_random.C * qp.results.x - qp_random.u) +
88+
helpers::negative_part(qp_random.C * qp.results.x - qp_random.l))
8989
.lpNorm<Eigen::Infinity>());
9090
T dua_res = (qp_random.H * qp.results.x + qp_random.g +
9191
qp_random.A.transpose() * qp.results.y +
@@ -139,8 +139,8 @@ DOCTEST_TEST_CASE("linear problem with equality with equality constraints and "
139139

140140
T pri_res = std::max(
141141
(qp_random.A * qp.results.x - qp_random.b).lpNorm<Eigen::Infinity>(),
142-
(proxqp::dense::positive_part(qp_random.C * qp.results.x - qp_random.u) +
143-
proxqp::dense::negative_part(qp_random.C * qp.results.x - qp_random.l))
142+
(helpers::positive_part(qp_random.C * qp.results.x - qp_random.u) +
143+
helpers::negative_part(qp_random.C * qp.results.x - qp_random.l))
144144
.lpNorm<Eigen::Infinity>());
145145
T dua_res = (qp_random.H * qp.results.x + qp_random.g +
146146
qp_random.A.transpose() * qp.results.y +

0 commit comments

Comments
 (0)