@@ -535,13 +535,13 @@ PerformanceIndex IpmSolver::setupQuadraticSubproblem(const std::vector<Annotated
535535 if (time[i].event == AnnotatedTime::Event::PreEvent) {
536536 // Event node
537537 auto result = multiple_shooting::setupEventNode (ocpDefinition, time[i].time , x[i], x[i + 1 ]);
538+ metrics[i] = multiple_shooting::computeMetrics (result);
538539 if (initializeSlackAndDualVariables) {
539540 slackStateIneq[i] =
540541 ipm::initializeSlackVariable (result.ineqConstraints .f , settings_.initialSlackLowerBound , settings_.initialSlackMarginRate );
541542 dualStateIneq[i] = ipm::initializeDualVariable (slackStateIneq[i], barrierParam, settings_.initialDualLowerBound ,
542543 settings_.initialDualMarginRate );
543544 }
544- metrics[i] = multiple_shooting::computeMetrics (result);
545545 performance[workerId] += ipm::computePerformanceIndex (result, barrierParam, slackStateIneq[i]);
546546 dynamics_[i] = std::move (result.dynamics );
547547 stateInputEqConstraints_[i].resize (0 , x[i].size ());
@@ -564,6 +564,7 @@ PerformanceIndex IpmSolver::setupQuadraticSubproblem(const std::vector<Annotated
564564 const scalar_t ti = getIntervalStart (time[i]);
565565 const scalar_t dt = getIntervalDuration (time[i], time[i + 1 ]);
566566 auto result = multiple_shooting::setupIntermediateNode (ocpDefinition, sensitivityDiscretizer_, ti, dt, x[i], x[i + 1 ], u[i]);
567+ metrics[i] = multiple_shooting::computeMetrics (result);
567568 // Disable the state-only inequality constraints at the initial node
568569 if (i == 0 ) {
569570 result.stateIneqConstraints .setZero (0 , x[i].size ());
@@ -579,7 +580,6 @@ PerformanceIndex IpmSolver::setupQuadraticSubproblem(const std::vector<Annotated
579580 dualStateInputIneq[i] = ipm::initializeDualVariable (slackStateInputIneq[i], barrierParam, settings_.initialDualLowerBound ,
580581 settings_.initialDualMarginRate );
581582 }
582- metrics[i] = multiple_shooting::computeMetrics (result);
583583 performance[workerId] += ipm::computePerformanceIndex (result, dt, barrierParam, slackStateIneq[i], slackStateInputIneq[i]);
584584 if (settings_.projectStateInputEqualityConstraints ) {
585585 multiple_shooting::projectTranscription (result, settings_.computeLagrangeMultipliers );
@@ -613,13 +613,13 @@ PerformanceIndex IpmSolver::setupQuadraticSubproblem(const std::vector<Annotated
613613 if (i == N) { // Only one worker will execute this
614614 const scalar_t tN = getIntervalStart (time[N]);
615615 auto result = multiple_shooting::setupTerminalNode (ocpDefinition, tN, x[N]);
616+ metrics[i] = multiple_shooting::computeMetrics (result);
616617 if (initializeSlackAndDualVariables) {
617618 slackStateIneq[N] =
618619 ipm::initializeSlackVariable (result.ineqConstraints .f , settings_.initialSlackLowerBound , settings_.initialSlackMarginRate );
619620 dualStateIneq[N] =
620621 ipm::initializeDualVariable (slackStateIneq[N], barrierParam, settings_.initialDualLowerBound , settings_.initialDualMarginRate );
621622 }
622- metrics[i] = multiple_shooting::computeMetrics (result);
623623 performance[workerId] += ipm::computePerformanceIndex (result, barrierParam, slackStateIneq[N]);
624624 stateInputEqConstraints_[i].resize (0 , x[i].size ());
625625 stateIneqConstraints_[i] = std::move (result.ineqConstraints );
0 commit comments