@@ -100,7 +100,8 @@ void IpmSolver::reset() {
100100 primalSolution_ = PrimalSolution ();
101101 costateTrajectory_.clear ();
102102 projectionMultiplierTrajectory_.clear ();
103- slackDualTrajectory_.clear ();
103+ slackIneqTrajectory_.clear ();
104+ dualIneqTrajectory_.clear ();
104105 valueFunction_.clear ();
105106 performanceIndeces_.clear ();
106107
@@ -215,8 +216,9 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
215216 multiple_shooting::initializeStateInputTrajectories (initState, timeDiscretization, primalSolution_, *initializerPtr_, x, u);
216217
217218 // Initialize the slack and dual variables of the interior point method
218- if (!slackDualTrajectory_.timeTrajectory .empty ()) {
219- std::ignore = trajectorySpread (oldModeSchedule, newModeSchedule, slackDualTrajectory_);
219+ if (!slackIneqTrajectory_.timeTrajectory .empty ()) {
220+ std::ignore = trajectorySpread (oldModeSchedule, newModeSchedule, slackIneqTrajectory_);
221+ std::ignore = trajectorySpread (oldModeSchedule, newModeSchedule, dualIneqTrajectory_);
220222 }
221223 scalar_t barrierParam = settings_.initialBarrierParameter ;
222224 vector_array_t slackStateIneq, dualStateIneq, slackStateInputIneq, dualStateInputIneq;
@@ -281,8 +283,8 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
281283 primalSolution_ = toPrimalSolution (timeDiscretization, std::move (x), std::move (u));
282284 costateTrajectory_ = std::move (lmd);
283285 projectionMultiplierTrajectory_ = std::move (nu);
284- slackDualTrajectory_ =
285- ipm::toDualSolution (timeDiscretization, constraintsSize_, slackStateIneq, dualStateIneq, slackStateInputIneq , dualStateInputIneq);
286+ slackIneqTrajectory_ = ipm::toDualSolution (timeDiscretization, constraintsSize_, slackStateIneq, slackStateInputIneq);
287+ dualIneqTrajectory_ = ipm::toDualSolution (timeDiscretization, constraintsSize_, dualStateIneq, dualStateInputIneq);
286288 problemMetrics_ = multiple_shooting::toProblemMetrics (timeDiscretization, std::move (metrics));
287289 computeControllerTimer_.endTimer ();
288290
@@ -374,8 +376,8 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
374376 const vector_array_t & u, scalar_t barrierParam, vector_array_t & slackStateIneq,
375377 vector_array_t & dualStateIneq, vector_array_t & slackStateInputIneq,
376378 vector_array_t & dualStateInputIneq) {
377- const auto & oldTimeTrajectory = slackDualTrajectory_ .timeTrajectory ;
378- const auto & oldPostEventIndices = slackDualTrajectory_ .postEventIndices ;
379+ const auto & oldTimeTrajectory = slackIneqTrajectory_ .timeTrajectory ;
380+ const auto & oldPostEventIndices = slackIneqTrajectory_ .postEventIndices ;
379381 const auto newTimeTrajectory = toInterpolationTime (timeDiscretization);
380382 const auto newPostEventIndices = toPostEventIndices (timeDiscretization);
381383
@@ -404,8 +406,9 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
404406 for (size_t i = 0 ; i < N; i++) {
405407 if (timeDiscretization[i].event == AnnotatedTime::Event::PreEvent) {
406408 const auto cachedEventIndex = cacheEventIndexBias + eventIdx;
407- if (cachedEventIndex < slackDualTrajectory_.preJumps .size ()) {
408- ipm::toSlackDual (std::move (slackDualTrajectory_.preJumps [cachedEventIndex]), slackStateIneq[i], dualStateIneq[i]);
409+ 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]);
409412 } else {
410413 const auto time = getIntervalStart (timeDiscretization[i]);
411414 const auto & state = x[i];
@@ -429,8 +432,10 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
429432 } else {
430433 const auto time = getIntervalStart (timeDiscretization[i]);
431434 if (interpolatableTimePeriod.first <= time && time <= interpolatableTimePeriod.second ) {
432- ipm::toSlackDual (getIntermediateDualSolutionAtTime (slackDualTrajectory_, time), slackStateIneq[i], dualStateIneq[i],
433- slackStateInputIneq[i], dualStateInputIneq[i]);
435+ std::tie (slackStateIneq[i], slackStateInputIneq[i]) =
436+ ipm::fromDualSolution (getIntermediateDualSolutionAtTime (slackIneqTrajectory_, time));
437+ std::tie (dualStateIneq[i], dualStateInputIneq[i]) =
438+ ipm::fromDualSolution (getIntermediateDualSolutionAtTime (slackIneqTrajectory_, time));
434439 } else {
435440 constexpr auto request = Request::Constraint;
436441 const auto & state = x[i];
@@ -463,7 +468,8 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
463468 }
464469
465470 if (interpolateTillFinalTime) {
466- ipm::toSlackDual (std::move (slackDualTrajectory_.final ), slackStateIneq[N], dualStateIneq[N]);
471+ std::tie (slackStateIneq[N], std::ignore) = ipm::fromDualSolution (slackIneqTrajectory_.final );
472+ std::tie (dualStateIneq[N], std::ignore) = ipm::fromDualSolution (dualIneqTrajectory_.final );
467473 } else {
468474 const auto time = newTimeTrajectory[N];
469475 const auto & state = x[N];
0 commit comments