13 #include <Eigen/Dense>
21 double computeObjective(
const Eigen::MatrixXd &H,
const Eigen::VectorXd &h,
const Eigen::VectorXd &primal)
23 Eigen::MatrixXd L = H.triangularView<Eigen::Lower>();
25 double result = 0.5 * primal.transpose() * L * L.transpose() * primal;
29 result += h.transpose() * primal;
32 std::cout <<
"||| Objective = " << result << std::endl;
38 template <
class t_ActiveSet,
class t_Constra
intStatuses>
40 const Eigen::MatrixXd &H,
41 const Eigen::VectorXd &h,
42 const Eigen::VectorXd &primal,
43 const Eigen::MatrixXd &A,
44 const t_ActiveSet &active_set,
46 const t_ConstraintStatuses &constraints_status,
47 const Eigen::VectorXd &dual,
48 const Eigen::VectorXd &dual_direction = Eigen::VectorXd())
50 Eigen::MatrixXd L = H.triangularView<Eigen::Lower>();
51 Eigen::VectorXd v = L * L.transpose() * primal;
59 M.resize(primal.rows(), active_set.size_);
65 if (ctr_index < num_simple_bounds)
68 switch (constraints_status[ctr_index])
71 M(ctr_index, i) = -1.0;
75 M(ctr_index, i) = 1.0;
83 switch (constraints_status[ctr_index])
86 M.col(i) = -A.row(ctr_index - num_simple_bounds).transpose();
90 M.col(i) = A.row(ctr_index - num_simple_bounds).transpose();
97 if (M.cols() > 0 && active_set.num_equalities_ < active_set.size_)
99 Eigen::HouseholderQR<Eigen::MatrixXd> dec(M);
100 Eigen::VectorXd dual_check = dec.solve(-v);
102 double max_diff = 0.0;
103 std::cout <<
"===============================[Dual variables]================================="
108 std::cout <<
" " << i;
109 switch (constraints_status[ctr_index])
124 std::cout <<
"dual " << dual(i) <<
" | "
125 <<
"ref " << dual_check(i) <<
" | ";
128 switch (constraints_status[ctr_index])
132 std::cout <<
"err " << std::abs(dual(i) - dual_check(i)) <<
" | ";
133 if (dual_direction.rows() > 0)
135 std::cout <<
"dir " << dual_direction(i) <<
" | "
136 <<
"len " << dual(i) / dual_direction(i) << std::endl;
140 std::cout << std::endl;
142 if (max_diff < std::abs(dual(i) - dual_check(i)))
144 max_diff = std::abs(dual(i) - dual_check(i));
149 std::cout << std::endl;
157 std::cout <<
" MAX DIFF = " << max_diff << std::endl;
158 std::cout <<
"================================================================================"
164 template <
class t_ActiveSet,
class t_Constra
intStatuses>
166 const t_ActiveSet &active_set,
167 const t_ConstraintStatuses &constraints_status,
168 const Eigen::VectorXd &dual)
170 std::cout <<
"====================================[Active set]================================"
172 for (
MatrixIndex i = active_set.num_equalities_; i < active_set.size_; ++i)
174 MatrixIndex active_ctr_index = active_set.getIndex(i);
176 std::cout <<
" ## " << i <<
" ## | Index = " << active_ctr_index
177 <<
" | Type = " << constraints_status[active_ctr_index] <<
" | Dual = " << dual(i)
180 std::cout <<
"================================================================================"
184 template <
class t_Dual,
class t_Indices,
class t_IsLower>
187 std::cout <<
"================================[Dual variables]================================"
190 dual.size() == indices.size() && dual.size() == is_lower.size(),
"Inconsistent vector length");
193 std::cout <<
" ## " << i <<
" ## | Index = " << indices(i) <<
" | Lower = " << is_lower(i)
194 <<
" | Dual = " << dual(i) << std::endl;
196 std::cout <<
"================================================================================"
#define QPMAD_UTILS_THROW(s)
#define QPMAD_UTILS_PERSISTENT_ASSERT(condition,...)
double computeObjective(const Eigen::MatrixXd &H, const Eigen::VectorXd &h, const Eigen::VectorXd &primal)
void printActiveSet(const t_ActiveSet &active_set, const t_ConstraintStatuses &constraints_status, const Eigen::VectorXd &dual)
void checkLagrangeMultipliers(const Eigen::MatrixXd &H, const Eigen::VectorXd &h, const Eigen::VectorXd &primal, const Eigen::MatrixXd &A, const t_ActiveSet &active_set, const MatrixIndex &num_simple_bounds, const t_ConstraintStatuses &constraints_status, const Eigen::VectorXd &dual, const Eigen::VectorXd &dual_direction=Eigen::VectorXd())
void printDualVariables(const t_Dual &dual, const t_Indices &indices, const t_IsLower &is_lower)
EIGEN_DEFAULT_DENSE_INDEX_TYPE MatrixIndex