Skip to content

Commit 3ca37d8

Browse files
committed
modify around computeLagrangeMultiplier option
1 parent c7034d5 commit 3ca37d8

File tree

3 files changed

+26
-26
lines changed

3 files changed

+26
-26
lines changed

ocs2_ipm/include/ocs2_ipm/IpmSettings.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ struct Settings {
5454
scalar_t gamma_c = 1e-6; // (3): ELSE REQUIRE c{i+1} < (c{i} - gamma_c * g{i}) OR g{i+1} < (1-gamma_c) * g{i}
5555

5656
// controller type
57-
bool useFeedbackPolicy = true; // true to use feedback, false to use feedforward
58-
bool createValueFunction = false; // true to store the value function, false to ignore it
57+
bool useFeedbackPolicy = true; // true to use feedback, false to use feedforward
58+
bool createValueFunction = false; // true to store the value function, false to ignore it
59+
bool computeLagrangeMultipliers = false; // true to compute the Lagrange multipliers
5960

6061
// QP subproblem solver settings
6162
hpipm_interface::Settings hpipmSettings = hpipm_interface::Settings();
@@ -66,7 +67,6 @@ struct Settings {
6667

6768
// Equality constraints
6869
bool projectStateInputEqualityConstraints = true; // Use a projection method to resolve the state-input constraint Cx+Du+e
69-
bool computeLagrangeMultipliers = true; // compute the Lagrange multipliers to evaluate the SSE of the dual feasibilities
7070

7171
// Barrier strategy of the primal-dual interior point method. Conventions follows Ipopt.
7272
scalar_t initialBarrierParameter = 1.0e-02; // Initial value of the barrier parameter
@@ -107,7 +107,7 @@ struct Settings {
107107
* @param [in] verbose: Flag to determine whether to print out the loaded settings or not.
108108
* @return The settings
109109
*/
110-
Settings loadSettings(const std::string& filename, const std::string& fieldName = "multiple_shooting", bool verbose = true);
110+
Settings loadSettings(const std::string& filename, const std::string& fieldName = "ipm", bool verbose = true);
111111

112112
} // namespace ipm
113113
} // namespace ocs2

ocs2_ipm/src/IpmSettings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ Settings loadSettings(const std::string& filename, const std::string& fieldName,
6262
loadData::loadPtreeValue(pt, settings.dt, fieldName + ".dt", verbose);
6363
loadData::loadPtreeValue(pt, settings.useFeedbackPolicy, fieldName + ".useFeedbackPolicy", verbose);
6464
loadData::loadPtreeValue(pt, settings.createValueFunction, fieldName + ".createValueFunction", verbose);
65+
loadData::loadPtreeValue(pt, settings.computeLagrangeMultipliers, fieldName + ".computeLagrangeMultipliers", verbose);
6566
auto integratorName = sensitivity_integrator::toString(settings.integratorType);
6667
loadData::loadPtreeValue(pt, integratorName, fieldName + ".integratorType", verbose);
6768
settings.integratorType = sensitivity_integrator::fromString(integratorName);
@@ -74,7 +75,6 @@ Settings loadSettings(const std::string& filename, const std::string& fieldName,
7475
loadData::loadPtreeValue(pt, settings.fractionToBoundaryMargin, fieldName + ".fractionToBoundaryMargin", verbose);
7576
loadData::loadPtreeValue(pt, settings.usePrimalStepSizeForDual, fieldName + ".usePrimalStepSizeForDual", verbose);
7677
loadData::loadPtreeValue(pt, settings.projectStateInputEqualityConstraints, fieldName + ".projectStateInputEqualityConstraints", verbose);
77-
loadData::loadPtreeValue(pt, settings.computeLagrangeMultipliers, fieldName + ".computeLagrangeMultipliers", verbose);
7878
loadData::loadPtreeValue(pt, settings.initialSlackLowerBound, fieldName + ".initialSlackLowerBound", verbose);
7979
loadData::loadPtreeValue(pt, settings.initialDualLowerBound, fieldName + ".initialDualLowerBound", verbose);
8080
loadData::loadPtreeValue(pt, settings.initialSlackMarginRate, fieldName + ".initialSlackMarginRate", verbose);

ocs2_ipm/src/IpmSolver.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ namespace ocs2 {
5050

5151
namespace {
5252
ipm::Settings rectifySettings(const OptimalControlProblem& ocp, ipm::Settings&& settings) {
53+
// We have to create the value function if we want to compute the Lagrange multipliers.
54+
if (settings.computeLagrangeMultipliers) {
55+
settings.createValueFunction = true;
56+
}
5357
// True does not make sense if there are no constraints.
5458
if (ocp.equalityConstraintPtr->empty()) {
5559
settings.projectStateInputEqualityConstraints = false;
@@ -463,18 +467,20 @@ IpmSolver::OcpSubproblemSolution IpmSolver::getOCPSolution(const vector_t& delta
463467

464468
void IpmSolver::extractValueFunction(const std::vector<AnnotatedTime>& time, const vector_array_t& x, const vector_array_t& lmd,
465469
const vector_array_t& deltaXSol, vector_array_t& deltaLmdSol) {
466-
valueFunction_ = hpipmInterface_.getRiccatiCostToGo(dynamics_[0], lagrangian_[0]);
467-
// Compute costate directions
468-
deltaLmdSol.resize(deltaXSol.size());
469-
for (int i = 0; i < time.size(); ++i) {
470-
deltaLmdSol[i] = valueFunction_[i].dfdx;
471-
deltaLmdSol[i].noalias() += valueFunction_[i].dfdxx * x[i];
472-
}
473-
// Correct for linearization state
474-
for (int i = 0; i < time.size(); ++i) {
475-
valueFunction_[i].dfdx.noalias() -= valueFunction_[i].dfdxx * x[i];
476-
if (settings_.computeLagrangeMultipliers) {
477-
valueFunction_[i].dfdx.noalias() += lmd[i];
470+
if (settings_.createValueFunction) {
471+
valueFunction_ = hpipmInterface_.getRiccatiCostToGo(dynamics_[0], lagrangian_[0]);
472+
// Compute costate directions
473+
deltaLmdSol.resize(deltaXSol.size());
474+
for (int i = 0; i < time.size(); ++i) {
475+
deltaLmdSol[i] = valueFunction_[i].dfdx;
476+
deltaLmdSol[i].noalias() += valueFunction_[i].dfdxx * x[i];
477+
}
478+
// Correct for linearization state
479+
for (int i = 0; i < time.size(); ++i) {
480+
valueFunction_[i].dfdx.noalias() -= valueFunction_[i].dfdxx * x[i];
481+
if (settings_.computeLagrangeMultipliers) {
482+
valueFunction_[i].dfdx.noalias() += lmd[i];
483+
}
478484
}
479485
}
480486
}
@@ -551,9 +557,7 @@ PerformanceIndex IpmSolver::setupQuadraticSubproblem(const std::vector<Annotated
551557
}
552558

553559
ipm::condenseIneqConstraints(barrierParam, slackStateIneq[i], dualStateIneq[i], stateIneqConstraints_[i], lagrangian_[i]);
554-
if (settings_.computeLagrangeMultipliers) {
555-
performance[workerId].dualFeasibilitiesSSE += multiple_shooting::evaluateDualFeasibilities(lagrangian_[i]);
556-
}
560+
performance[workerId].dualFeasibilitiesSSE += multiple_shooting::evaluateDualFeasibilities(lagrangian_[i]);
557561
performance[workerId].dualFeasibilitiesSSE +=
558562
ipm::evaluateComplementarySlackness(barrierParam, slackStateIneq[i], dualStateIneq[i]);
559563
} else {
@@ -597,9 +601,7 @@ PerformanceIndex IpmSolver::setupQuadraticSubproblem(const std::vector<Annotated
597601
ipm::condenseIneqConstraints(barrierParam, slackStateIneq[i], dualStateIneq[i], stateIneqConstraints_[i], lagrangian_[i]);
598602
ipm::condenseIneqConstraints(barrierParam, slackStateInputIneq[i], dualStateInputIneq[i], stateInputIneqConstraints_[i],
599603
lagrangian_[i]);
600-
if (settings_.computeLagrangeMultipliers) {
601-
performance[workerId].dualFeasibilitiesSSE += multiple_shooting::evaluateDualFeasibilities(lagrangian_[i]);
602-
}
604+
performance[workerId].dualFeasibilitiesSSE += multiple_shooting::evaluateDualFeasibilities(lagrangian_[i]);
603605
performance[workerId].dualFeasibilitiesSSE +=
604606
ipm::evaluateComplementarySlackness(barrierParam, slackStateIneq[i], dualStateIneq[i]);
605607
performance[workerId].dualFeasibilitiesSSE +=
@@ -628,9 +630,7 @@ PerformanceIndex IpmSolver::setupQuadraticSubproblem(const std::vector<Annotated
628630
lagrangian_[i] = std::move(result.cost);
629631
}
630632
ipm::condenseIneqConstraints(barrierParam, slackStateIneq[N], dualStateIneq[N], stateIneqConstraints_[N], lagrangian_[N]);
631-
if (settings_.computeLagrangeMultipliers) {
632-
performance[workerId].dualFeasibilitiesSSE += multiple_shooting::evaluateDualFeasibilities(lagrangian_[N]);
633-
}
633+
performance[workerId].dualFeasibilitiesSSE += multiple_shooting::evaluateDualFeasibilities(lagrangian_[N]);
634634
performance[workerId].dualFeasibilitiesSSE += ipm::evaluateComplementarySlackness(barrierParam, slackStateIneq[N], dualStateIneq[N]);
635635
}
636636
};

0 commit comments

Comments
 (0)