9 #include <Eigen/SparseCore>
13 #ifdef QP_SOLVER_COLLECTION_STANDALONE
15 # define QSC_ERROR_STREAM(x) std::cerr << x << "\n"
16 # define QSC_WARN_STREAM(x) std::cerr << x << "\n"
17 # define QSC_INFO_STREAM(x) std::cout << x << "\n"
19 # include <rclcpp/rclcpp.hpp>
20 # define QSC_ERROR_STREAM(msg) RCLCPP_ERROR_STREAM(rclcpp::get_logger("QpSolverCollection"), msg)
21 # define QSC_WARN_STREAM(msg) RCLCPP_WARN_STREAM(rclcpp::get_logger("QpSolverCollection"), msg)
22 # define QSC_INFO_STREAM(msg) RCLCPP_INFO_STREAM(rclcpp::get_logger("QpSolverCollection"), msg)
36 class GoldfarbIdnaniSolver;
50 struct d_dense_qp_dim;
52 struct d_dense_qp_sol;
53 struct d_dense_qp_ipm_arg;
54 struct d_dense_qp_ipm_ws;
70 template<
typename t_Scalar,
int... t_Parameters>
104 switch(qp_solver_type)
106 case QpSolverType::QLD:
107 return "QpSolverType::QLD";
108 case QpSolverType::QuadProg:
109 return "QpSolverType::QuadProg";
110 case QpSolverType::LSSOL:
111 return "QpSolverType::LSSOL";
112 case QpSolverType::JRLQP:
113 return "QpSolverType::JRLQP";
114 case QpSolverType::qpOASES:
115 return "QpSolverType::qpOASES";
116 case QpSolverType::OSQP:
117 return "QpSolverType::OSQP";
118 case QpSolverType::NASOQ:
119 return "QpSolverType::NASOQ";
120 case QpSolverType::HPIPM:
121 return "QpSolverType::HPIPM";
122 case QpSolverType::PROXQP:
123 return "QpSolverType::PROXQP";
124 case QpSolverType::QPMAD:
125 return "QpSolverType::QPMAD";
127 QSC_ERROR_STREAM(
"[QpSolverType] Unsupported value: " <<
std::to_string(
static_cast<int>(qp_solver_type)));
148 void setup(
int dim_var,
int dim_eq,
int dim_ineq);
151 void printInfo(
bool verbose =
false,
const std::string & header =
"")
const;
154 void dump(std::ofstream & ofs)
const;
195 using clock =
typename std::conditional<std::chrono::high_resolution_clock::is_steady,
196 std::chrono::high_resolution_clock,
197 std::chrono::steady_clock>
::type;
204 void printInfo(
bool verbose =
false,
const std::string & header =
"")
const;
232 virtual Eigen::VectorXd
solve(
int dim_var,
235 Eigen::Ref<Eigen::MatrixXd> Q,
236 const Eigen::Ref<const Eigen::VectorXd> & c,
237 const Eigen::Ref<const Eigen::MatrixXd> & A,
238 const Eigen::Ref<const Eigen::VectorXd> & b,
239 const Eigen::Ref<const Eigen::MatrixXd> & C,
240 const Eigen::Ref<const Eigen::VectorXd> & d,
241 const Eigen::Ref<const Eigen::VectorXd> & x_min,
242 const Eigen::Ref<const Eigen::VectorXd> & x_max) = 0;
278 virtual Eigen::VectorXd
solve(
int dim_var,
281 Eigen::Ref<Eigen::MatrixXd> Q,
282 const Eigen::Ref<const Eigen::VectorXd> & c,
283 const Eigen::Ref<const Eigen::MatrixXd> & A,
284 const Eigen::Ref<const Eigen::VectorXd> & b,
285 const Eigen::Ref<const Eigen::MatrixXd> & C,
286 const Eigen::Ref<const Eigen::VectorXd> & d,
287 const Eigen::Ref<const Eigen::VectorXd> & x_min,
288 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
291 std::unique_ptr<Eigen::QLDDirect>
qld_;
304 virtual Eigen::VectorXd
solve(
int dim_var,
307 Eigen::Ref<Eigen::MatrixXd> Q,
308 const Eigen::Ref<const Eigen::VectorXd> & c,
309 const Eigen::Ref<const Eigen::MatrixXd> & A,
310 const Eigen::Ref<const Eigen::VectorXd> & b,
311 const Eigen::Ref<const Eigen::MatrixXd> & C,
312 const Eigen::Ref<const Eigen::VectorXd> & d,
313 const Eigen::Ref<const Eigen::VectorXd> & x_min,
314 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
330 virtual Eigen::VectorXd
solve(
int dim_var,
333 Eigen::Ref<Eigen::MatrixXd> Q,
334 const Eigen::Ref<const Eigen::VectorXd> & c,
335 const Eigen::Ref<const Eigen::MatrixXd> & A,
336 const Eigen::Ref<const Eigen::VectorXd> & b,
337 const Eigen::Ref<const Eigen::MatrixXd> & C,
338 const Eigen::Ref<const Eigen::VectorXd> & d,
339 const Eigen::Ref<const Eigen::VectorXd> & x_min,
340 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
356 virtual Eigen::VectorXd
solve(
int dim_var,
359 Eigen::Ref<Eigen::MatrixXd> Q,
360 const Eigen::Ref<const Eigen::VectorXd> & c,
361 const Eigen::Ref<const Eigen::MatrixXd> & A,
362 const Eigen::Ref<const Eigen::VectorXd> & b,
363 const Eigen::Ref<const Eigen::MatrixXd> & C,
364 const Eigen::Ref<const Eigen::VectorXd> & d,
365 const Eigen::Ref<const Eigen::VectorXd> & x_min,
366 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
369 std::unique_ptr<jrl::qp::GoldfarbIdnaniSolver>
jrlqp_;
384 virtual Eigen::VectorXd
solve(
int dim_var,
387 Eigen::Ref<Eigen::MatrixXd> Q,
388 const Eigen::Ref<const Eigen::VectorXd> & c,
389 const Eigen::Ref<const Eigen::MatrixXd> & A,
390 const Eigen::Ref<const Eigen::VectorXd> & b,
391 const Eigen::Ref<const Eigen::MatrixXd> & C,
392 const Eigen::Ref<const Eigen::VectorXd> & d,
393 const Eigen::Ref<const Eigen::VectorXd> & x_min,
394 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
421 virtual Eigen::VectorXd
solve(
int dim_var,
424 Eigen::Ref<Eigen::MatrixXd> Q,
425 const Eigen::Ref<const Eigen::VectorXd> & c,
426 const Eigen::Ref<const Eigen::MatrixXd> & A,
427 const Eigen::Ref<const Eigen::VectorXd> & b,
428 const Eigen::Ref<const Eigen::MatrixXd> & C,
429 const Eigen::Ref<const Eigen::VectorXd> & d,
430 const Eigen::Ref<const Eigen::VectorXd> & x_min,
431 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
441 std::unique_ptr<OsqpEigen::Solver>
osqp_;
464 virtual Eigen::VectorXd
solve(
int dim_var,
467 Eigen::Ref<Eigen::MatrixXd> Q,
468 const Eigen::Ref<const Eigen::VectorXd> & c,
469 const Eigen::Ref<const Eigen::MatrixXd> & A,
470 const Eigen::Ref<const Eigen::VectorXd> & b,
471 const Eigen::Ref<const Eigen::MatrixXd> & C,
472 const Eigen::Ref<const Eigen::VectorXd> & d,
473 const Eigen::Ref<const Eigen::VectorXd> & x_min,
474 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
477 Eigen::SparseMatrix<double, Eigen::ColMajor, int>
Q_sparse_;
478 Eigen::SparseMatrix<double, Eigen::ColMajor, int>
A_sparse_;
494 virtual Eigen::VectorXd
solve(
int dim_var,
497 Eigen::Ref<Eigen::MatrixXd> Q,
498 const Eigen::Ref<const Eigen::VectorXd> & c,
499 const Eigen::Ref<const Eigen::MatrixXd> & A,
500 const Eigen::Ref<const Eigen::VectorXd> & b,
501 const Eigen::Ref<const Eigen::MatrixXd> & C,
502 const Eigen::Ref<const Eigen::VectorXd> & d,
503 const Eigen::Ref<const Eigen::VectorXd> & x_min,
504 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
515 std::unique_ptr<struct d_dense_qp_dim>
qp_dim_;
516 std::unique_ptr<struct d_dense_qp>
qp_;
517 std::unique_ptr<struct d_dense_qp_sol>
qp_sol_;
518 std::unique_ptr<struct d_dense_qp_ipm_arg>
ipm_arg_;
519 std::unique_ptr<struct d_dense_qp_ipm_ws>
ipm_ws_;
540 virtual Eigen::VectorXd
solve(
int dim_var,
543 Eigen::Ref<Eigen::MatrixXd> Q,
544 const Eigen::Ref<const Eigen::VectorXd> & c,
545 const Eigen::Ref<const Eigen::MatrixXd> & A,
546 const Eigen::Ref<const Eigen::VectorXd> & b,
547 const Eigen::Ref<const Eigen::MatrixXd> & C,
548 const Eigen::Ref<const Eigen::VectorXd> & d,
549 const Eigen::Ref<const Eigen::VectorXd> & x_min,
550 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
553 std::unique_ptr<proxsuite::proxqp::dense::QP<double>>
proxqp_;
566 virtual Eigen::VectorXd
solve(
int dim_var,
569 Eigen::Ref<Eigen::MatrixXd> Q,
570 const Eigen::Ref<const Eigen::VectorXd> & c,
571 const Eigen::Ref<const Eigen::MatrixXd> & A,
572 const Eigen::Ref<const Eigen::VectorXd> & b,
573 const Eigen::Ref<const Eigen::MatrixXd> & C,
574 const Eigen::Ref<const Eigen::VectorXd> & d,
575 const Eigen::Ref<const Eigen::VectorXd> & x_min,
576 const Eigen::Ref<const Eigen::VectorXd> & x_max)
override;
Eigen::VectorXd ineq_vec_
Inequality constraint vector (corresponding to in QpSolver::solve.)
Eigen::MatrixXd eq_mat_
Equality constraint matrix (corresponding to in QpSolver::solve.)
Eigen::MatrixXd ineq_mat_
Inequality constraint matrix (corresponding to in QpSolver::solve.)
Eigen::VectorXd obj_vec_
Objective vector (corresponding to in QpSolver::solve.)
int dim_ineq_
Dimension of inequality constraint.
Eigen::VectorXd x_min_
Lower bound (corresponding to in QpSolver::solve.)
void dump(std::ofstream &ofs) const
Dump coefficients.
void printInfo(bool verbose=false, const std::string &header="") const
Print information.
Eigen::MatrixXd obj_mat_
Objective matrix (corresponding to in QpSolver::solve.)
Eigen::VectorXd x_max_
Upper bound (corresponding to in QpSolver::solve.)
void setup(int dim_var, int dim_eq, int dim_ineq)
Setup the coefficients with filling zero.
int dim_eq_
Dimension of equality constraint.
Eigen::VectorXd eq_vec_
Equality constraint vector (corresponding to in QpSolver::solve.)
int dim_var_
Dimension of decision variable.
std::unique_ptr< uint8_t[]> qp_sol_mem_
double bound_limit_
Maximum limits of inequality bounds.
std::unique_ptr< uint8_t[]> qp_mem_
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
std::unique_ptr< uint8_t[]> qp_dim_mem_
std::unique_ptr< uint8_t[]> ipm_arg_mem_
std::unique_ptr< uint8_t[]> ipm_ws_mem_
std::unique_ptr< struct d_dense_qp > qp_
std::unique_ptr< struct d_dense_qp_ipm_arg > ipm_arg_
std::unique_ptr< struct d_dense_qp_ipm_ws > ipm_ws_
std::unique_ptr< struct d_dense_qp_dim > qp_dim_
std::unique_ptr< double[]> opt_x_mem_
QpSolverHpipm()
Constructor.
std::unique_ptr< struct d_dense_qp_sol > qp_sol_
std::unique_ptr< jrl::qp::GoldfarbIdnaniSolver > jrlqp_
QpSolverJrlqp()
Constructor.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
QpSolverLssol()
Constructor.
std::unique_ptr< Eigen::LSSOL_QP > lssol_
Eigen::SparseMatrix< double, Eigen::ColMajor, int > A_sparse_
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
Eigen::SparseMatrix< double, Eigen::ColMajor, int > Q_sparse_
QpSolverNasoq()
Constructor.
Eigen::SparseMatrix< double, Eigen::ColMajor, int > C_with_bound_sparse_
Eigen::SparseMatrix< double > AC_with_bound_sparse_
std::unique_ptr< OsqpEigen::Solver > osqp_
QpSolverOsqp()
Constructor.
Eigen::VectorXd bd_with_bound_min_
Eigen::VectorXd bd_with_bound_max_
Eigen::SparseMatrix< double > Q_sparse_
bool force_initialize_
Whether to initialize each time instead of doing a warm start.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
QpSolverProxqp()
Constructor.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
std::unique_ptr< proxsuite::proxqp::dense::QP< double > > proxqp_
std::unique_ptr< Eigen::QLDDirect > qld_
QpSolverQld()
Constructor.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
QpSolverQpmad()
Constructor.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
std::unique_ptr< qpmad::Solver > qpmad_
QpSolverQpoases()
Constructor.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
std::unique_ptr< qpOASES::SQProblem > qpoases_
bool force_initialize_
Whether to initialize each time instead of doing a warm start.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max) override
Solve QP.
std::unique_ptr< Eigen::QuadProgDense > quadprog_
QpSolverQuadprog()
Constructor.
Virtual class of QP solver.
void printInfo(bool verbose=false, const std::string &header="") const
Print information.
QpSolverType type() const
Get QP solver type.
bool solve_failed_
Whether it failed to solve the QP.
virtual Eigen::VectorXd solve(QpCoeff &qp_coeff)
Solve QP.
QpSolverType type_
QP solver type.
virtual Eigen::VectorXd solve(int dim_var, int dim_eq, int dim_ineq, Eigen::Ref< Eigen::MatrixXd > Q, const Eigen::Ref< const Eigen::VectorXd > &c, const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::VectorXd > &b, const Eigen::Ref< const Eigen::MatrixXd > &C, const Eigen::Ref< const Eigen::VectorXd > &d, const Eigen::Ref< const Eigen::VectorXd > &x_min, const Eigen::Ref< const Eigen::VectorXd > &x_max)=0
Solve QP.
typename std::conditional< std::chrono::high_resolution_clock::is_steady, std::chrono::high_resolution_clock, std::chrono::steady_clock >::type clock
bool solveFailed() const
Get whether it failed to solve the QP.
QpSolverType
QP solver type.
bool isQpSolverEnabled(const QpSolverType &qp_solver_type)
Check whether QP solver is enabled.
std::shared_ptr< QpSolver > allocateQpSolver(const QpSolverType &qp_solver_type)
Allocate the specified QP solver.
QpSolverType getAnyQpSolverType()
Get one QP solver type that is enabled.
QpSolverType strToQpSolverType(const std::string &qp_solver_type)
Convert std::string to QpSolverType.
SolverTemplate< double, Eigen::Dynamic, 1, Eigen::Dynamic > Solver
string to_string(QpSolverType qp_solver_type)