38 value += values.squaredNorm();
84 "OptimizationProblemInterface::finiteCombinedBoundsDimension(): default implementation might be slow.");
97 "OptimizationProblemInterface::finiteCombinedBoundsDimension(): default implementation might be slow.");
121 "OptimizationProblemInterface::computeValuesActiveInequality(): default implementation might be slow.");
123 for (
int i = 0; i < values.size(); ++i)
135 "OptimizationProblemInterface::computeDistanceFiniteCombinedBounds(): default implementation might be slow.");
147 values[idx] = lb -
x;
149 values[idx] = x - ub;
171 "OptimizationProblemInterface::computeDistanceFiniteCombinedBounds(): default implementation might be slow.");
181 lb_finite_bounds(idx) = lb;
182 ub_finite_bounds(idx) = ub;
192 "OptimizationProblemInterface::computeGradientObjective(): default implementation might be slow.");
195 assert(gradient.size() == dim_x);
198 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
206 "OptimizationProblemInterface::computeGradientNonLsqObjective(): default implementation might be slow.");
209 assert(gradient.size() == dim_x);
212 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
220 "OptimizationProblemInterface::computeDenseJacobianLsqObjective(): default implementation might be slow.");
222 if (dim_obj < 1)
return;
224 assert(jacobian.rows() == dim_obj);
225 assert(jacobian.cols() == dim_x);
228 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
238 "OptimizationProblemInterface::computeSparseJacobianLsqObjectiveNNZ(): default implementation might be slow.");
245 "OptimizationProblemInterface::computeSparseJacobianLsqObjectiveStructure(): default implementation might be slow.");
262 "OptimizationProblemInterface::computeSparseJacobianLsqObjectiveValues(): default implementation might be slow.");
267 Eigen::MatrixXd dense_jacob(dim_obj, dim_x);
275 values[nz_idx] = dense_jacob(i, j);
284 "OptimizationProblemInterface::computeSparseJacobianLsqObjective(): default implementation might be slow.");
286 if (dim_obj < 1)
return;
288 Eigen::MatrixXd dense_jacob(dim_obj, dim_x);
290 jacobian = dense_jacob.sparseView();
296 "OptimizationProblemInterface::computeDenseJacobianEqualities(): default implementation might be slow.");
299 assert(jacobian.rows() == dim_eq);
300 assert(jacobian.cols() == dim_x);
304 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
306 diff.computeJacobian(inc, eval, jacobian);
314 "OptimizationProblemInterface::computeSparseJacobianEqualitiesNNZ(): default implementation might be slow.");
321 "OptimizationProblemInterface::computeSparseJacobianEqualitiesStructure(): default implementation might be slow.");
337 "OptimizationProblemInterface::computeSparseJacobianEqualitiesValues(): default implementation might be slow.");
341 Eigen::MatrixXd dense_jacob(dim_eq, dim_x);
349 values[nz_idx] = dense_jacob(i, j);
358 "OptimizationProblemInterface::computeSparseJacobianEqualities(): default implementation might be slow.");
361 Eigen::MatrixXd dense_jacob(dim_eq, dim_x);
363 jacobian = dense_jacob.sparseView();
369 "OptimizationProblemInterface::computeDenseJacobianInequalities(): default implementation might be slow.");
372 assert(jacobian.rows() == dim_ineq);
373 assert(jacobian.cols() == dim_x);
377 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
379 diff.computeJacobian(inc, eval, jacobian);
387 "OptimizationProblemInterface::computeSparseJacobianInequalitiesNNZ(): default implementation might be slow.");
394 "OptimizationProblemInterface::computeSparseJacobianInequalitiesStructure(): default implementation might be slow.");
410 "OptimizationProblemInterface::computeSparseJacobianInequalitiesValues(): default implementation might be slow.");
414 Eigen::MatrixXd dense_jacob(dim_ineq, dim_x);
422 values[nz_idx] = dense_jacob(i, j);
431 "OptimizationProblemInterface::computeSparseJacobianInequalities(): default implementation might be slow.");
434 Eigen::MatrixXd dense_jacob(dim_ineq, dim_x);
436 jacobian = dense_jacob.sparseView();
442 "OptimizationProblemInterface::computeDenseJacobianActiveInequalities(): default implementation might be slow.");
445 assert(jacobian.rows() == dim_ineq);
446 assert(jacobian.cols() == dim_x);
450 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
453 diff.computeJacobian(inc, eval, jacobian);
455 if (weight != 1) jacobian *= weight;
460 "OptimizationProblemInterface::computeSparseJacobianActiveInequalitiesValues(): default implementation might be slow.");
464 Eigen::MatrixXd dense_jacob(dim_ineq, dim_x);
472 values[nz_idx] = dense_jacob(i, j);
481 "OptimizationProblemInterface::computeSparseJacobianActiveInequalities(): default implementation might be slow.");
484 Eigen::MatrixXd dense_jacob(dim_ineq, dim_x);
486 jacobian = dense_jacob.sparseView();
492 const double* multipliers_eq,
const double* multipliers_ineq,
bool active_ineq,
493 double active_ineq_weight)
523 const double* multipliers_eq,
const double* multipliers_ineq,
bool active_ineq,
524 double active_ineq_weight)
553 const double* multipliers_eq,
const double* multipliers_ineq,
bool active_ineq,
554 double active_ineq_weight)
557 "OptimizationProblemInterface::computeSparseJacobiansValues(): default implementation might be slow.");
569 "OptimizationProblemInterface::computeDenseJacobianFiniteCombinedBounds(): default implementation might be slow.");
583 jacobian(row_idx, i) = -weight;
587 jacobian(row_idx, i) = weight;
605 "OptimizationProblemInterface::computeSparseJacobianFiniteCombinedBoundsStructure(): default implementation might be slow.");
613 i_row[jac_row_idx] = jac_row_idx;
614 j_col[jac_row_idx] = i;
632 values[jac_row_idx] = -weight;
636 values[jac_row_idx] = weight;
640 values[jac_row_idx] = 0.0;
650 "OptimizationProblemInterface::computeSparseJacobianFiniteCombinedBounds(): default implementation might be slow.");
666 jacobian.
insert(jac_row_idx, i) = -weight;
670 jacobian.
insert(jac_row_idx, i) = weight;
685 "OptimizationProblemInterface::computeDenseJacobianFiniteCombinedBoundsIdentity(): default implementation might be slow.");
696 jacobian(row_idx, i) = 1;
703 bool inequality,
bool finite_combined_bounds,
bool active_ineq,
double weight_eq,
704 double weight_ineq,
double weight_bounds,
const Eigen::VectorXd* values,
705 const Eigen::VectorXi* col_nnz)
708 "OptimizationProblemInterface::computeCombinedSparseJacobian(): default implementation might be slow.");
734 if (finite_combined_bounds)
737 no_rows += dim_bounds;
741 assert(jacobian.
rows() == no_rows);
742 assert(jacobian.
cols() == no_cols);
754 if (objective_lsq && dim_obj > 0)
758 for (
int k = 0; k < temp_jacob.
outerSize(); ++k)
762 jacobian.
insert(it.row(), it.col()) = it.value();
765 row_offset += dim_obj;
768 if (equality && dim_eq > 0)
772 for (
int k = 0; k < temp_jacob.
outerSize(); ++k)
776 jacobian.
insert(row_offset + it.row(), it.col()) = it.value() * weight_eq;
779 row_offset += dim_eq;
782 if (inequality && dim_ineq > 0)
789 for (
int k = 0; k < temp_jacob.
outerSize(); ++k)
793 jacobian.
insert(row_offset + it.row(), it.col()) = it.value() * weight_ineq;
796 row_offset += dim_ineq;
799 if (finite_combined_bounds && dim_bounds > 0)
803 for (
int k = 0; k < temp_jacob.
outerSize(); ++k)
807 jacobian.
insert(row_offset + it.row(), it.col()) = it.value() * weight_bounds;
816 "OptimizationProblemInterface::computeCombinedSparseJacobiansNNZ(): default implementation might be slow.");
825 bool objective_lsq,
bool equality,
bool inequality)
828 "OptimizationProblemInterface::computeCombinedSparseJacobiansStructure(): default implementation might be slow.");
838 i_row[nz_idx] = row_idx;
851 i_row[nz_idx] = row_idx;
864 i_row[nz_idx] = row_idx;
873 bool inequality,
const double* multipliers_obj,
const double* multipliers_eq,
874 const double* multipliers_ineq)
877 "OptimizationProblemInterface::computeCombinedSparseJacobiansValues(): default implementation might be slow.");
886 Eigen::MatrixXd dense_jacob(dim_obj, dim_x);
889 for (
int i = 0; i < dim_obj; ++i)
893 values[nz_idx] = dense_jacob(i, j);
902 Eigen::MatrixXd dense_jacob(dim_eq, dim_x);
905 for (
int i = 0; i < dim_eq; ++i)
909 values[nz_idx] = dense_jacob(i, j);
918 Eigen::MatrixXd dense_jacob(dim_ineq, dim_x);
921 for (
int i = 0; i < dim_ineq; ++i)
925 values[nz_idx] = dense_jacob(i, j);
934 bool inequality,
const double* multipliers_eq,
935 const double* multipliers_ineq)
938 "OptimizationProblemInterface::computeDenseHessianObjective(): default implementation might be slow.");
944 bool include_finite_bounds,
const Eigen::VectorXi* col_nnz)
947 "OptimizationProblemInterface::computeCombinedSparseJacobian(): default implementation might be slow.");
955 int no_rows = dim_eq + dim_ineq;
957 if (include_finite_bounds)
960 no_rows += dim_bounds;
964 assert(A.
rows() == no_rows);
965 assert(A.
cols() == no_cols);
968 if (col_nnz) A.
reserve(*col_nnz);
982 for (
int k = 0; k < temp_jacob.
outerSize(); ++k)
986 A.
insert(row_offset + it.row(), it.col()) = it.value();
989 row_offset += dim_eq;
996 for (
int k = 0; k < temp_jacob.
outerSize(); ++k)
1000 A.
insert(row_offset + it.row(), it.col()) = it.value();
1003 row_offset += dim_ineq;
1006 if (include_finite_bounds && dim_bounds > 0)
1009 Eigen::MatrixXd temp_jacob_dense(dim_bounds, no_cols);
1012 for (
int k = 0; k < temp_jacob.
outerSize(); ++k)
1016 A.
insert(row_offset + it.row(), it.col()) = it.value();
1023 bool include_finite_bounds)
1027 "OptimizationProblemInterface::computeSparseJacobianTwoSideBoundedLinearFormNNZPerColumn(): default implementation might be slow.");
1035 col_nnz.setConstant(dim_eq + dim_ineq + dim_bounds);
1041 "OptimizationProblemInterface::computeSparseJacobianTwoSideBoundedLinearFormNNZ(): default implementation might be slow.");
1052 bool include_finite_bounds)
1056 "OptimizationProblemInterface::computeSparseJacobianTwoSideBoundedLinearFormStructure(): default implementation might be slow.");
1065 i_row[nz_idx] = row_idx;
1075 i_row[nz_idx] = row_idx;
1081 if (include_finite_bounds)
1090 i_row[nz_idx] = row_idx;
1102 "OptimizationProblemInterface::computeCombinedSparseJacobiansValues(): default implementation might be slow.");
1109 Eigen::MatrixXd dense_jacob_eq(dim_eq, dim_x);
1112 for (
int i = 0; i < dim_eq; ++i)
1116 values[nz_idx] = dense_jacob_eq(i, j);
1122 Eigen::MatrixXd dense_jacob_ineq(dim_ineq, dim_x);
1125 for (
int i = 0; i < dim_ineq; ++i)
1129 values[nz_idx] = dense_jacob_ineq(i, j);
1135 if (include_finite_bounds && dim_bounds > 0)
1137 values.tail(dim_bounds).setOnes();
1142 bool include_finite_bounds)
1148 assert(lbA.size() == dim_eq + dim_ineq + dim_bounds);
1149 assert(ubA.size() == dim_eq + dim_ineq + dim_bounds);
1154 lbA.head(dim_eq) *= -1;
1155 ubA.head(dim_eq) = lbA.head(dim_eq);
1162 ubA.segment(dim_eq, dim_ineq) *= -1;
1168 int idx = dim_eq + dim_ineq;
1188 PRINT_ERROR(
"OptimizationProblemInterface::computeDenseHessianObjective(): NOT_YET_IMPLEMENTED");
1194 "OptimizationProblemInterface::computeDenseHessianObjective(): default implementation might be slow.");
1198 assert(hessian.rows() == dim_x);
1199 assert(hessian.cols() == dim_x);
1203 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
1205 diff.computeHessian(inc, eval, 1, hessian,
nullptr);
1206 if (multiplier != 1.0) hessian *= multiplier;
1212 "OptimizationProblemInterface::computeSparseHessianObjectiveNNZ(): default implementation might be slow.");
1218 bool lower_part_only)
1221 "OptimizationProblemInterface::computeSparseHessianObjectiveStructure(): default implementation might be slow.");
1228 int row_start = lower_part_only ?
col : 0;
1231 i_row[nz_idx] =
row;
1232 j_col[nz_idx] =
col;
1240 "OptimizationProblemInterface::computeSparseHessianObjectiveValues(): default implementation might be slow.");
1245 Eigen::MatrixXd dense_hessian(dim_x, dim_x);
1251 int row_start = lower_part_only ?
col : 0;
1254 values[nz_idx] = dense_hessian(
row,
col);
1259 if (multiplier != 1.0) values *= multiplier;
1265 "OptimizationProblemInterface::computeSparseHessianObjective(): default implementation might be slow.");
1269 Eigen::MatrixXd dense_hessian(dim_x, dim_x);
1271 hessian = dense_hessian.sparseView();
1273 if (multiplier != 1.0) hessian *= multiplier;
1277 const Eigen::VectorXi* col_nnz,
bool upper_part_only)
1280 "OptimizationProblemInterface::computeSparseHessiansValues(): default implementation might be slow.");
1288 if (upper_part_only)
1309 "OptimizationProblemInterface::computeSparseHessianLagrangianNNZperCol(): default implementation might be slow.");
1313 if (upper_part_only)
1315 for (
int i = 0; i < col_nnz.size(); ++i)
1327 "OptimizationProblemInterface::computeDenseHessianEqualities(): default implementation might be slow.");
1331 if (dim_eq == 0)
return;
1333 assert(hessian.rows() == dim_x);
1334 assert(hessian.cols() == dim_x);
1338 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
1340 diff.computeHessian(inc, eval, dim_eq, hessian, multipliers);
1346 "OptimizationProblemInterface::computeSparseHessianEqualitiesNNZ(): default implementation might be slow.");
1352 bool lower_part_only)
1355 "OptimizationProblemInterface::computeSparseHessianEqualitiesStructure(): default implementation might be slow.");
1360 int row_start = lower_part_only ?
col : 0;
1363 i_row[nz_idx] =
row;
1364 j_col[nz_idx] =
col;
1370 bool lower_part_only)
1373 "OptimizationProblemInterface::computeSparseHessianEqualitiesValues(): default implementation might be slow.");
1376 Eigen::MatrixXd dense_hessian(dim_x, dim_x);
1382 int row_start = lower_part_only ?
col : 0;
1385 values[nz_idx] = dense_hessian(
row,
col);
1394 "OptimizationProblemInterface::computeSparseHessianEqualities(): default implementation might be slow.");
1396 Eigen::MatrixXd dense_hessian(dim_x, dim_x);
1398 hessian = dense_hessian.sparseView();
1404 "OptimizationProblemInterface::computeDenseHessianInequalities(): default implementation might be slow.");
1408 if (dim_ineq == 0)
return;
1410 assert(hessian.rows() == dim_x);
1411 assert(hessian.cols() == dim_x);
1415 auto inc = [
this](
int idx,
double inc) {
applyIncrement(idx, inc); };
1417 diff.computeHessian(inc, eval, dim_ineq, hessian, multipliers);
1423 "OptimizationProblemInterface::computeSparseHessianInequalitiesNNZ(): default implementation might be slow.");
1429 bool lower_part_only)
1432 "OptimizationProblemInterface::computeSparseHessianInequalitiesStructure(): default implementation might be slow.");
1437 int row_start = lower_part_only ?
col : 0;
1440 i_row[nz_idx] =
row;
1441 j_col[nz_idx] =
col;
1447 bool lower_part_only)
1450 "OptimizationProblemInterface::computeSparseHessianInequalitiesValues(): default implementation might be slow.");
1453 Eigen::MatrixXd dense_hessian(dim_x, dim_x);
1459 int row_start = lower_part_only ?
col : 0;
1462 values[nz_idx] = dense_hessian(
row,
col);
1471 "OptimizationProblemInterface::computeSparseHessianInequalities(): default implementation might be slow.");
1473 Eigen::MatrixXd dense_hessian(dim_x, dim_x);
1475 hessian = dense_hessian.sparseView();
1500 const double* multipliers_ineq)
1525 const double* multipliers_eq,
const double* multipliers_ineq)
1536 "OptimizationProblemInterface::computeSparseHessiansNNZ(): default implementation might be slow.");
1545 bool lower_part_only)
1548 "OptimizationProblemInterface::computeSparseHessiansValues(): default implementation might be slow.");
1556 const double* multipliers_eq,
const double* multipliers_ineq,
bool lower_part_only)
1559 "OptimizationProblemInterface::computeSparseHessiansValues(): default implementation might be slow.");
1566 const double* multipliers_eq,
const double* multipliers_ineq,
1567 const Eigen::VectorXi* col_nnz,
bool upper_part_only)
1570 "OptimizationProblemInterface::computeSparseHessiansValues(): default implementation might be slow.");
1585 if (upper_part_only)
1590 if (dim_eq > 0 && dim_ineq > 0)
1592 H_temp = H_obj + H_eq + H_ineq;
1594 else if (dim_eq > 0)
1596 H_temp = H_obj + H_eq;
1598 else if (dim_ineq > 0)
1600 H_temp = H_obj + H_ineq;
1613 if (dim_eq > 0 && dim_ineq > 0)
1615 H = H_obj + H_eq + H_ineq;
1617 else if (dim_eq > 0)
1621 else if (dim_ineq > 0)
1635 "OptimizationProblemInterface::computeSparseHessianLagrangianNNZperCol(): default implementation might be slow.");
1639 if (upper_part_only)
1641 for (
int i = 0; i < col_nnz.size(); ++i)
1653 const Eigen::VectorXi* col_nnz_A,
bool upper_part_only_H)
1661 bool include_finite_bounds,
const Eigen::VectorXi* col_nnz_H,
const Eigen::VectorXi* col_nnz_A,
bool upper_part_only_H)
virtual double computeValueObjective()
virtual void computeSparseJacobianTwoSideBoundedLinearFormValues(Eigen::Ref< Eigen::VectorXd > values, bool include_finite_bounds)
virtual double getUpperBound(int idx)=0
Return specific upper bound of a parameter.
virtual void computeDenseHessians(Eigen::Ref< Eigen::MatrixXd > hessian_obj, Eigen::Ref< Eigen::MatrixXd > hessian_eq, Eigen::Ref< Eigen::MatrixXd > hessian_ineq, double multiplier_obj=1.0, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr)
virtual int finiteCombinedBoundsDimension()
Dimension of the set of finite bounds (combined such that each ub and lb component define a single di...
virtual void computeSparseHessiansStructure(Eigen::Ref< Eigen::VectorXi > i_row_obj, Eigen::Ref< Eigen::VectorXi > j_col_obj, Eigen::Ref< Eigen::VectorXi > i_row_eq, Eigen::Ref< Eigen::VectorXi > j_col_eq, Eigen::Ref< Eigen::VectorXi > i_row_ineq, Eigen::Ref< Eigen::VectorXi > j_col_ineq, bool lower_part_only=false)
virtual void computeSparseJacobianInequalities(Eigen::SparseMatrix< double > &jacobian, const double *multipliers=nullptr)
#define PRINT_DEBUG_COND_ONCE(cond, msg)
Print msg-stream only if cond == true, only once and only if project is compiled in Debug-mode...
virtual void computeSparseJacobianLsqObjectiveStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col)
bool _warn_if_not_specialized
virtual void computeBoundsForTwoSideBoundedLinearForm(Eigen::Ref< Eigen::VectorXd > lbA, Eigen::Ref< Eigen::VectorXd > ubA, bool include_finite_bounds)
Compute lower and upper bounds lbA and ubA for the linear form lbA <= A x <= ubA. ...
virtual void setBounds(const Eigen::Ref< const Eigen::VectorXd > &lb, const Eigen::Ref< const Eigen::VectorXd > &ub)
Set lower and upper bound vector.
virtual int getInequalityDimension()=0
Total dimension of general inequality constraints.
virtual void computeDenseJacobianEqualities(Eigen::Ref< Eigen::MatrixXd > jacobian, const double *multipliers=nullptr)
Compute the equality constraint Jacobian Jceq(x) for the current parameter set.
virtual void setParameterValue(int idx, double x)=0
Set specific value of the parameter vector.
static void jacobian(IncFun inc_fun, EvalFun eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian)
Compute Jacobian of a desired function.
A matrix or vector expression mapping an existing array of data.
virtual int finiteBoundsDimension()
Dimension of the set of finite bounds (individual bounds ub and lb)
virtual void computeSparseHessiansNNZ(int &nnz_obj, int &nnz_eq, int &nnz_ineq, bool lower_part_only=false)
virtual void computeSparseHessians(Eigen::SparseMatrix< double > &hessian_obj, Eigen::SparseMatrix< double > &hessian_eq, Eigen::SparseMatrix< double > &hessian_ineq, double multiplier_obj=1.0, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr)
EIGEN_DEVICE_FUNC ColXpr col(Index i)
This is the const version of col().
virtual void computeSparseJacobianTwoSideBoundedLinearFormStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col, bool include_finite_bounds)
virtual int computeSparseHessianObjectiveNNZ(bool lower_part_only=false)
virtual void computeSparseJacobianFiniteCombinedBounds(Eigen::SparseMatrix< double > &jacobian, double weight=1.0)
virtual void computeDenseJacobianFiniteCombinedBounds(Eigen::Ref< Eigen::MatrixXd > jacobian, double weight=1.0)
Compute the Jacobian for finite combined bounds.
virtual void computeDenseJacobianActiveInequalities(Eigen::Ref< Eigen::MatrixXd > jacobian, double weight=1.0)
Compute the Jacobian Jc(x) with non-zeros for active constraints c(x)>= 0 and zeros for inactive ones...
virtual void computeDistanceFiniteCombinedBounds(Eigen::Ref< Eigen::VectorXd > values)
Compute the distance to finite bound values (combined lower and upper)
virtual void computeSparseHessianEqualitiesValues(Eigen::Ref< Eigen::VectorXd > values, const double *multipliers=nullptr, bool lower_part_only=false)
virtual int computeSparseJacobianInequalitiesNNZ()
virtual void computeCombinedSparseJacobiansValues(Eigen::Ref< Eigen::VectorXd > values, bool objective_lsq=true, bool equality=true, bool inequality=true, const double *multipliers_obj=nullptr, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr)
virtual void computeSparseJacobianEqualities(Eigen::SparseMatrix< double > &jacobian, const double *multipliers=nullptr)
virtual void computeSparseJacobianFiniteCombinedBoundsStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col)
virtual int getEqualityDimension()=0
Total dimension of equality constraints.
virtual void computeSparseJacobianTwoSideBoundedLinearFormAndHessianObjective(Eigen::SparseMatrix< double, Eigen::ColMajor, long long > &H, Eigen::SparseMatrix< double, Eigen::ColMajor, long long > &A, bool include_finite_bounds, const Eigen::VectorXi *col_nnz_H, const Eigen::VectorXi *col_nnz_A, bool upper_part_only_H)
virtual void computeSparseJacobianLsqObjectiveValues(Eigen::Ref< Eigen::VectorXd > values, const double *multipliers=nullptr)
virtual void computeSparseJacobianEqualitiesValues(Eigen::Ref< Eigen::VectorXd > values, const double *multipliers=nullptr)
virtual void computeSparseJacobianLsqObjective(Eigen::SparseMatrix< double > &jacobian, const double *multipliers=nullptr)
virtual void computeDenseJacobianFiniteCombinedBoundsIdentity(Eigen::Ref< Eigen::MatrixXd > jacobian)
Compute the Jacobian for finite combined bounds.
virtual void applyIncrement(const Eigen::Ref< const Eigen::VectorXd > &increment)
Apply increment to the current parameter set.
virtual void computeSparseHessianObjectiveStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col, bool lower_part_only=false)
MatrixType A(a, *n, *n, *lda)
virtual void computeSparseHessianInequalitiesValues(Eigen::Ref< Eigen::VectorXd > values, const double *multipliers=nullptr, bool lower_part_only=false)
virtual void setLowerBound(int idx, double lb)=0
Set specific lower bound of a parameter.
virtual int computeCombinedSparseJacobiansNNZ(bool objective_lsq=true, bool equality=true, bool inequality=true)
virtual int getLsqObjectiveDimension()=0
Total dimension of least-squares objective function terms.
virtual double getParameterValue(int idx)=0
Return specific value of the parameter vector.
#define PRINT_WARNING_COND_ONCE(cond, msg)
Print msg-stream only if cond == true, only once.
virtual void computeSparseHessianObjective(Eigen::SparseMatrix< double > &hessian, double multiplier=1.0)
virtual int computeSparseHessianInequalitiesNNZ(bool lower_part_only=false)
virtual void setUpperBound(int idx, double ub)=0
Set specific upper bound of a parameter.
Finite differences via central differences.
virtual void computeSparseHessianLagrangianNNZperCol(Eigen::Ref< Eigen::VectorXi > col_nnz, bool upper_part_only)
virtual void computeLowerAndUpperBoundDiff(Eigen::Ref< Eigen::VectorXd > lb_minus_x, Eigen::Ref< Eigen::VectorXd > ub_minus_x)
Compute the distance between parameters and bounds.
virtual int computeSparseHessianEqualitiesNNZ(bool lower_part_only=false)
virtual void computeValuesActiveInequality(Eigen::Ref< Eigen::VectorXd > values, double weight=1.0)
Compute the values of the active inequality constraints (elementwise max(0, c(x))) ...
virtual void computeSparseJacobianTwoSideBoundedLinearFormAndHessianLagrangian(Eigen::SparseMatrix< double, Eigen::ColMajor, long long > &H, const double *multipliers_eq, const double *multipliers_ineq, Eigen::SparseMatrix< double, Eigen::ColMajor, long long > &A, bool include_finite_bounds, const Eigen::VectorXi *col_nnz_H=nullptr, const Eigen::VectorXi *col_nnz_A=nullptr, bool upper_part_only_H=false)
Compute the Jacobian and Hessian of the lagrangian.
virtual void computeSparseJacobianInequalitiesStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col)
virtual void computeSparseJacobiansNNZ(int &nnz_lsq_obj, int &nnz_eq, int &nnz_ineq)
virtual void computeSparseJacobianEqualitiesStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col)
virtual void computeSparseHessianObjectiveValues(Eigen::Ref< Eigen::VectorXd > values, double multiplier=1.0, bool lower_part_only=false)
virtual void computeSparseJacobians(Eigen::SparseMatrix< double > &jacobian_lsq_obj, Eigen::SparseMatrix< double > &jacobian_eq, Eigen::SparseMatrix< double > &jacobian_ineq, const double *multipliers_lsq_obj=nullptr, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr, bool active_ineq=false, double active_ineq_weight=1.0)
Scalar & insert(Index row, Index col)
virtual void getParameterVector(Eigen::Ref< Eigen::VectorXd > x)
Return deep copy of the complete parameter vector.
virtual double computeValueNonLsqObjective()=0
virtual void computeSparseHessianObjectiveLL(Eigen::SparseMatrix< double, Eigen::ColMajor, long long > &H, const Eigen::VectorXi *col_nnz=nullptr, bool upper_part_only=false)
virtual void computeValuesEquality(Eigen::Ref< Eigen::VectorXd > values)=0
Compute the equality constraint values ceq(x) for the current parameter set.
virtual void computeSparseJacobianInequalitiesValues(Eigen::Ref< Eigen::VectorXd > values, const double *multipliers=nullptr)
constexpr const double CORBO_INF_DBL
Representation for infinity (double version)
virtual int computeSparseJacobianEqualitiesNNZ()
virtual void getBounds(Eigen::Ref< Eigen::VectorXd > lb, Eigen::Ref< Eigen::VectorXd > ub)
Get lower and upper bound vector.
virtual double getLowerBound(int idx)=0
Return specific lower bound value of a parameter.
virtual int computeSparseJacobianLsqObjectiveNNZ()
virtual void computeValuesInequality(Eigen::Ref< Eigen::VectorXd > values)=0
Compute the inequality constraint values c(x) for the current parameter set.
virtual int computeSparseJacobianTwoSideBoundedLinearFormNNZ(bool include_finite_bounds)
A matrix or vector expression mapping an existing expression.
virtual void computeGradientNonLsqObjective(Eigen::Ref< Eigen::VectorXd > gradient)
ConstSelfAdjointViewReturnType< UpLo >::Type selfadjointView() const
virtual void computeSparseJacobianFiniteCombinedBoundsValues(Eigen::Ref< Eigen::VectorXd > values, double weight=1.0)
virtual void computeGradientObjectiveAndCombinedSparseJacobiansValues(Eigen::Ref< Eigen::VectorXd > gradient, Eigen::Ref< Eigen::VectorXd > jac_values, bool equality=true, bool inequality=true, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr)
virtual void computeSparseJacobianTwoSideBoundedLinearFormNNZPerColumn(Eigen::Ref< Eigen::VectorXi > col_nnz, bool include_finite_bounds)
virtual void computeSparseJacobianActiveInequalities(Eigen::SparseMatrix< double > &jacobian, double weight=1.0)
virtual int getNonLsqObjectiveDimension()=0
Get dimension of the objective (should be zero or one)
virtual void computeDenseHessianInequalities(Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr)
virtual void computeSparseJacobiansStructure(Eigen::Ref< Eigen::VectorXi > i_row_obj, Eigen::Ref< Eigen::VectorXi > j_col_obj, Eigen::Ref< Eigen::VectorXi > i_row_eq, Eigen::Ref< Eigen::VectorXi > j_col_eq, Eigen::Ref< Eigen::VectorXi > i_row_ineq, Eigen::Ref< Eigen::VectorXi > j_col_ineq)
virtual void computeSparseJacobiansValues(Eigen::Ref< Eigen::VectorXd > values_obj, Eigen::Ref< Eigen::VectorXd > values_eq, Eigen::Ref< Eigen::VectorXd > values_ineq, const double *multipliers_obj=nullptr, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr, bool active_ineq=false, double active_ineq_weight=1.0)
virtual void computeSparseHessiansValues(Eigen::Ref< Eigen::VectorXd > values_obj, Eigen::Ref< Eigen::VectorXd > values_eq, Eigen::Ref< Eigen::VectorXd > values_ineq, double multiplier_obj=1.0, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr, bool lower_part_only=false)
virtual int computeSparseJacobianFiniteCombinedBoundsNNZ()
virtual void computeDenseHessianEqualities(Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr)
virtual void computeSparseHessianLagrangian(Eigen::SparseMatrix< double, Eigen::ColMajor, long long > &H, const double *multipliers_eq, const double *multipliers_ineq, const Eigen::VectorXi *col_nnz=nullptr, bool upper_part_only=false)
Compute the hessian of the lagrangian L(x) = f(x) + lambda1 * c(x) + lambda2 * ceq(x) ...
virtual void getParametersAndBoundsFinite(Eigen::Ref< Eigen::VectorXd > lb_finite_bounds, Eigen::Ref< Eigen::VectorXd > ub_finite_bounds, Eigen::Ref< Eigen::VectorXd > x_finite_bounds)
Return bound and parameter vectors only for finite boudns.
virtual void computeValuesLsqObjective(Eigen::Ref< Eigen::VectorXd > values)=0
Compute the objective function values f(x) for the current parameter set.
virtual int getObjectiveDimension()=0
Get dimension of the objective (should be zero or one, includes Lsq objectives if present) ...
EIGEN_DEVICE_FUNC RowXpr row(Index i)
This is the const version of row(). */.
void reserve(Index reserveSize)
virtual void computeSparseHessianEqualitiesStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col, bool lower_part_only=false)
virtual int getParameterDimension()=0
Effictive dimension of the optimization parameter set (changeable, non-fixed part) ...
virtual void computeCombinedSparseJacobiansStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col, bool objective_lsq=true, bool equality=true, bool inequality=true)
virtual void computeDenseJacobianInequalities(Eigen::Ref< Eigen::MatrixXd > jacobian, const double *multipliers=nullptr)
Compute the inequality constraint Jacobian Jc(x) for the current parameter set.
virtual void computeSparseHessianInequalitiesStructure(Eigen::Ref< Eigen::VectorXi > i_row, Eigen::Ref< Eigen::VectorXi > j_col, bool lower_part_only=false)
virtual void computeSparseHessianObjectiveNNZperCol(Eigen::Ref< Eigen::VectorXi > col_nnz, bool upper_part_only=false)
virtual void setParameterVector(const Eigen::Ref< const Eigen::VectorXd > &x)
Set complete parameter vector.
virtual bool checkIfAllUnfixedParam(std::function< bool(double, int)> fun)
Check if a function taking the parameter value and unfixed-idx is true for all unfixed parameter valu...
virtual void computeDenseHessianObjective(const Eigen::Ref< const Eigen::MatrixXd > &jacobian, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr, bool jacob_scaled=true)
Compute the objective Hessian Hf(x) for the current parameter set.
virtual void computeSparseJacobianTwoSideBoundedLinearForm(Eigen::SparseMatrix< double, Eigen::ColMajor, long long > &A, bool include_finite_bounds, const Eigen::VectorXi *col_nnz=nullptr)
Compute the jacobian A for the linear form lbA <= A x <= lbB.
virtual void computeDenseJacobianLsqObjective(Eigen::Ref< Eigen::MatrixXd > jacobian, const double *multipliers=nullptr)
Compute the objective Jacobian Jf(x) for the current parameter set.
virtual void computeSparseHessianEqualities(Eigen::SparseMatrix< double > &hessian, const double *multipliers=nullptr)
virtual void computeGradientObjective(Eigen::Ref< Eigen::VectorXd > gradient)
virtual void computeSparseHessianInequalities(Eigen::SparseMatrix< double > &hessian, const double *multipliers=nullptr)
virtual void computeDenseJacobians(Eigen::Ref< Eigen::VectorXd > gradient_non_lsq_obj, Eigen::Ref< Eigen::MatrixXd > jacobian_lsq_obj, Eigen::Ref< Eigen::MatrixXd > jacobian_eq, Eigen::Ref< Eigen::MatrixXd > jacobian_ineq, const double *multipliers_lsq_obj=nullptr, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr, bool active_ineq=false, double active_ineq_weight=1.0)
Compute the objective and constraint Jacobians at once.
#define PRINT_ERROR(msg)
Print msg-stream as error msg.
virtual void computeSparseJacobianActiveInequalitiesValues(Eigen::Ref< Eigen::VectorXd > values, double weight=1.0)
virtual void computeCombinedSparseJacobian(Eigen::SparseMatrix< double > &jacobian, bool objective_lsq, bool equality, bool inequality, bool finite_combined_bounds, bool active_ineq=false, double weight_eq=1.0, double weight_ineq=1.0, double weight_bounds=1.0, const Eigen::VectorXd *values=nullptr, const Eigen::VectorXi *col_nnz=nullptr)