25 #ifndef SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_STRUCTURED_OCP_EDGES_MULTIPLE_SHOOTING_EDGES_H_ 26 #define SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_STRUCTURED_OCP_EDGES_MULTIPLE_SHOOTING_EDGES_H_ 47 using Ptr = std::shared_ptr<MSDynamicsOnlyEdge>;
48 using UPtr = std::unique_ptr<MSDynamicsOnlyEdge>;
65 bool isLinear()
const override {
return false; }
100 using Ptr = std::shared_ptr<MSVariableDynamicsOnlyEdge>;
101 using UPtr = std::unique_ptr<MSVariableDynamicsOnlyEdge>;
154 using Ptr = std::shared_ptr<MultipleShootingEdgeSingleControl>;
155 using UPtr = std::unique_ptr<MultipleShootingEdgeSingleControl>;
161 _stage_cost(stage_cost),
163 _stage_ineq(stage_ineq),
170 _dyn_dim =
_dynamics->getStateDimension();
171 _other_eq_dim = _stage_eq ? _stage_eq->getIntegralStateControlTermDimension(_k) : 0;
172 _ineq_dim = _stage_ineq ? _stage_ineq->getIntegralStateControlTermDimension(_k) : 0;
174 _current.resize(_obj_dim + _dyn_dim + _other_eq_dim + _ineq_dim);
177 _values.resize(_current.size());
184 configureIntegrand();
210 assert(_xkvert->getDimension() ==
_dynamics->getStateDimension());
211 assert(_ukvert->getDimension() ==
_dynamics->getInputDimension());
214 if (_obj_dim > 0) _current[0] = 0;
215 _current.segment(_obj_dim, _dyn_dim) = _xkvert->values();
216 int tail = _other_eq_dim + _ineq_dim;
217 if (tail > 0) _current.tail(tail).setZero();
222 _integrator->solveIVP(_current, _dtvert->value(), _integrand, _values);
226 if (_obj_dim > 0) obj_values[0] = _values[0];
231 assert(_xnextvert->values().size() == _dyn_dim);
234 eq_values.head(_dyn_dim).noalias() = _values.segment(_obj_dim, _dyn_dim) - _xnextvert->values();
235 eq_values.tail(_other_eq_dim) = _values.segment(_obj_dim + _dyn_dim, _other_eq_dim);
239 if (_ineq_dim > 0) ineq_values = _values.tail(_ineq_dim);
252 _dynamics->dynamics(current.segment(_obj_dim, _dyn_dim), _ukvert->values(), result.segment(_obj_dim, _dyn_dim));
255 assert(_obj_dim == 1);
256 _stage_cost->computeIntegralStateControlTerm(_k, current.segment(_obj_dim, _dyn_dim), _ukvert->values(), result.head(1));
260 if (_other_eq_dim > 0)
262 _stage_eq->computeIntegralStateControlTerm(_k, current.segment(_obj_dim, _dyn_dim), _ukvert->values(),
263 result.segment(idx, _other_eq_dim));
264 idx += _other_eq_dim;
268 _stage_ineq->computeIntegralStateControlTerm(_k, current.segment(_obj_dim, _dyn_dim), _ukvert->values(),
269 result.segment(idx, _ineq_dim));
272 assert(idx == result.size());
284 int _other_eq_dim = 0;
290 std::function<void(const Eigen::VectorXd&, Eigen::Ref<Eigen::VectorXd>)> _integrand;
308 using Ptr = std::shared_ptr<MultipleShootingEdgeSingleControlTimeScaling>;
309 using UPtr = std::unique_ptr<MultipleShootingEdgeSingleControlTimeScaling>;
316 _stage_cost(stage_cost),
318 _stage_ineq(stage_ineq),
326 _dyn_dim =
_dynamics->getStateDimension();
327 _other_eq_dim = _stage_eq ? _stage_eq->getIntegralStateControlTermDimension(_k) : 0;
328 _ineq_dim = _stage_ineq ? _stage_ineq->getIntegralStateControlTermDimension(_k) : 0;
330 _current.resize(_obj_dim + _dyn_dim + _other_eq_dim + _ineq_dim);
333 _values.resize(_current.size());
340 configureIntegrand();
366 assert(_xkvert->getDimension() ==
_dynamics->getStateDimension());
367 assert(_ukvert->getDimension() ==
_dynamics->getInputDimension());
370 if (_obj_dim > 0) _current[0] = 0;
371 _current.segment(_obj_dim, _dyn_dim) = _xkvert->values();
372 int tail = _other_eq_dim + _ineq_dim;
373 if (tail > 0) _current.tail(tail).setZero();
382 if (_obj_dim > 0) obj_values[0] = _values[0];
387 assert(_xnextvert->values().size() == _dyn_dim);
390 eq_values.head(_dyn_dim).noalias() = _values.segment(_obj_dim, _dyn_dim) - _xnextvert->values();
391 eq_values.tail(_other_eq_dim) = _values.segment(_obj_dim + _dyn_dim, _other_eq_dim);
395 if (_ineq_dim > 0) ineq_values = _values.tail(_ineq_dim);
408 _dynamics->dynamics(current.segment(_obj_dim, _dyn_dim), _ukvert->values(), result.segment(_obj_dim, _dyn_dim));
410 result.segment(_obj_dim, _dyn_dim) *= _timevert->value();
414 assert(_obj_dim == 1);
415 _stage_cost->computeIntegralStateControlTerm(_k, current.segment(_obj_dim, _dyn_dim), _ukvert->values(), result.head(1));
419 if (_other_eq_dim > 0)
421 _stage_eq->computeIntegralStateControlTerm(_k, current.segment(_obj_dim, _dyn_dim), _ukvert->values(),
422 result.segment(idx, _other_eq_dim));
423 idx += _other_eq_dim;
427 _stage_ineq->computeIntegralStateControlTerm(_k, current.segment(_obj_dim, _dyn_dim), _ukvert->values(),
428 result.segment(idx, _ineq_dim));
431 assert(idx == result.size());
443 int _other_eq_dim = 0;
449 std::function<void(const Eigen::VectorXd&, Eigen::Ref<Eigen::VectorXd>)> _integrand;
480 using Ptr = std::shared_ptr<MultipleShootingEdge>;
481 using UPtr = std::unique_ptr<MultipleShootingEdge>;
485 bool eval_intermediate_constr)
486 :
MixedEdge<>(2 + nc_interval + nt_interval),
487 _stage_cost(stage_cost),
489 _stage_ineq(stage_ineq),
490 _n_interval(n_interval),
491 _nc_interval(nc_interval),
492 _nt_interval(nt_interval),
493 _eval_intermediate_constr(eval_intermediate_constr),
502 assert((
int)
_vertices.size() == 2 + _nc_interval + _nt_interval);
506 _int_obj_dim = (_stage_cost && _stage_cost->getIntegralStateControlTermDimension(_k) > 0) ? 1 : 0;
507 _dyn_dim =
_dynamics->getStateDimension();
509 _other_int_eq_dim = _stage_eq ? _stage_eq->getIntegralStateControlTermDimension(_k) : 0;
510 _int_ineq_dim = _stage_ineq ? _stage_ineq->getIntegralStateControlTermDimension(_k) : 0;
512 _current.resize(_int_obj_dim + _dyn_dim + _other_int_eq_dim + _int_ineq_dim);
515 _values.resize(_current.size());
518 _total_dim_obj = _int_obj_dim;
519 _total_dim_eq = _dyn_dim + _other_int_eq_dim;
520 _total_dim_ineq = _int_ineq_dim;
522 activateIntermediateStateCostAndConstraints();
524 configureIntegrand();
548 assert((
int)
_vertices.size() == 2 + _nc_interval + _nt_interval);
550 assert(_shooting_node->getDimension() ==
_dynamics->getStateDimension());
553 if (_int_obj_dim > 0) _current[0] = 0;
554 _current.segment(_int_obj_dim, _dyn_dim) = _shooting_node->values();
555 int tail = _other_int_eq_dim + _int_ineq_dim;
556 if (tail > 0) _current.tail(tail).setZero();
559 for (; _current_idx < _n_interval - 1; ++_current_idx)
562 if (_current_idx < _nt_interval) _dtvert =
static_cast<ScalarVertex*
>(
_vertices[_current_idx + _nc_interval + 2]);
564 assert(_ukvert->getDimension() ==
_dynamics->getInputDimension());
568 _integrator->solveIVP(_current, _dtvert->value(), _integrand, _values);
572 if (_current_idx < _n_interval - 2)
577 if (_eval_intermediate_constr)
579 const int k = _k + _current_idx;
582 if (_nonint_obj_dim > 0)
585 _stage_cost->computeConcatenatedNonIntegralStateTerms(k, xk, _ukvert->values(), _dtvert->value(), cost_segment,
true);
588 if (_nonint_eq_dim > 0)
591 _stage_eq->computeConcatenatedNonIntegralStateTerms(k, xk, _ukvert->values(), _dtvert->value(), eq_segment,
false);
594 if (_nonint_ineq_dim > 0)
597 _stage_ineq->computeConcatenatedNonIntegralStateTerms(k, xk, _ukvert->values(), _dtvert->value(), ineq_segment,
false);
604 for (
int j = 0; j < _shooting_node->getDimension(); ++j)
606 if (_shooting_node->hasFiniteLowerBound(j))
608 _lb_ineq_values(_current_idx * _dim_lb_x + lb_idx) = _shooting_node->lowerBound()[j] - xk[j];
618 for (
int j = 0; j < _shooting_node->getDimension(); ++j)
620 if (_shooting_node->hasFiniteUpperBound(j))
622 _ub_ineq_values(_current_idx * _dim_ub_x + ub_idx) = xk[j] - _shooting_node->upperBound()[j];
634 if (_int_obj_dim > 0 && _nonint_obj_dim > 0)
636 obj_values[0] = _values[0] + _nonint_obj_values.sum();
638 else if (_int_obj_dim > 0)
640 obj_values[0] = _values[0];
642 else if (_nonint_obj_dim > 0)
644 obj_values[0] = _nonint_obj_values.sum();
651 assert(x_next->
values().size() == _dyn_dim);
653 eq_values.head(_dyn_dim).noalias() = _values.segment(_int_obj_dim, _dyn_dim) - x_next->
values();
655 if (_other_int_eq_dim > 0) eq_values.segment(_dyn_dim, _other_int_eq_dim) = _values.segment(_int_obj_dim + _dyn_dim, _other_int_eq_dim);
657 if (_eval_intermediate_constr)
659 assert(_num_intermediate_states > 0);
660 if (_nonint_eq_dim > 0) eq_values.segment(_dyn_dim + _other_int_eq_dim, _num_intermediate_states * _nonint_eq_dim) = _nonint_eq_values;
663 assert(eq_values.size() == _dyn_dim + _other_int_eq_dim + _num_intermediate_states * _nonint_eq_dim);
667 if (_int_ineq_dim > 0) ineq_values.head(_int_ineq_dim) = _values.tail(_int_ineq_dim);
669 if (_eval_intermediate_constr)
671 assert(_num_intermediate_states > 0);
672 int idx = _int_ineq_dim;
673 if (_nonint_ineq_dim > 0)
675 ineq_values.segment(idx, _num_intermediate_states * _nonint_ineq_dim) = _nonint_ineq_values;
676 idx += _num_intermediate_states * _nonint_ineq_dim;
682 ineq_values.segment(idx, _num_intermediate_states * _dim_lb_x) = _lb_ineq_values;
687 ineq_values.tail(_num_intermediate_states * _dim_ub_x) = _ub_ineq_values;
692 assert(ineq_values.size() == _int_ineq_dim + _num_intermediate_states * (_nonint_ineq_dim + _dim_lb_x + _dim_ub_x));
700 if (!_eval_intermediate_constr)
return;
701 _num_intermediate_states = _n_interval - 2;
702 if (_num_intermediate_states < 1)
704 _eval_intermediate_constr =
false;
709 _nonint_obj_dim = _stage_cost ? _stage_cost->getConcatenatedNonIntegralStateTermDimension(_k,
true) : 0;
710 _nonint_eq_dim = _stage_eq ? _stage_eq->getConcatenatedNonIntegralStateTermDimension(_k,
false) : 0;
711 _nonint_ineq_dim = _stage_ineq ? _stage_ineq->getConcatenatedNonIntegralStateTermDimension(_k,
false) : 0;
720 _total_dim_obj = (_int_obj_dim > 0 || _nonint_obj_dim > 0) ? 1 : 0;
721 _total_dim_eq = _other_int_eq_dim + _dyn_dim + _num_intermediate_states * _nonint_eq_dim;
722 _total_dim_ineq = _int_ineq_dim + _num_intermediate_states * (_nonint_ineq_dim + _dim_lb_x + _dim_ub_x);
725 _nonint_obj_values.resize(_num_intermediate_states * _nonint_obj_dim);
726 _nonint_eq_values.resize(_num_intermediate_states * _nonint_eq_dim);
727 _nonint_ineq_values.resize(_num_intermediate_states * _nonint_ineq_dim);
728 _lb_ineq_values.resize(_num_intermediate_states * _dim_lb_x);
729 _ub_ineq_values.resize(_num_intermediate_states * _dim_ub_x);
738 const int k_integrand = _k + _current_idx;
741 _dynamics->dynamics(current.segment(_int_obj_dim, _dyn_dim), _ukvert->values(), result.segment(_int_obj_dim, _dyn_dim));
742 if (_int_obj_dim > 0)
744 assert(_int_obj_dim == 1);
745 _stage_cost->computeIntegralStateControlTerm(k_integrand, current.segment(_int_obj_dim, _dyn_dim), _ukvert->values(), result.head(1));
749 if (_other_int_eq_dim > 0)
751 _stage_eq->computeIntegralStateControlTerm(k_integrand, current.segment(_int_obj_dim, _dyn_dim), _ukvert->values(),
752 result.segment(idx, _other_int_eq_dim));
753 idx += _other_int_eq_dim;
757 _stage_ineq->computeIntegralStateControlTerm(k_integrand, current.segment(_int_obj_dim, _dyn_dim), _ukvert->values(),
758 result.segment(idx, _int_ineq_dim));
759 idx += _int_ineq_dim;
761 assert(idx == result.size());
772 int _int_obj_dim = 0;
773 int _other_int_eq_dim = 0;
774 int _int_ineq_dim = 0;
776 int _nonint_obj_dim = 0;
777 int _nonint_eq_dim = 0;
778 int _nonint_ineq_dim = 0;
783 int _total_dim_obj = 0;
784 int _total_dim_eq = 0;
785 int _total_dim_ineq = 0;
788 int _nc_interval = 0;
789 int _nt_interval = 0;
790 int _num_intermediate_states = 0;
791 int _current_idx = 0;
793 bool _eval_intermediate_constr =
false;
804 std::function<void(const Eigen::VectorXd&, Eigen::Ref<Eigen::VectorXd>)> _integrand;
822 using Ptr = std::shared_ptr<MSDynamicsOnlyMultiControlsEdge>;
823 using UPtr = std::unique_ptr<MSDynamicsOnlyMultiControlsEdge>;
835 _f.resize(
_dynamics->getStateDimension());
890 using Ptr = std::shared_ptr<MSDynamicsOnlyMultiControlsMultiDtsEdge>;
891 using UPtr = std::unique_ptr<MSDynamicsOnlyMultiControlsMultiDtsEdge>;
901 _f.resize(dynamics->getStateDimension());
931 for (
int i = 4; i < (
int)
_vertices.size() - 2; i = i + 2)
960 #endif // SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_STRUCTURED_OCP_EDGES_MULTIPLE_SHOOTING_EDGES_H_ StageEqualityConstraint::ConstPtr _stage_eq
bool isInequalityLinear() const override
int getEqualityDimension() const override
MultipleShootingEdgeSingleControl(SystemDynamicsInterface::Ptr dynamics, StageCost::ConstPtr stage_cost, StageEqualityConstraint::ConstPtr stage_eq, StageInequalityConstraint::ConstPtr stage_ineq, int k, VectorVertex &x_k, VectorVertex &u_k, ScalarVertex &dt_k, VectorVertex &x_kp1)
bool isLeastSquaresForm() const override
Defines if the edge is formulated as Least-Squares form.
void computeEqualityValues(Eigen::Ref< Eigen::VectorXd > eq_values) override
void computeValues(Eigen::Ref< Eigen::VectorXd > values) override
Compute function values.
std::shared_ptr< MSDynamicsOnlyMultiControlsEdge > Ptr
bool isObjectiveLinear() const override
Return true if the edge is linear (and hence its Hessian is always zero)
bool isObjectiveLinear() const override
Return true if the edge is linear (and hence its Hessian is always zero)
std::unique_ptr< MultipleShootingEdge > UPtr
bool isEqualityLinear() const override
MSVariableDynamicsOnlyEdge(SystemDynamicsInterface::Ptr dynamics, VectorVertex &x1, VectorVertex &u1, VectorVertex &x2, ScalarVertex &dt)
void computeValues(Eigen::Ref< Eigen::VectorXd > values) override
Compute function values.
int getInequalityDimension() const override
NumericalIntegratorExplicitInterface::Ptr _integrator
void setIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW
bool isObjectiveLeastSquaresForm() const override
void computeEqualityValues(Eigen::Ref< Eigen::VectorXd > eq_values) override
std::unique_ptr< MultipleShootingEdgeSingleControlTimeScaling > UPtr
int getNumberFiniteLowerBounds(bool unfixed_only) const override
Get number of finite lower bounds.
Vertex implementation for scalar values.
bool isLeastSquaresForm() const override
Defines if the edge is formulated as Least-Squares form.
std::shared_ptr< MultipleShootingEdge > Ptr
bool isInequalityLinear() const override
MSDynamicsOnlyMultiControlsMultiDtsEdge(SystemDynamicsInterface::Ptr dynamics, VectorVertex &x1, VectorVertex &x2, int num_controls)
Eigen::VectorXd _nonint_ineq_values
int getNumberFiniteUpperBounds(bool unfixed_only) const override
Get number of finite upper bounds.
void configureIntegrand()
NumericalIntegratorExplicitInterface::Ptr _integrator
MultipleShootingEdge(SystemDynamicsInterface::Ptr dynamics, StageCost::ConstPtr stage_cost, StageEqualityConstraint::ConstPtr stage_eq, StageInequalityConstraint::ConstPtr stage_ineq, int k, int n_interval, int nc_interval, int nt_interval, bool eval_intermediate_constr)
SystemDynamicsInterface::Ptr _dynamics
StageInequalityConstraint::ConstPtr _stage_ineq
MSDynamicsOnlyMultiControlsEdge(SystemDynamicsInterface::Ptr dynamics, int num_controls)
NumericalIntegratorExplicitInterface::Ptr _integrator
SystemDynamicsInterface::Ptr _dynamics
void computeInequalityValues(Eigen::Ref< Eigen::VectorXd > ineq_values) override
SystemDynamicsInterface::Ptr _dynamics
SystemDynamicsInterface::Ptr _dynamics
void computeObjectiveValues(Eigen::Ref< Eigen::VectorXd > obj_values) override
std::shared_ptr< MSVariableDynamicsOnlyEdge > Ptr
int getEqualityDimension() const override
void precompute() override
void setIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
bool isObjectiveLeastSquaresForm() const override
std::shared_ptr< MultipleShootingEdgeSingleControl > Ptr
void setIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
bool isInequalityLinear() const override
std::unique_ptr< MSDynamicsOnlyMultiControlsMultiDtsEdge > UPtr
bool isEqualityLinear() const override
Eigen::VectorXd _nonint_eq_values
std::shared_ptr< const StageInequalityConstraint > ConstPtr
void computeValues(Eigen::Ref< Eigen::VectorXd > values) override
Compute function values.
StageCost::ConstPtr _stage_cost
std::shared_ptr< const StageEqualityConstraint > ConstPtr
std::unique_ptr< MSDynamicsOnlyMultiControlsEdge > UPtr
int getDimension() const override
Get dimension of the edge (dimension of the cost-function/constraint value vector) ...
StageInequalityConstraint::ConstPtr _stage_ineq
NumericalIntegratorExplicitInterface::Ptr _integrator
void setIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
void setIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
MultipleShootingEdgeSingleControlTimeScaling(SystemDynamicsInterface::Ptr dynamics, StageCost::ConstPtr stage_cost, StageEqualityConstraint::ConstPtr stage_eq, StageInequalityConstraint::ConstPtr stage_ineq, int k, VectorVertex &x_k, VectorVertex &u_k, ScalarVertex &time, VectorVertex &x_kp1, double dt)
int getObjectiveDimension() const override
SystemDynamicsInterface::Ptr _dynamics
void computeInequalityValues(Eigen::Ref< Eigen::VectorXd > ineq_values) override
void computeObjectiveValues(Eigen::Ref< Eigen::VectorXd > obj_values) override
int getObjectiveDimension() const override
int getDimension() const override
Return number of elements/values/components stored in this vertex.
std::unique_ptr< MultipleShootingEdgeSingleControl > UPtr
int getObjectiveDimension() const override
bool isLinear() const override
Return true if the edge is linear (and hence its Hessian is always zero)
void configureIntegrand()
const double & value() const
Get underlying value.
std::shared_ptr< NumericalIntegratorExplicitInterface > Ptr
Eigen::VectorXd _lb_ineq_values
bool isEqualityLinear() const override
A matrix or vector expression mapping an existing expression.
int getDimension() const override
Get dimension of the edge (dimension of the cost-function/constraint value vector) ...
void activateIntermediateStateCostAndConstraints()
void precompute() override
NumericalIntegratorExplicitInterface::Ptr _integrator
std::shared_ptr< MSDynamicsOnlyEdge > Ptr
std::unique_ptr< MSDynamicsOnlyEdge > UPtr
bool isLinear() const override
Return true if the edge is linear (and hence its Hessian is always zero)
MSDynamicsOnlyEdge(SystemDynamicsInterface::Ptr dynamics, VectorVertex &x1, VectorVertex &u1, VectorVertex &x2, double dt)
bool isLeastSquaresForm() const override
Defines if the edge is formulated as Least-Squares form.
EIGEN_DEVICE_FUNC SegmentReturnType tail(Index n)
This is the const version of tail(Index).
void precompute() override
void setIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
void computeValues(Eigen::Ref< Eigen::VectorXd > values) override
Compute function values.
int getEqualityDimension() const override
StageCost::ConstPtr _stage_cost
bool isObjectiveLinear() const override
Return true if the edge is linear (and hence its Hessian is always zero)
bool isObjectiveLeastSquaresForm() const override
int getInequalityDimension() const override
Templated base edge class that stores an arbitary number of value.
StageInequalityConstraint::ConstPtr _stage_ineq
int getDimension() const override
Get dimension of the edge (dimension of the cost-function/constraint value vector) ...
std::unique_ptr< MSVariableDynamicsOnlyEdge > UPtr
std::shared_ptr< MultipleShootingEdgeSingleControlTimeScaling > Ptr
Vertex implementation that stores an Eigen::VectorXd (dynamic dimension)
SystemDynamicsInterface::Ptr _dynamics
Eigen::VectorXd _ub_ineq_values
NumericalIntegratorExplicitInterface::Ptr _integrator
Eigen::VectorXd _nonint_obj_values
const Eigen::VectorXd & values() const
Read-access to the underlying value vector.
void configureIntegrand()
SystemDynamicsInterface::Ptr _dynamics
const VertexContainer _vertices
Vertex container.
NumericalIntegratorExplicitInterface::Ptr _integrator
void computeEqualityValues(Eigen::Ref< Eigen::VectorXd > eq_values) override
bool isLeastSquaresForm() const override
Defines if the edge is formulated as Least-Squares form.
void computeObjectiveValues(Eigen::Ref< Eigen::VectorXd > obj_values) override
void computeInequalityValues(Eigen::Ref< Eigen::VectorXd > ineq_values) override
StageEqualityConstraint::ConstPtr _stage_eq
int getDimension() const override
Get dimension of the edge (dimension of the cost-function/constraint value vector) ...
StageCost::ConstPtr _stage_cost
bool isLinear() const override
Return true if the edge is linear (and hence its Hessian is always zero)
bool isLinear() const override
Return true if the edge is linear (and hence its Hessian is always zero)
int getInequalityDimension() const override
std::shared_ptr< MSDynamicsOnlyMultiControlsMultiDtsEdge > Ptr
void setIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
std::shared_ptr< const StageCost > ConstPtr
std::shared_ptr< SystemDynamicsInterface > Ptr
StageEqualityConstraint::ConstPtr _stage_eq