Skip to content

Commit a5446cb

Browse files
committed
parallelize the costate direction computation
1 parent da5f8b3 commit a5446cb

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

ocs2_ipm/src/IpmSolver.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)