64 constexpr
const double delta = 1e-9;
65 constexpr
const double neg2delta = -2 * delta;
66 constexpr
const double scalar = 1.0 / (2 * delta);
78 vertex->
plus(i, delta);
81 vertex->
plus(i, neg2delta);
83 block_jacobian.col(col_idx) = scalar * (values2 - values1);
85 vertex->
plus(i, delta);
94 for (
int i = 0; i <
getDimension(); ++i) block_jacobian.row(i) *= multipliers[i];
107 if (isLinear())
return;
114 double scalar = 1.0 / delta;
115 if (weight != 1.0) scalar *= weight;
123 computeJacobian(vtx_idx_i, jacobian1, multipliers);
130 vertex_j->
plus(j, delta);
132 computeJacobian(vtx_idx_i, jacobian2);
136 for (
int val_idx = 0; val_idx <
getDimension(); ++val_idx)
137 block_hessian_ij.col(param_idx_j) += scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - jacobian1.row(val_idx)).transpose();
141 for (
int val_idx = 0; val_idx <
getDimension(); ++val_idx)
142 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - jacobian1.row(val_idx)).transpose();
144 vertex_j->
plus(j, -delta);
163 if (isLinear())
return;
170 double scalar = 1.0 / delta;
171 if (weight != 1.0) scalar *= weight;
183 vertex_j->
plus(j, delta);
185 computeJacobian(vtx_idx_i, jacobian2);
189 for (
int val_idx = 0; val_idx <
getDimension(); ++val_idx)
190 block_hessian_ij.col(param_idx_j) +=
191 scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
195 for (
int val_idx = 0; val_idx <
getDimension(); ++val_idx)
196 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
198 vertex_j->
plus(j, -delta);
217 if (isLinear())
return;
224 double scalar = 1.0 / delta;
225 if (weight != 1.0) scalar *= weight;
237 vertex_j->
plus(j, delta);
239 computeJacobian(vtx_idx_i, jacobian2);
243 block_hessian_ij.col(param_idx_j) = scalar * multipliers[0] * (jacobian2.row(0) - block_jacobian_i.row(0)).transpose();
244 for (
int val_idx = 1; val_idx <
getDimension(); ++val_idx)
245 block_hessian_ij.col(param_idx_j) +=
246 scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
250 block_hessian_ij.col(param_idx_j) = scalar * (jacobian2.row(0) - block_jacobian_i.row(0)).transpose();
251 for (
int val_idx = 1; val_idx <
getDimension(); ++val_idx)
252 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
254 vertex_j->
plus(j, -delta);
266 assert(block_jacobian.rows() == getObjectiveDimension());
270 constexpr
const double delta = 1e-9;
271 constexpr
const double neg2delta = -2 * delta;
272 constexpr
const double scalar = 1.0 / (2 * delta);
276 Eigen::VectorXd values1(getObjectiveDimension());
277 Eigen::VectorXd values2(getObjectiveDimension());
284 vertex->
plus(i, delta);
286 computeObjectiveValues(values2);
288 vertex->
plus(i, neg2delta);
290 computeObjectiveValues(values1);
291 block_jacobian.col(col_idx) = scalar * (values2 - values1);
293 vertex->
plus(i, delta);
302 for (
int i = 0; i < getObjectiveDimension(); ++i) block_jacobian.row(i) *= multipliers[i];
310 assert(block_jacobian.rows() == getEqualityDimension());
314 constexpr
const double delta = 1e-9;
315 constexpr
const double neg2delta = -2 * delta;
316 constexpr
const double scalar = 1.0 / (2 * delta);
320 Eigen::VectorXd values1(getEqualityDimension());
321 Eigen::VectorXd values2(getEqualityDimension());
328 vertex->
plus(i, delta);
330 computeEqualityValues(values2);
332 vertex->
plus(i, neg2delta);
334 computeEqualityValues(values1);
335 block_jacobian.col(col_idx) = scalar * (values2 - values1);
337 vertex->
plus(i, delta);
346 for (
int i = 0; i < getEqualityDimension(); ++i) block_jacobian.row(i) *= multipliers[i];
351 if (
getNumVertices() == 0 || getInequalityDimension() < 1)
return;
354 assert(block_jacobian.rows() == getInequalityDimension());
358 constexpr
const double delta = 1e-9;
359 constexpr
const double neg2delta = -2 * delta;
360 constexpr
const double scalar = 1.0 / (2 * delta);
364 Eigen::VectorXd values1(getInequalityDimension());
365 Eigen::VectorXd values2(getInequalityDimension());
372 vertex->
plus(i, delta);
374 computeInequalityValues(values2);
376 vertex->
plus(i, neg2delta);
378 computeInequalityValues(values1);
379 block_jacobian.col(col_idx) = scalar * (values2 - values1);
381 vertex->
plus(i, delta);
390 for (
int i = 0; i < getInequalityDimension(); ++i) block_jacobian.row(i) *= multipliers[i];
396 const double* ineq_multipliers)
400 int obj_dim = getObjectiveDimension();
401 int eq_dim = getEqualityDimension();
402 int ineq_dim = getInequalityDimension();
405 assert(obj_jacobian.rows() == obj_dim);
407 assert(eq_jacobian.rows() == eq_dim);
409 assert(ineq_jacobian.rows() == ineq_dim);
412 constexpr
const double delta = 1e-9;
413 constexpr
const double neg2delta = -2 * delta;
414 constexpr
const double scalar = 1.0 / (2 * delta);
418 Eigen::VectorXd obj_values1(obj_dim);
419 Eigen::VectorXd obj_values2(obj_dim);
420 Eigen::VectorXd eq_values1(eq_dim);
421 Eigen::VectorXd eq_values2(eq_dim);
422 Eigen::VectorXd ineq_values1(ineq_dim);
423 Eigen::VectorXd ineq_values2(ineq_dim);
430 vertex->
plus(i, delta);
432 if (obj_dim > 0) computeObjectiveValues(obj_values2);
433 if (eq_dim > 0) computeEqualityValues(eq_values2);
434 if (ineq_dim > 0) computeInequalityValues(ineq_values2);
436 vertex->
plus(i, neg2delta);
438 if (obj_dim > 0) computeObjectiveValues(obj_values1);
439 if (eq_dim > 0) computeEqualityValues(eq_values1);
440 if (ineq_dim > 0) computeInequalityValues(ineq_values1);
442 if (obj_dim > 0) obj_jacobian.col(col_idx) = scalar * (obj_values2 - obj_values1);
443 if (eq_dim > 0) eq_jacobian.col(col_idx) = scalar * (eq_values2 - eq_values1);
444 if (ineq_dim > 0) ineq_jacobian.col(col_idx) = scalar * (ineq_values2 - ineq_values1);
446 vertex->
plus(i, delta);
452 if (obj_multipliers && obj_dim > 0)
454 for (
int i = 0; i < obj_dim; ++i) obj_jacobian.row(i) *= obj_multipliers[i];
456 if (eq_multipliers && eq_dim > 0)
458 for (
int i = 0; i < eq_dim; ++i) eq_jacobian.row(i) *= eq_multipliers[i];
460 if (ineq_multipliers && ineq_dim > 0)
462 for (
int i = 0; i < ineq_dim; ++i) ineq_jacobian.row(i) *= ineq_multipliers[i];
467 const double* eq_multipliers,
const double* ineq_multipliers)
471 int eq_dim = getEqualityDimension();
472 int ineq_dim = getInequalityDimension();
475 assert(eq_jacobian.rows() == eq_dim);
477 assert(ineq_jacobian.rows() == ineq_dim);
480 constexpr
const double delta = 1e-9;
481 constexpr
const double neg2delta = -2 * delta;
482 constexpr
const double scalar = 1.0 / (2 * delta);
486 Eigen::VectorXd eq_values1(eq_dim);
487 Eigen::VectorXd eq_values2(eq_dim);
488 Eigen::VectorXd ineq_values1(ineq_dim);
489 Eigen::VectorXd ineq_values2(ineq_dim);
496 vertex->
plus(i, delta);
498 if (eq_dim > 0) computeEqualityValues(eq_values2);
499 if (ineq_dim > 0) computeInequalityValues(ineq_values2);
501 vertex->
plus(i, neg2delta);
503 if (eq_dim > 0) computeEqualityValues(eq_values1);
504 if (ineq_dim > 0) computeInequalityValues(ineq_values1);
506 if (eq_dim > 0) eq_jacobian.col(col_idx) = scalar * (eq_values2 - eq_values1);
507 if (ineq_dim > 0) ineq_jacobian.col(col_idx) = scalar * (ineq_values2 - ineq_values1);
509 vertex->
plus(i, delta);
515 if (eq_multipliers && eq_dim > 0)
517 for (
int i = 0; i < eq_dim; ++i) eq_jacobian.row(i) *= eq_multipliers[i];
519 if (ineq_multipliers && ineq_dim > 0)
521 for (
int i = 0; i < ineq_dim; ++i) ineq_jacobian.row(i) *= ineq_multipliers[i];
532 assert(block_jacobian_i.rows() == getObjectiveDimension());
537 if (isObjectiveLinear())
return;
544 double scalar = 1.0 / delta;
545 if (weight != 1.0) scalar *= weight;
557 vertex_j->
plus(j, delta);
559 computeObjectiveJacobian(vtx_idx_i, jacobian2);
563 block_hessian_ij.col(param_idx_j) = scalar * multipliers[0] * (jacobian2.row(0) - block_jacobian_i.row(0)).transpose();
564 for (
int val_idx = 1; val_idx < getObjectiveDimension(); ++val_idx)
565 block_hessian_ij.col(param_idx_j) +=
566 scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
570 block_hessian_ij.col(param_idx_j) = scalar * (jacobian2.row(0) - block_jacobian_i.row(0)).transpose();
571 for (
int val_idx = 1; val_idx < getObjectiveDimension(); ++val_idx)
572 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
574 vertex_j->
plus(j, -delta);
587 assert(block_jacobian_i.rows() == getEqualityDimension());
592 if (isEqualityLinear())
return;
599 double scalar = 1.0 / delta;
600 if (weight != 1.0) scalar *= weight;
612 vertex_j->
plus(j, delta);
614 computeEqualityJacobian(vtx_idx_i, jacobian2);
618 block_hessian_ij.col(param_idx_j) = scalar * multipliers[0] * (jacobian2.row(0) - block_jacobian_i.row(0)).transpose();
619 for (
int val_idx = 1; val_idx < getEqualityDimension(); ++val_idx)
620 block_hessian_ij.col(param_idx_j) +=
621 scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
625 block_hessian_ij.col(param_idx_j) = scalar * (jacobian2.row(0) - block_jacobian_i.row(0)).transpose();
626 for (
int val_idx = 1; val_idx < getEqualityDimension(); ++val_idx)
627 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
629 vertex_j->
plus(j, -delta);
642 assert(block_jacobian_i.rows() == getInequalityDimension());
647 if (isInequalityLinear())
return;
654 double scalar = 1.0 / delta;
655 if (weight != 1.0) scalar *= weight;
667 vertex_j->
plus(j, delta);
669 computeInequalityJacobian(vtx_idx_i, jacobian2);
673 block_hessian_ij.col(param_idx_j) = scalar * multipliers[0] * (jacobian2.row(0) - block_jacobian_i.row(0)).transpose();
674 for (
int val_idx = 1; val_idx < getInequalityDimension(); ++val_idx)
675 block_hessian_ij.col(param_idx_j) +=
676 scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
680 block_hessian_ij.col(param_idx_j) = scalar * (jacobian2.row(0) - block_jacobian_i.row(0)).transpose();
681 for (
int val_idx = 1; val_idx < getInequalityDimension(); ++val_idx)
682 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
684 vertex_j->
plus(j, -delta);
700 assert(obj_jacobian_i.rows() == getObjectiveDimension());
702 assert(eq_jacobian_i.rows() == getEqualityDimension());
704 assert(ineq_jacobian_i.rows() == getInequalityDimension());
717 constexpr
const double scalar = 1.0 / delta;
724 Eigen::MatrixXd ineq_jacobian_j(getInequalityDimension(), vertex_i->
getDimensionUnfixed());
731 vertex_j->
plus(j, delta);
733 computeJacobians(vtx_idx_i, obj_jacobian_j, eq_jacobian_j, ineq_jacobian_j);
735 if (!isObjectiveLinear() && getObjectiveDimension() > 0)
737 obj_hessian_ij.col(param_idx_j) = weight_obj * scalar * (obj_jacobian_j.row(0) - obj_jacobian_i.row(0)).transpose();
738 for (
int val_idx = 1; val_idx < getObjectiveDimension(); ++val_idx)
739 obj_hessian_ij.col(param_idx_j) += weight_obj * scalar * (obj_jacobian_j.row(val_idx) - obj_jacobian_i.row(val_idx)).transpose();
741 if (!isEqualityLinear() && getEqualityDimension() > 0)
745 eq_hessian_ij.col(param_idx_j) = scalar * multipliers_eq[0] * (eq_jacobian_j.row(0) - eq_jacobian_i.row(0)).transpose();
746 for (
int val_idx = 1; val_idx < getEqualityDimension(); ++val_idx)
747 eq_hessian_ij.col(param_idx_j) +=
748 scalar * multipliers_eq[val_idx] * (eq_jacobian_j.row(val_idx) - eq_jacobian_i.row(val_idx)).transpose();
752 eq_hessian_ij.col(param_idx_j) = scalar * (eq_jacobian_j.row(0) - eq_jacobian_i.row(0)).transpose();
753 for (
int val_idx = 1; val_idx < getEqualityDimension(); ++val_idx)
754 eq_hessian_ij.col(param_idx_j) += scalar * (eq_jacobian_j.row(val_idx) - eq_jacobian_i.row(val_idx)).transpose();
757 if (!isInequalityLinear() && getInequalityDimension() > 0)
759 if (multipliers_ineq)
761 ineq_hessian_ij.col(param_idx_j) = scalar * multipliers_ineq[0] * (ineq_jacobian_j.row(0) - ineq_jacobian_i.row(0)).transpose();
762 for (
int val_idx = 1; val_idx < getInequalityDimension(); ++val_idx)
763 ineq_hessian_ij.col(param_idx_j) +=
764 scalar * multipliers_ineq[val_idx] * (ineq_jacobian_j.row(val_idx) - ineq_jacobian_i.row(val_idx)).transpose();
768 ineq_hessian_ij.col(param_idx_j) = scalar * (ineq_jacobian_j.row(0) - ineq_jacobian_i.row(0)).transpose();
769 for (
int val_idx = 1; val_idx < getInequalityDimension(); ++val_idx)
770 ineq_hessian_ij.col(param_idx_j) += scalar * (ineq_jacobian_j.row(val_idx) - ineq_jacobian_i.row(val_idx)).transpose();
774 vertex_j->
plus(j, -delta);
784 const double* multipliers_ineq)
790 assert(eq_jacobian_i.rows() == getEqualityDimension());
792 assert(ineq_jacobian_i.rows() == getInequalityDimension());
803 constexpr
const double scalar = 1.0 / delta;
809 Eigen::MatrixXd ineq_jacobian_j(getInequalityDimension(), vertex_i->
getDimensionUnfixed());
816 vertex_j->
plus(j, delta);
818 computeConstraintJacobians(vtx_idx_i, eq_jacobian_j, ineq_jacobian_j);
820 if (!isEqualityLinear() && getEqualityDimension() > 0)
824 eq_hessian_ij.col(param_idx_j) = scalar * multipliers_eq[0] * (eq_jacobian_j.row(0) - eq_jacobian_i.row(0)).transpose();
825 for (
int val_idx = 1; val_idx < getEqualityDimension(); ++val_idx)
826 eq_hessian_ij.col(param_idx_j) +=
827 scalar * multipliers_eq[val_idx] * (eq_jacobian_j.row(val_idx) - eq_jacobian_i.row(val_idx)).transpose();
831 eq_hessian_ij.col(param_idx_j) = scalar * (eq_jacobian_j.row(0) - eq_jacobian_i.row(0)).transpose();
832 for (
int val_idx = 1; val_idx < getEqualityDimension(); ++val_idx)
833 eq_hessian_ij.col(param_idx_j) += scalar * (eq_jacobian_j.row(val_idx) - eq_jacobian_i.row(val_idx)).transpose();
836 if (!isInequalityLinear() && getInequalityDimension() > 0)
838 if (multipliers_ineq)
840 ineq_hessian_ij.col(param_idx_j) = scalar * multipliers_ineq[0] * (ineq_jacobian_j.row(0) - ineq_jacobian_i.row(0)).transpose();
841 for (
int val_idx = 1; val_idx < getInequalityDimension(); ++val_idx)
842 ineq_hessian_ij.col(param_idx_j) +=
843 scalar * multipliers_ineq[val_idx] * (ineq_jacobian_j.row(val_idx) - ineq_jacobian_i.row(val_idx)).transpose();
847 ineq_hessian_ij.col(param_idx_j) = scalar * (ineq_jacobian_j.row(0) - ineq_jacobian_i.row(0)).transpose();
848 for (
int val_idx = 1; val_idx < getInequalityDimension(); ++val_idx)
849 ineq_hessian_ij.col(param_idx_j) += scalar * (ineq_jacobian_j.row(val_idx) - ineq_jacobian_i.row(val_idx)).transpose();
853 vertex_j->
plus(j, -delta);
867 assert(block_jacobian_i.rows() == getObjectiveDimension());
872 if (isObjectiveLinear())
return;
879 double scalar = 1.0 / delta;
880 if (weight != 1.0) scalar *= weight;
892 vertex_j->
plus(j, delta);
894 computeObjectiveJacobian(vtx_idx_i, jacobian2);
898 for (
int val_idx = 0; val_idx < getObjectiveDimension(); ++val_idx)
899 block_hessian_ij.col(param_idx_j) +=
900 scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
904 for (
int val_idx = 0; val_idx < getObjectiveDimension(); ++val_idx)
905 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
907 vertex_j->
plus(j, -delta);
920 assert(block_jacobian_i.rows() == getEqualityDimension());
925 if (isEqualityLinear())
return;
932 double scalar = 1.0 / delta;
933 if (weight != 1.0) scalar *= weight;
945 vertex_j->
plus(j, delta);
947 computeEqualityJacobian(vtx_idx_i, jacobian2);
951 for (
int val_idx = 0; val_idx < getEqualityDimension(); ++val_idx)
952 block_hessian_ij.col(param_idx_j) +=
953 scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
957 for (
int val_idx = 0; val_idx < getEqualityDimension(); ++val_idx)
958 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
960 vertex_j->
plus(j, -delta);
973 assert(block_jacobian_i.rows() == getInequalityDimension());
978 if (isInequalityLinear())
return;
985 double scalar = 1.0 / delta;
986 if (weight != 1.0) scalar *= weight;
998 vertex_j->
plus(j, delta);
1000 computeInequalityJacobian(vtx_idx_i, jacobian2);
1004 for (
int val_idx = 0; val_idx < getInequalityDimension(); ++val_idx)
1005 block_hessian_ij.col(param_idx_j) +=
1006 scalar * multipliers[val_idx] * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
1010 for (
int val_idx = 0; val_idx < getInequalityDimension(); ++val_idx)
1011 block_hessian_ij.col(param_idx_j) += scalar * (jacobian2.row(val_idx) - block_jacobian_i.row(val_idx)).transpose();
1013 vertex_j->
plus(j, -delta);
1023 const double* multipliers_eq,
const double* multipliers_ineq,
double weight_obj)
1029 assert(obj_jacobian_i.rows() == getObjectiveDimension());
1031 assert(eq_jacobian_i.rows() == getEqualityDimension());
1033 assert(ineq_jacobian_i.rows() == getInequalityDimension());
1046 constexpr
const double scalar = 1.0 / delta;
1053 Eigen::MatrixXd ineq_jacobian_j(getInequalityDimension(), vertex_i->
getDimensionUnfixed());
1055 int param_idx_j = 0;
1060 vertex_j->
plus(j, delta);
1062 computeJacobians(vtx_idx_i, obj_jacobian_j, eq_jacobian_j, ineq_jacobian_j);
1064 if (!isObjectiveLinear())
1066 for (
int val_idx = 0; val_idx < getObjectiveDimension(); ++val_idx)
1067 obj_hessian_ij.col(param_idx_j) += weight_obj * scalar * (obj_jacobian_j.row(val_idx) - obj_jacobian_i.row(val_idx)).transpose();
1069 if (!isEqualityLinear())
1073 for (
int val_idx = 0; val_idx < getEqualityDimension(); ++val_idx)
1074 eq_hessian_ij.col(param_idx_j) +=
1075 scalar * multipliers_eq[val_idx] * (eq_jacobian_j.row(val_idx) - eq_jacobian_i.row(val_idx)).transpose();
1079 for (
int val_idx = 0; val_idx < getEqualityDimension(); ++val_idx)
1080 eq_hessian_ij.col(param_idx_j) += scalar * (eq_jacobian_j.row(val_idx) - eq_jacobian_i.row(val_idx)).transpose();
1083 if (!isInequalityLinear())
1085 if (multipliers_ineq)
1087 for (
int val_idx = 0; val_idx < getInequalityDimension(); ++val_idx)
1088 ineq_hessian_ij.col(param_idx_j) +=
1089 scalar * multipliers_ineq[val_idx] * (ineq_jacobian_j.row(val_idx) - ineq_jacobian_i.row(val_idx)).transpose();
1093 for (
int val_idx = 0; val_idx < getInequalityDimension(); ++val_idx)
1094 ineq_hessian_ij.col(param_idx_j) += scalar * (ineq_jacobian_j.row(val_idx) - ineq_jacobian_i.row(val_idx)).transpose();
1098 vertex_j->
plus(j, -delta);
1108 const double* multipliers_ineq)
1114 assert(eq_jacobian_i.rows() == getEqualityDimension());
1116 assert(ineq_jacobian_i.rows() == getInequalityDimension());
1127 constexpr
const double scalar = 1.0 / delta;
1133 Eigen::MatrixXd ineq_jacobian_j(getInequalityDimension(), vertex_i->
getDimensionUnfixed());
1135 int param_idx_j = 0;
1140 vertex_j->
plus(j, delta);
1142 computeConstraintJacobians(vtx_idx_i, eq_jacobian_j, ineq_jacobian_j);
1144 if (!isEqualityLinear())
1148 for (
int val_idx = 0; val_idx < getEqualityDimension(); ++val_idx)
1149 eq_hessian_ij.col(param_idx_j) +=
1150 scalar * multipliers_eq[val_idx] * (eq_jacobian_j.row(val_idx) - eq_jacobian_i.row(val_idx)).transpose();
1154 for (
int val_idx = 0; val_idx < getEqualityDimension(); ++val_idx)
1155 eq_hessian_ij.col(param_idx_j) += scalar * (eq_jacobian_j.row(val_idx) - eq_jacobian_i.row(val_idx)).transpose();
1158 if (!isInequalityLinear())
1160 if (multipliers_ineq)
1162 for (
int val_idx = 0; val_idx < getInequalityDimension(); ++val_idx)
1163 ineq_hessian_ij.col(param_idx_j) +=
1164 scalar * multipliers_ineq[val_idx] * (ineq_jacobian_j.row(val_idx) - ineq_jacobian_i.row(val_idx)).transpose();
1168 for (
int val_idx = 0; val_idx < getInequalityDimension(); ++val_idx)
1169 ineq_hessian_ij.col(param_idx_j) += scalar * (ineq_jacobian_j.row(val_idx) - ineq_jacobian_i.row(val_idx)).transpose();
1173 vertex_j->
plus(j, -delta);
virtual int getDimension() const =0
Get dimension of the edge (dimension of the cost-function/constraint value vector) ...
virtual void computeHessian(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &block_jacobian_i, Eigen::Ref< Eigen::MatrixXd > block_hessian_ij, const double *multipliers=nullptr, double weight=1.0)
virtual void computeConstraintJacobians(int vtx_idx, Eigen::Ref< Eigen::MatrixXd > eq_jacobian, Eigen::Ref< Eigen::MatrixXd > ineq_jacobian, const double *eq_multipliers=nullptr, const double *ineq_multipliers=nullptr)
virtual void computeObjectiveHessianInc(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &block_jacobian_i, Eigen::Ref< Eigen::MatrixXd > block_hessian_ij, const double *multipliers=nullptr, double weight=1.0)
virtual int getNumberFiniteLowerBounds(bool unfixed_only) const =0
Get number of finite lower bounds.
constexpr const double HESSIAN_DELTA
virtual int getNumVertices() const =0
Return number of attached vertices.
virtual void computeInequalityHessian(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &block_jacobian_i, Eigen::Ref< Eigen::MatrixXd > block_hessian_ij, const double *multipliers=nullptr, double weight=1.0)
virtual void computeObjectiveJacobian(int vtx_idx, Eigen::Ref< Eigen::MatrixXd > block_jacobian, const double *multipliers=nullptr)
virtual int getDimension() const =0
Return number of elements/values/components stored in this vertex.
Generic interface class for vertices.
virtual void computeEqualityJacobian(int vtx_idx, Eigen::Ref< Eigen::MatrixXd > block_jacobian, const double *multipliers=nullptr)
virtual void computeHessianInc(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &block_jacobian_i, Eigen::Ref< Eigen::MatrixXd > block_hessian_ij, const double *multipliers=nullptr, double weight=1.0)
Compute edge block Hessian for a given vertex pair.
virtual void computeJacobians(int vtx_idx, Eigen::Ref< Eigen::MatrixXd > obj_jacobian, Eigen::Ref< Eigen::MatrixXd > eq_jacobian, Eigen::Ref< Eigen::MatrixXd > ineq_jacobian, const double *obj_multipliers=nullptr, const double *eq_multipliers=nullptr, const double *ineq_multipliers=nullptr)
virtual void computeEqualityHessianInc(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &block_jacobian_i, Eigen::Ref< Eigen::MatrixXd > block_hessian_ij, const double *multipliers=nullptr, double weight=1.0)
virtual int getDimensionUnfixed() const =0
Return number of unfixed elements (unfixed elements are skipped as parameters in the Hessian and Jaco...
virtual void computeInequalityHessianInc(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &block_jacobian_i, Eigen::Ref< Eigen::MatrixXd > block_hessian_ij, const double *multipliers=nullptr, double weight=1.0)
virtual void computeHessiansInc(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &obj_jacobian_i, const Eigen::Ref< const Eigen::MatrixXd > &eq_jacobian_i, const Eigen::Ref< const Eigen::MatrixXd > &ineq_jacobian_i, Eigen::Ref< Eigen::MatrixXd > obj_hessian_ij, Eigen::Ref< Eigen::MatrixXd > eq_hessian_ij, Eigen::Ref< Eigen::MatrixXd > ineq_hessian_ij, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr, double weight_obj=1.0)
virtual void computeValues(Eigen::Ref< Eigen::VectorXd > values)=0
Compute function values.
virtual void computeObjectiveHessian(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &block_jacobian_i, Eigen::Ref< Eigen::MatrixXd > block_hessian_ij, const double *multipliers=nullptr, double weight=1.0)
virtual void computeInequalityJacobian(int vtx_idx, Eigen::Ref< Eigen::MatrixXd > block_jacobian, const double *multipliers=nullptr)
virtual void computeConstraintHessiansInc(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &eq_jacobian_i, const Eigen::Ref< const Eigen::MatrixXd > &ineq_jacobian_i, Eigen::Ref< Eigen::MatrixXd > eq_hessian_ij, Eigen::Ref< Eigen::MatrixXd > ineq_hessian_ij, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr)
virtual VertexInterface * getVertexRaw(int idx)=0
Get access to vertex with index idx (0 <= idx < numVertices)
A matrix or vector expression mapping an existing expression.
virtual void plus(int idx, double inc)=0
Add value to a specific component of the vertex: x[idx] += inc.
virtual void computeEqualityHessian(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &block_jacobian_i, Eigen::Ref< Eigen::MatrixXd > block_hessian_ij, const double *multipliers=nullptr, double weight=1.0)
int getNumFiniteVerticesUpperBounds() const
virtual void computeConstraintHessians(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &eq_jacobian_i, const Eigen::Ref< const Eigen::MatrixXd > &ineq_jacobian_i, Eigen::Ref< Eigen::MatrixXd > eq_hessian_ij, Eigen::Ref< Eigen::MatrixXd > ineq_hessian_ij, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr)
virtual void computeJacobian(int vtx_idx, Eigen::Ref< Eigen::MatrixXd > block_jacobian, const double *multipliers=nullptr)
Compute edge block jacobian for a given vertex.
virtual void computeHessians(int vtx_idx_i, int vtx_idx_j, const Eigen::Ref< const Eigen::MatrixXd > &obj_jacobian_i, const Eigen::Ref< const Eigen::MatrixXd > &eq_jacobian_i, const Eigen::Ref< const Eigen::MatrixXd > &ineq_jacobian_i, Eigen::Ref< Eigen::MatrixXd > obj_hessian_ij, Eigen::Ref< Eigen::MatrixXd > eq_hessian_ij, Eigen::Ref< Eigen::MatrixXd > ineq_hessian_ij, const double *multipliers_eq=nullptr, const double *multipliers_ineq=nullptr, double weight_obj=1.0)
virtual int getNumberFiniteUpperBounds(bool unfixed_only) const =0
Get number of finite upper bounds.
int getNumFiniteVerticesLowerBounds() const
virtual const VertexInterface * getVertex(int idx) const =0
virtual bool isFixedComponent(int idx) const =0
Check if individual components are fixed or unfixed.