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 <<
"================================================================================"