27 #ifdef QPMAD_ENABLE_TRACING 54 return (
solve( primal, H, h,
55 Eigen::VectorXd(), Eigen::VectorXd(),
69 return (
solve( primal, H, h,
81 return (
solve( primal, H, h,
83 Eigen::MatrixXd(), Eigen::VectorXd(), Eigen::VectorXd(),
SolverParameters()));
98 QPMAD_TRACE(std::setprecision(std::numeric_limits<double>::digits10));
197 double ctr_i_dot_primal_step_direction;
216 if (ctr_i_dot_primal_step_direction < -param.
tolerance_)
274 double chosen_ctr_dot_primal_step_direction = 0.0;
288 chosen_ctr_dot_primal_step_direction =
298 #ifdef QPMAD_ENABLE_TRACING 308 double dual_step_length = std::numeric_limits<double>::infinity();
314 if (dual_step_length_i < dual_step_length)
316 dual_step_length = dual_step_length_i;
317 dual_blocking_index = i;
323 #ifdef QPMAD_ENABLE_TRACING 337 && (std::abs(chosen_ctr_dot_primal_step_direction) > param.
tolerance_) )
342 QPMAD_TRACE(
"||| Primal step length = " << step_length);
343 QPMAD_TRACE(
"||| Dual step length = " << dual_step_length);
347 bool partial_step =
false;
349 && (dual_step_length >= 0.0),
350 "Non-negative step lengths expected.");
351 if (dual_step_length <= step_length)
353 step_length = dual_step_length;
389 chosen_ctr_dot_primal_step_direction =
398 QPMAD_UTILS_THROW(
"Failed to add an inequality constraint -- is this possible?");
421 chosen_ctr_dot_primal_step_direction = 0.0;
433 chosen_ctr_dot_primal_step_direction =
448 QPMAD_TRACE(
"||| Dual step length = " << dual_step_length);
470 chosen_ctr_dot_primal_step_direction =
477 #ifdef QPMAD_ENABLE_TRACING 494 return(return_status);
518 template <
class t_MatrixType>
540 const double tolerance)
581 const double ctr_i_dot_primal)
583 double ctr_violation_i = ctr_i_dot_primal - lb_i;
591 ctr_violation_i = ctr_i_dot_primal - ub_i;
601 template <
class t_VectorType,
604 const t_VectorType & primal_step_direction,
605 const t_MatrixType & A)
const
#define QPMAD_UTILS_THROW(s)
bool hasEmptySpace() const
double computeObjective(const Eigen::MatrixXd &H, const Eigen::VectorXd &h, const Eigen::VectorXd &primal)
ReturnStatus solve(QPVector &primal, QPMatrix &H, const QPVector &h, const QPVector &lb, const QPVector &ub)
void initialize(const MatrixIndex max_size)
QPVector general_ctr_dot_primal_
#define QPMAD_TRACE(info)
MatrixIndex general_constraint_index_
void printActiveSet(const ActiveSet &active_set, const std::vector< ConstraintStatus::Status > &constraints_status, const Eigen::VectorXd &dual)
FactorizationData factorization_data_
void chooseConstraint(const QPVector &primal, const QPVector &lb, const QPVector &ub, const QPMatrix &A, const QPVector &Alb, const QPVector &Aub, const double tolerance)
QPVector dual_step_direction_
ReturnStatus solve(QPVector &primal, QPMatrix &H, const QPVector &h, const QPVector &lb, const QPVector &ub, const QPMatrix &A, const QPVector &Alb, const QPVector &Aub, const SolverParameters ¶m)
Eigen::Matrix< double, Eigen::Dynamic, 1 > QPVector
MatrixIndex num_inequalities_
void initializeMachineryLazy(const t_MatrixType &H)
static void compute(t_MatrixType &M)
void checkLagrangeMultipliers(const Eigen::MatrixXd &H, const Eigen::VectorXd &h, const Eigen::VectorXd &primal, const Eigen::MatrixXd &A, const ActiveSet &active_set, const MatrixIndex &num_simple_bounds, const std::vector< ConstraintStatus::Status > &constraints_status, const Eigen::VectorXd &dual, const Eigen::VectorXd &dual_direction=Eigen::VectorXd())
ReturnStatus solve(QPVector &primal, QPMatrix &H, const QPVector &h, const QPMatrix &A, const QPVector &Alb, const QPVector &Aub)
void downdate(const MatrixIndex R_col_index, const MatrixIndex R_cols)
void updateStepsAfterPartialStep(t_VectorType0 &primal_step_direction, t_VectorType1 &dual_step_direction, const ActiveSet &active_set)
ReturnStatus solve(QPVector &primal, QPMatrix &H, const QPVector &h, const QPVector &lb, const QPVector &ub, const QPMatrix &A, const QPVector &Alb, const QPVector &Aub)
void addEquality(const MatrixIndex index)
static void solve(t_OutputVectorType &x, t_InputMatrixType0 &L, t_InputMatrixType1 &v)
void addInequality(const MatrixIndex index)
QPVector primal_step_direction_
MatrixIndex getIndex(const MatrixIndex index) const
void updateStepsAfterPureDualStep(t_VectorType0 &primal_step_direction, t_VectorType1 &dual_step_direction, const ActiveSet &active_set)
bool machinery_initialized_
MatrixIndex num_constraints_
HessianType hessian_type_
bool update(const MatrixIndex R_col, const bool is_simple, const double tolerance)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > QPMatrix
#define QPMAD_UTILS_ASSERT(condition, message)
std::vector< ConstraintStatus::Status > constraints_status_
MatrixIndex num_equalities_
void initialize(const t_MatrixType &H, const MatrixIndex primal_size)
void removeInequality(const MatrixIndex index)
ChosenConstraint chosen_ctr_
void computeEqualityPrimalStep(t_VectorType &step_direction, const MatrixIndex simple_bound_index, const MatrixIndex active_set_size)
void computeInequalityDualStep(t_VectorType &dual_step_direction, const ChosenConstraint &chosen_ctr, const t_MatrixType &A, const ActiveSet &active_set)
void dropElementWithoutResize(t_VectorType &vector, const MatrixIndex index, const MatrixIndex size)
void computeInequalityPrimalStep(t_VectorType0 &primal_step_direction, const ActiveSet &active_set)
void checkConstraintViolation(const MatrixIndex i, const double lb_i, const double ub_i, const double ctr_i_dot_primal)
double getConstraintDotPrimalStepDirection(const t_VectorType &primal_step_direction, const t_MatrixType &A) const