@@ -386,27 +386,20 @@ IpmSolver::OcpSubproblemSolution IpmSolver::getOCPSolution(const vector_t& delta
386386 solution.armijoDescentMetric = armijoDescentMetric (lagrangian_, deltaXSol, deltaUSol);
387387
388388 // Extract value function
389- auto & deltaLmdSol = solution.deltaLmdSol ;
390389 if (settings_.createValueFunction ) {
391390 valueFunction_ = hpipmInterface_.getRiccatiCostToGo (dynamics_[0 ], lagrangian_[0 ]);
392- // Extract costate directions
393- if (settings_.computeLagrangeMultipliers ) {
394- deltaLmdSol.resize (deltaXSol.size ());
395- for (int i = 0 ; i < deltaXSol.size (); ++i) {
396- deltaLmdSol[i] = valueFunction_[i].dfdx ;
397- deltaLmdSol[i].noalias () += valueFunction_[i].dfdxx * deltaXSol[i];
398- }
399- }
400391 }
401392
402393 // Problem horizon
403394 const int N = static_cast <int >(deltaXSol.size ()) - 1 ;
404395
396+ auto & deltaLmdSol = solution.deltaLmdSol ;
405397 auto & deltaNuSol = solution.deltaNuSol ;
406398 auto & deltaSlackStateIneq = solution.deltaSlackStateIneq ;
407399 auto & deltaSlackStateInputIneq = solution.deltaSlackStateInputIneq ;
408400 auto & deltaDualStateIneq = solution.deltaDualStateIneq ;
409401 auto & deltaDualStateInputIneq = solution.deltaDualStateInputIneq ;
402+ deltaLmdSol.resize (N + 1 );
410403 deltaNuSol.resize (N);
411404 deltaSlackStateIneq.resize (N + 1 );
412405 deltaSlackStateInputIneq.resize (N + 1 );
@@ -437,7 +430,14 @@ IpmSolver::OcpSubproblemSolution IpmSolver::getOCPSolution(const vector_t& delta
437430 {dualStepSizes[workerId],
438431 ipm::fractionToBoundaryStepSize (dualStateIneq[i], deltaDualStateIneq[i], settings_.fractionToBoundaryMargin ),
439432 ipm::fractionToBoundaryStepSize (dualStateInputIneq[i], deltaDualStateInputIneq[i], settings_.fractionToBoundaryMargin )});
433+
434+ // Extract Newton directions of the costate
435+ if (settings_.computeLagrangeMultipliers ) {
436+ deltaLmdSol[i] = valueFunction_[i].dfdx ;
437+ deltaLmdSol[i].noalias () += valueFunction_[i].dfdxx * deltaXSol[i];
438+ }
440439 if (constraintsProjection_[i].f .size () > 0 ) {
440+ // Extract Newton directions of the Lagrange multiplier associated with the state-input equality constraints
441441 if (settings_.computeLagrangeMultipliers ) {
442442 deltaNuSol[i] = projectionMultiplierCoefficients_[i].f ;
443443 deltaNuSol[i].noalias () += projectionMultiplierCoefficients_[i].dfdx * deltaXSol[i];
@@ -461,6 +461,11 @@ IpmSolver::OcpSubproblemSolution IpmSolver::getOCPSolution(const vector_t& delta
461461 ipm::fractionToBoundaryStepSize (slackStateIneq[i], deltaSlackStateIneq[i], settings_.fractionToBoundaryMargin ));
462462 dualStepSizes[workerId] = std::min (dualStepSizes[workerId], ipm::fractionToBoundaryStepSize (dualStateIneq[i], deltaDualStateIneq[i],
463463 settings_.fractionToBoundaryMargin ));
464+ // Extract Newton directions of the costate
465+ if (settings_.computeLagrangeMultipliers ) {
466+ deltaLmdSol[i] = valueFunction_[i].dfdx ;
467+ deltaLmdSol[i].noalias () += valueFunction_[i].dfdxx * deltaXSol[i];
468+ }
464469 }
465470 };
466471 runParallel (std::move (parallelTask));
0 commit comments