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()));
void resize(unsigned int n, unsigned int neq, unsigned int nin)
void retrieveQPData(const HQPData &problemData, const bool hessianRegularization=true)
void resize(unsigned int nVars, unsigned int nEqCon, unsigned int nInCon)
std::string toString(const T &v)
EIQUADPROG_FAST_REDUNDANT_EQUALITIES
bool setMaximumIterations(unsigned int maxIter)
#define DEFAULT_HESSIAN_REGULARIZATION
EiquadprogFast_status solve_quadprog(const MatrixXd &Hess, const VectorXd &g0, const MatrixXd &CE, const VectorXd &ce0, const MatrixXd &CI, const VectorXd &ci0, VectorXd &x)
#define EIGEN_MALLOC_ALLOWED
EIQUADPROG_FAST_UNBOUNDED
const HQPOutput & solve(const HQPData &problemData)
void sendMsg(const std::string &s)
double getObjectiveValue()
double m_hessian_regularization
void reset(size_t dim_qp, size_t num_eq, size_t num_ineq)
#define EIGEN_MALLOC_NOT_ALLOWED
QPDataQuadProgTpl< double > m_qpData
number of variables
#define STOP_PROFILER_EIQUADPROG_FAST(x)
eiquadprog::solvers::EiquadprogFast m_solver
HQP_STATUS_MAX_ITER_REACHED
const VectorXi & getActiveSet() const
bool setMaxIter(int maxIter)
EIQUADPROG_FAST_MAX_ITER_REACHED
#define START_PROFILER_EIQUADPROG_FAST(x)
const VectorXd & getLagrangeMultipliers() const
size_t getActiveSetSize() const
virtual bool setMaximumIterations(unsigned int maxIter)
VectorXi activeSet
Lagrange multipliers.
int iterations
indexes of active inequalities
double getObjValue() const
unsigned int m_n
number of inequality constraints
#define PINOCCHIO_CHECK_INPUT_ARGUMENT(...)
unsigned int m_nin
number of equality constraints
Abstract interface for a Quadratic Program (HQP) solver.