31 SolverHQuadProgFast::SolverHQuadProgFast(
const std::string&
name)
40 std::cout <<
"[SolverHQuadProgFast." <<
m_name <<
"] " <<
s << std::endl;
45 const bool resizeVar =
n !=
m_n;
46 const bool resizeEq = (resizeVar ||
neq !=
m_neq);
47 const bool resizeIn = (resizeVar ||
nin !=
m_nin);
74 if (resizeVar || resizeIn || resizeEq) {
85 const bool hessianRegularization) {
86 if (problemData.size() > 2) {
88 false,
"Solver not implemented for more than 2 hierarchical levels.");
92 unsigned int neq = 0,
nin = 0;
95 const unsigned int n = cl0[0].second->cols();
96 for (ConstraintLevel::const_iterator
it = cl0.begin();
it != cl0.end();
98 auto constr =
it->second;
99 assert(
n == constr->cols());
100 if (constr->isEquality())
101 neq += constr->rows();
103 nin += constr->rows();
108 unsigned int i_eq = 0, i_in = 0;
109 for (ConstraintLevel::const_iterator
it = cl0.begin();
it != cl0.end();
111 auto constr =
it->second;
112 if (constr->isEquality()) {
113 m_qpData.
CE.middleRows(i_eq, constr->rows()) = constr->matrix();
114 m_qpData.
ce0.segment(i_eq, constr->rows()) = -constr->vector();
115 i_eq += constr->rows();
117 }
else if (constr->isInequality()) {
118 m_qpData.
CI.middleRows(i_in, constr->rows()) = constr->matrix();
119 m_qpData.
ci0.segment(i_in, constr->rows()) = -constr->lowerBound();
120 i_in += constr->rows();
121 m_qpData.
CI.middleRows(i_in, constr->rows()) = -constr->matrix();
122 m_qpData.
ci0.segment(i_in, constr->rows()) = constr->upperBound();
123 i_in += constr->rows();
124 }
else if (constr->isBound()) {
125 m_qpData.
CI.middleRows(i_in, constr->rows()).setIdentity();
126 m_qpData.
ci0.segment(i_in, constr->rows()) = -constr->lowerBound();
127 i_in += constr->rows();
128 m_qpData.
CI.middleRows(i_in, constr->rows()) =
129 -Matrix::Identity(
m_n,
m_n);
130 m_qpData.
ci0.segment(i_in, constr->rows()) = constr->upperBound();
131 i_in += constr->rows();
140 if (problemData.size() > 1) {
145 for (ConstraintLevel::const_iterator
it = cl1.begin();
it != cl1.end();
147 const double&
w =
it->first;
148 auto constr =
it->second;
149 if (!constr->isEquality())
151 false,
"Inequalities in the cost function are not implemented yet");
155 w * constr->matrix().transpose() * constr->matrix();
159 w * constr->matrix().transpose() * constr->vector();
162 if (hessianRegularization) {
196 if (cl0.size() > 0) {
197 for (ConstraintLevel::const_iterator
it = cl0.begin();
it != cl0.end();
199 auto constr =
it->second;
200 if (constr->checkConstraint(
x) ==
false) {
202 if (constr->isEquality()) {
203 sendMsg(
"Equality " + constr->name() +
" violated: " +
204 toString((constr->matrix() *
x - constr->vector()).norm()));
205 }
else if (constr->isInequality()) {
207 "Inequality " + constr->name() +
" violated: " +
209 (constr->matrix() *
x - constr->lowerBound()).minCoeff()) +
212 (constr->upperBound() - constr->matrix() *
x).minCoeff()));
213 }
else if (constr->isBound()) {
214 sendMsg(
"Bound " + constr->name() +
" violated: " +
215 toString((
x - constr->lowerBound()).minCoeff()) +
"\n" +
216 toString((constr->upperBound() -
x).minCoeff()));