18 #ifndef __invdyn_solvers_hqp_eiquadprog_rt_hxx__
19 #define __invdyn_solvers_hqp_eiquadprog_rt_hxx__
22 #include "eiquadprog/eiquadprog-rt.hxx"
26 namespace eisol = eiquadprog::solvers;
28 #define PROFILE_EIQUADPROG_PREPARATION "EiquadprogRT problem preparation"
29 #define PROFILE_EIQUADPROG_SOLUTION "EiquadprogRT problem solution"
34 template <
int nVars,
int nEqCon,
int nIneqCon>
36 const std::string& name)
45 template <
int nVars,
int nEqCon,
int nIneqCon>
47 std::cout <<
"[SolverHQuadProgRT." << m_name <<
"] " << s << std::endl;
50 template <
int nVars,
int nEqCon,
int nIneqCon>
55 assert(neq == nEqCon);
56 assert(nin == nIneqCon);
57 if ((n != nVars) || (neq != nEqCon) || (nin != nIneqCon))
59 <<
"[SolverHQuadProgRT] (n!=nVars) || (neq!=nEqCon) || (nin!=nIneqCon)"
63 template <
int nVars,
int nEqCon,
int nIneqCon>
74 if (problemData.size() > 2) {
75 PINOCCHIO_CHECK_INPUT_ARGUMENT(
76 false,
"Solver not implemented for more than 2 hierarchical levels.");
80 unsigned int neq = 0, nin = 0;
83 const unsigned int n = cl0[0].second->cols();
84 for (ConstraintLevel::const_iterator it = cl0.begin(); it != cl0.end();
86 auto constr = it->second;
87 assert(n == constr->cols());
88 if (constr->isEquality())
89 neq += constr->rows();
91 nin += constr->rows();
96 int i_eq = 0, i_in = 0;
97 for (ConstraintLevel::const_iterator it = cl0.begin(); it != cl0.end();
99 auto constr = it->second;
100 if (constr->isEquality()) {
101 m_CE.middleRows(i_eq, constr->rows()) = constr->matrix();
102 m_ce0.segment(i_eq, constr->rows()) = -constr->vector();
103 i_eq += constr->rows();
104 }
else if (constr->isInequality()) {
105 m_CI.middleRows(i_in, constr->rows()) = constr->matrix();
106 m_ci0.segment(i_in, constr->rows()) = -constr->lowerBound();
107 i_in += constr->rows();
108 m_CI.middleRows(i_in, constr->rows()) = -constr->matrix();
109 m_ci0.segment(i_in, constr->rows()) = constr->upperBound();
110 i_in += constr->rows();
111 }
else if (constr->isBound()) {
112 m_CI.middleRows(i_in, constr->rows()).setIdentity();
113 m_ci0.segment(i_in, constr->rows()) = -constr->lowerBound();
114 i_in += constr->rows();
115 m_CI.middleRows(i_in, constr->rows()) = -Matrix::Identity(m_n, m_n);
116 m_ci0.segment(i_in, constr->rows()) = constr->upperBound();
117 i_in += constr->rows();
121 resize(m_n, neq, nin);
123 if (problemData.size() > 1) {
127 for (ConstraintLevel::const_iterator it = cl1.begin(); it != cl1.end();
129 const double& w = it->first;
130 auto constr = it->second;
131 if (!constr->isEquality())
132 PINOCCHIO_CHECK_INPUT_ARGUMENT(
133 false,
"Inequalities in the cost function are not implemented yet");
136 m_H.noalias() += w * constr->matrix().transpose() * constr->matrix();
138 m_g.noalias() -= w * (constr->matrix().transpose() * constr->vector());
140 m_H.diagonal().noalias() += m_hessian_regularization * Vector::Ones(m_n);
160 typename RtVectorX<nVars>::d sol(m_n);
162 eisol::RtEiquadprog_status status =
163 m_solver.solve_quadprog(m_H, m_g, m_CE, m_ce0, m_CI, m_ci0, sol);
172 if (status == eisol::RT_EIQUADPROG_OPTIMAL) {
174 m_output.lambda = m_solver.getLagrangeMultipliers();
177 m_output.activeSet = m_solver.getActiveSet().segment(
178 m_neq, m_solver.getActiveSetSize() - m_neq);
179 m_output.iterations = m_solver.getIteratios();
182 const Vector& x = m_output.x;
184 if (cl0.size() > 0) {
185 for (ConstraintLevel::const_iterator it = cl0.begin(); it != cl0.end();
187 auto constr = it->second;
188 if (constr->checkConstraint(x) ==
false) {
189 if (constr->isEquality()) {
190 sendMsg(
"Equality " + constr->name() +
" violated: " +
191 toString((constr->matrix() * x - constr->vector()).norm()));
192 }
else if (constr->isInequality()) {
194 "Inequality " + constr->name() +
" violated: " +
196 (constr->matrix() * x - constr->lowerBound()).minCoeff()) +
199 (constr->upperBound() - constr->matrix() * x).minCoeff()));
200 }
else if (constr->isBound()) {
201 sendMsg(
"Bound " + constr->name() +
" violated: " +
202 toString((x - constr->lowerBound()).minCoeff()) +
"\n" +
203 toString((constr->upperBound() - x).minCoeff()));
209 }
else if (status == eisol::RT_EIQUADPROG_UNBOUNDED)
211 else if (status == eisol::RT_EIQUADPROG_MAX_ITER_REACHED)
213 else if (status == eisol::RT_EIQUADPROG_REDUNDANT_EQUALITIES)
214 m_output.status = HQP_STATUS_ERROR;
219 template <
int nVars,
int nEqCon,
int nIneqCon>
221 return m_solver.getObjValue();
224 template <
int nVars,
int nEqCon,
int nIneqCon>
226 unsigned int maxIter) {
228 return m_solver.setMaxIter(maxIter);
Definition: solver-HQP-output.hpp:29
void resize(unsigned int nVars, unsigned int nEqCon, unsigned int nInCon)
Definition: solver-HQP-output.hpp:48
Abstract interface for a Quadratic Program (HQP) solver.
Definition: solver-HQP-base.hpp:34
virtual bool setMaximumIterations(unsigned int maxIter)
Definition: solver-HQP-base.cpp:36
HQPOutput m_output
Definition: solver-HQP-base.hpp:84
double getObjectiveValue() override
Definition: solver-HQP-eiquadprog-rt.hxx:220
int m_n
number of inequality constraints
Definition: solver-HQP-eiquadprog-rt.hpp:90
const HQPOutput & solve(const HQPData &problemData) override
Definition: solver-HQP-eiquadprog-rt.hxx:64
void sendMsg(const std::string &s)
Definition: solver-HQP-eiquadprog-rt.hxx:46
int m_nin
number of equality constraints
Definition: solver-HQP-eiquadprog-rt.hpp:89
void resize(unsigned int n, unsigned int neq, unsigned int nin) override
Definition: solver-HQP-eiquadprog-rt.hxx:51
bool setMaximumIterations(unsigned int maxIter) override
Definition: solver-HQP-eiquadprog-rt.hxx:225
SolverHQuadProgRT(const std::string &name)
Definition: solver-HQP-eiquadprog-rt.hxx:35
int m_neq
Definition: solver-HQP-eiquadprog-rt.hpp:88
math::Vector Vector
Definition: solver-HQP-eiquadprog-rt.hpp:38
#define EIGEN_MALLOC_ALLOWED
Definition: fwd.hpp:27
#define EIGEN_MALLOC_NOT_ALLOWED
Definition: fwd.hpp:28
Definition: constraint-base.hpp:26
pinocchio::container::aligned_vector< ConstraintLevel > HQPData
Definition: fwd.hpp:99
pinocchio::container::aligned_vector< aligned_pair< double, std::shared_ptr< math::ConstraintBase > > > ConstraintLevel
Definition: fwd.hpp:95
Definition: constraint-bound.hpp:25
std::string toString(const T &v)
Definition: utils.hpp:39
#define PROFILE_EIQUADPROG_SOLUTION
Definition: solver-HQP-eiquadprog-rt.hxx:29
#define PROFILE_EIQUADPROG_PREPARATION
Definition: solver-HQP-eiquadprog-rt.hxx:28
#define DEFAULT_HESSIAN_REGULARIZATION
Definition: fwd.hpp:28
HQP_STATUS_MAX_ITER_REACHED
Definition: fwd.hpp:66
HQP_STATUS_OPTIMAL
Definition: fwd.hpp:63
HQP_STATUS_INFEASIBLE
Definition: fwd.hpp:64