@@ -187,6 +187,14 @@ vector_t IpmSolver::getStateInputEqualityConstraintLagrangian(scalar_t time, con
187187 }
188188}
189189
190+ MultiplierCollection IpmSolver::getIntermediateDualSolution (scalar_t time) const {
191+ if (!dualIneqTrajectory_.timeTrajectory .empty ()) {
192+ return getIntermediateDualSolutionAtTime (dualIneqTrajectory_, time);
193+ } else {
194+ throw std::runtime_error (" [IpmSolver] getIntermediateDualSolution() not available yet." );
195+ }
196+ }
197+
190198void IpmSolver::runImpl (scalar_t initTime, const vector_t & initState, scalar_t finalTime) {
191199 if (settings_.printSolverStatus || settings_.printLinesearch ) {
192200 std::cerr << " \n ++++++++++++++++++++++++++++++++++++++++++++++++++++++" ;
@@ -407,24 +415,15 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
407415 if (timeDiscretization[i].event == AnnotatedTime::Event::PreEvent) {
408416 const auto cachedEventIndex = cacheEventIndexBias + eventIdx;
409417 if (cachedEventIndex < slackIneqTrajectory_.preJumps .size ()) {
410- std::tie (slackStateIneq[i], std::ignore) = ipm::fromDualSolution (slackIneqTrajectory_.preJumps [cachedEventIndex]);
411- std::tie (dualStateIneq[i], std::ignore) = ipm::fromDualSolution (dualIneqTrajectory_.preJumps [cachedEventIndex]);
418+ std::tie (slackStateIneq[i], std::ignore) = ipm::fromMultiplierCollection (slackIneqTrajectory_.preJumps [cachedEventIndex]);
419+ std::tie (dualStateIneq[i], std::ignore) = ipm::fromMultiplierCollection (dualIneqTrajectory_.preJumps [cachedEventIndex]);
412420 } else {
413421 const auto time = getIntervalStart (timeDiscretization[i]);
414422 const auto & state = x[i];
415- constexpr auto request = Request::Constraint;
416- ocpDefinition.preComputationPtr ->requestPreJump (request, time, state);
417- auto & preComputation = *ocpDefinition.preComputationPtr ;
418- if (!ocpDefinition.preJumpInequalityConstraintPtr ->empty ()) {
419- const auto ineqConstraint = toVector (ocpDefinition.preJumpInequalityConstraintPtr ->getValue (time, state, preComputation));
420- slackStateIneq[i] =
421- ipm::initializeSlackVariable (ineqConstraint, settings_.initialSlackLowerBound , settings_.initialSlackMarginRate );
422- dualStateIneq[i] = ipm::initializeDualVariable (slackStateIneq[i], barrierParam, settings_.initialDualLowerBound ,
423- settings_.initialDualMarginRate );
424- } else {
425- slackStateIneq[i].resize (0 );
426- dualStateIneq[i].resize (0 );
427- }
423+ slackStateIneq[i] = ipm::initializePreJumpSlackVariable (ocpDefinition, time, state, settings_.initialSlackLowerBound ,
424+ settings_.initialSlackMarginRate );
425+ dualStateIneq[i] =
426+ ipm::initializeDualVariable (slackStateIneq[i], barrierParam, settings_.initialDualLowerBound , settings_.initialDualMarginRate );
428427 }
429428 slackStateInputIneq[i].resize (0 );
430429 dualStateInputIneq[i].resize (0 );
@@ -433,58 +432,36 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
433432 const auto time = getIntervalStart (timeDiscretization[i]);
434433 if (interpolatableTimePeriod.first <= time && time <= interpolatableTimePeriod.second ) {
435434 std::tie (slackStateIneq[i], slackStateInputIneq[i]) =
436- ipm::fromDualSolution (getIntermediateDualSolutionAtTime (slackIneqTrajectory_, time));
435+ ipm::fromMultiplierCollection (getIntermediateDualSolutionAtTime (slackIneqTrajectory_, time));
437436 std::tie (dualStateIneq[i], dualStateInputIneq[i]) =
438- ipm::fromDualSolution (getIntermediateDualSolutionAtTime (slackIneqTrajectory_, time));
437+ ipm::fromMultiplierCollection (getIntermediateDualSolutionAtTime (slackIneqTrajectory_, time));
439438 } else {
440- constexpr auto request = Request::Constraint;
441439 const auto & state = x[i];
442440 const auto & input = u[i];
443- ocpDefinition.preComputationPtr ->request (request, time, state, input);
444- if (!ocpDefinition.stateInequalityConstraintPtr ->empty () && i > 0 ) {
445- const auto ineqConstraint =
446- toVector (ocpDefinition.stateInequalityConstraintPtr ->getValue (time, state, *ocpDefinition.preComputationPtr ));
447- slackStateIneq[i] =
448- ipm::initializeSlackVariable (ineqConstraint, settings_.initialSlackLowerBound , settings_.initialSlackMarginRate );
449- dualStateIneq[i] = ipm::initializeDualVariable (slackStateIneq[i], barrierParam, settings_.initialDualLowerBound ,
450- settings_.initialDualMarginRate );
451- } else {
441+ std::tie (slackStateIneq[i], slackStateInputIneq[i]) = ipm::initializeIntermediateSlackVariable (
442+ ocpDefinition, time, state, input, settings_.initialSlackLowerBound , settings_.initialSlackMarginRate );
443+ // Disable the state-only inequality constraints at the initial node
444+ if (i == 0 ) {
452445 slackStateIneq[i].resize (0 );
453- dualStateIneq[i].resize (0 );
454- }
455- if (!ocpDefinition.inequalityConstraintPtr ->empty ()) {
456- const auto ineqConstraint =
457- toVector (ocpDefinition.inequalityConstraintPtr ->getValue (time, state, input, *ocpDefinition.preComputationPtr ));
458- slackStateInputIneq[i] =
459- ipm::initializeSlackVariable (ineqConstraint, settings_.initialSlackLowerBound , settings_.initialSlackMarginRate );
460- dualStateInputIneq[i] = ipm::initializeDualVariable (slackStateInputIneq[i], barrierParam, settings_.initialDualLowerBound ,
461- settings_.initialDualMarginRate );
462- } else {
463- slackStateInputIneq[i].resize (0 );
464- dualStateInputIneq[i].resize (0 );
465446 }
447+ dualStateIneq[i] =
448+ ipm::initializeDualVariable (slackStateIneq[i], barrierParam, settings_.initialDualLowerBound , settings_.initialDualMarginRate );
449+ dualStateInputIneq[i] = ipm::initializeDualVariable (slackStateInputIneq[i], barrierParam, settings_.initialDualLowerBound ,
450+ settings_.initialDualMarginRate );
466451 }
467452 }
468453 }
469454
470455 if (interpolateTillFinalTime) {
471- std::tie (slackStateIneq[N], std::ignore) = ipm::fromDualSolution (slackIneqTrajectory_.final );
472- std::tie (dualStateIneq[N], std::ignore) = ipm::fromDualSolution (dualIneqTrajectory_.final );
456+ std::tie (slackStateIneq[N], std::ignore) = ipm::fromMultiplierCollection (slackIneqTrajectory_.final );
457+ std::tie (dualStateIneq[N], std::ignore) = ipm::fromMultiplierCollection (dualIneqTrajectory_.final );
473458 } else {
474- const auto time = newTimeTrajectory [N];
459+ const auto time = getIntervalStart (timeDiscretization [N]) ;
475460 const auto & state = x[N];
476- constexpr auto request = Request::Constraint;
477- ocpDefinition.preComputationPtr ->requestFinal (request, time, state);
478- auto & preComputation = *ocpDefinition.preComputationPtr ;
479- if (!ocpDefinition.finalInequalityConstraintPtr ->empty ()) {
480- const auto ineqConstraint = toVector (ocpDefinition.finalInequalityConstraintPtr ->getValue (time, state, preComputation));
481- slackStateIneq[N] = ipm::initializeSlackVariable (ineqConstraint, settings_.initialSlackLowerBound , settings_.initialSlackMarginRate );
482- dualStateIneq[N] =
483- ipm::initializeDualVariable (slackStateIneq[N], barrierParam, settings_.initialDualLowerBound , settings_.initialDualMarginRate );
484- } else {
485- slackStateIneq[N].resize (0 );
486- dualStateIneq[N].resize (0 );
487- }
461+ slackStateIneq[N] = ipm::initializeTerminalSlackVariable (ocpDefinition, time, state, settings_.initialSlackLowerBound ,
462+ settings_.initialSlackMarginRate );
463+ dualStateIneq[N] =
464+ ipm::initializeDualVariable (slackStateIneq[N], barrierParam, settings_.initialDualLowerBound , settings_.initialDualMarginRate );
488465 }
489466}
490467
0 commit comments