Skip to content

Commit 895e2c3

Browse files
committed
remove projectStateInputEqualityConstraints option
1 parent a5446cb commit 895e2c3

File tree

9 files changed

+5
-101
lines changed

9 files changed

+5
-101
lines changed

ocs2_ipm/include/ocs2_ipm/IpmSettings.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@ struct Settings {
6565
scalar_t dt = 0.01; // user-defined time discretization
6666
SensitivityIntegratorType integratorType = SensitivityIntegratorType::RK2;
6767

68-
// Equality constraints
69-
bool projectStateInputEqualityConstraints = true; // Use a projection method to resolve the state-input constraint Cx+Du+e
70-
7168
// Barrier strategy of the primal-dual interior point method. Conventions follows Ipopt.
7269
scalar_t initialBarrierParameter = 1.0e-02; // Initial value of the barrier parameter
7370
scalar_t targetBarrierParameter = 1.0e-04; // Targer value of the barrier parameter. The barreir will decrease until reaches this value.

ocs2_ipm/src/IpmSettings.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ Settings loadSettings(const std::string& filename, const std::string& fieldName,
7474
loadData::loadPtreeValue(pt, settings.barrierSuperlinearDecreasePower, fieldName + ".barrierSuperlinearDecreasePower", verbose);
7575
loadData::loadPtreeValue(pt, settings.fractionToBoundaryMargin, fieldName + ".fractionToBoundaryMargin", verbose);
7676
loadData::loadPtreeValue(pt, settings.usePrimalStepSizeForDual, fieldName + ".usePrimalStepSizeForDual", verbose);
77-
loadData::loadPtreeValue(pt, settings.projectStateInputEqualityConstraints, fieldName + ".projectStateInputEqualityConstraints", verbose);
7877
loadData::loadPtreeValue(pt, settings.initialSlackLowerBound, fieldName + ".initialSlackLowerBound", verbose);
7978
loadData::loadPtreeValue(pt, settings.initialDualLowerBound, fieldName + ".initialDualLowerBound", verbose);
8079
loadData::loadPtreeValue(pt, settings.initialSlackMarginRate, fieldName + ".initialSlackMarginRate", verbose);

ocs2_ipm/src/IpmSolver.cpp

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,6 @@ ipm::Settings rectifySettings(const OptimalControlProblem& ocp, ipm::Settings&&
5454
if (settings.computeLagrangeMultipliers) {
5555
settings.createValueFunction = true;
5656
}
57-
// True does not make sense if there are no constraints.
58-
if (ocp.equalityConstraintPtr->empty()) {
59-
settings.projectStateInputEqualityConstraints = false;
60-
}
6157
// Turn off the barrier update strategy if there are no inequality constraints.
6258
if (ocp.inequalityConstraintPtr->empty() && ocp.stateInequalityConstraintPtr->empty() && ocp.preJumpInequalityConstraintPtr->empty() &&
6359
ocp.finalInequalityConstraintPtr->empty()) {
@@ -244,9 +240,7 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
244240
settings_.usePrimalStepSizeForDual ? std::min(stepInfo.stepSize, deltaSolution.maxDualStepSize) : deltaSolution.maxDualStepSize;
245241
if (settings_.computeLagrangeMultipliers) {
246242
multiple_shooting::incrementTrajectory(lmd, deltaSolution.deltaLmdSol, stepInfo.stepSize, lmd);
247-
if (settings_.projectStateInputEqualityConstraints) {
248-
multiple_shooting::incrementTrajectory(nu, deltaSolution.deltaNuSol, stepInfo.stepSize, nu);
249-
}
243+
multiple_shooting::incrementTrajectory(nu, deltaSolution.deltaNuSol, stepInfo.stepSize, nu);
250244
}
251245
multiple_shooting::incrementTrajectory(dualStateIneq, deltaSolution.deltaDualStateIneq, stepInfo.stepSize, dualStateIneq);
252246
multiple_shooting::incrementTrajectory(dualStateInputIneq, deltaSolution.deltaDualStateInputIneq, stepInfo.stepSize,
@@ -369,14 +363,8 @@ IpmSolver::OcpSubproblemSolution IpmSolver::getOCPSolution(const vector_t& delta
369363
auto& deltaXSol = solution.deltaXSol;
370364
auto& deltaUSol = solution.deltaUSol;
371365
hpipm_status status;
372-
if (!settings_.projectStateInputEqualityConstraints) {
373-
hpipmInterface_.resize(extractSizesFromProblem(dynamics_, lagrangian_, &stateInputEqConstraints_));
374-
status = hpipmInterface_.solve(delta_x0, dynamics_, lagrangian_, &stateInputEqConstraints_, deltaXSol, deltaUSol,
375-
settings_.printSolverStatus);
376-
} else { // without constraints, or when using projection, we have an unconstrained QP.
377-
hpipmInterface_.resize(extractSizesFromProblem(dynamics_, lagrangian_, nullptr));
378-
status = hpipmInterface_.solve(delta_x0, dynamics_, lagrangian_, nullptr, deltaXSol, deltaUSol, settings_.printSolverStatus);
379-
}
366+
hpipmInterface_.resize(extractSizesFromProblem(dynamics_, lagrangian_, nullptr));
367+
status = hpipmInterface_.solve(delta_x0, dynamics_, lagrangian_, nullptr, deltaXSol, deltaUSol, settings_.printSolverStatus);
380368

381369
if (status != hpipm_status::SUCCESS) {
382370
throw std::runtime_error("[IpmSolver] Failed to solve QP");
@@ -493,9 +481,7 @@ PrimalSolution IpmSolver::toPrimalSolution(const std::vector<AnnotatedTime>& tim
493481
if (settings_.useFeedbackPolicy) {
494482
ModeSchedule modeSchedule = this->getReferenceManager().getModeSchedule();
495483
matrix_array_t KMatrices = hpipmInterface_.getRiccatiFeedback(dynamics_[0], lagrangian_[0]);
496-
if (settings_.projectStateInputEqualityConstraints) {
497-
multiple_shooting::remapProjectedGain(constraintsProjection_, KMatrices);
498-
}
484+
multiple_shooting::remapProjectedGain(constraintsProjection_, KMatrices);
499485
return multiple_shooting::toPrimalSolution(time, std::move(modeSchedule), std::move(x), std::move(u), std::move(KMatrices));
500486

501487
} else {
@@ -586,9 +572,7 @@ PerformanceIndex IpmSolver::setupQuadraticSubproblem(const std::vector<Annotated
586572
settings_.initialDualMarginRate);
587573
}
588574
performance[workerId] += ipm::computePerformanceIndex(result, dt, barrierParam, slackStateIneq[i], slackStateInputIneq[i]);
589-
if (settings_.projectStateInputEqualityConstraints) {
590-
multiple_shooting::projectTranscription(result, settings_.computeLagrangeMultipliers);
591-
}
575+
multiple_shooting::projectTranscription(result, settings_.computeLagrangeMultipliers);
592576
dynamics_[i] = std::move(result.dynamics);
593577
stateInputEqConstraints_[i] = std::move(result.stateInputEqConstraints);
594578
stateIneqConstraints_[i] = std::move(result.stateIneqConstraints);

ocs2_ipm/test/Exp0Test.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ TEST(Exp0Test, Unconstrained) {
107107
ipm::Settings s;
108108
s.dt = 0.01;
109109
s.ipmIteration = 20;
110-
s.projectStateInputEqualityConstraints = true;
111110
s.useFeedbackPolicy = true;
112111
s.printSolverStatistics = true;
113112
s.printSolverStatus = true;
@@ -150,7 +149,6 @@ TEST(Exp0Test, Constrained) {
150149
ipm::Settings s;
151150
s.dt = 0.01;
152151
s.ipmIteration = 20;
153-
s.projectStateInputEqualityConstraints = true;
154152
s.useFeedbackPolicy = true;
155153
s.printSolverStatistics = true;
156154
s.printSolverStatus = true;

ocs2_ipm/test/Exp1Test.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ TEST(Exp1Test, Unconstrained) {
136136
ipm::Settings s;
137137
s.dt = 0.01;
138138
s.ipmIteration = 20;
139-
s.projectStateInputEqualityConstraints = true;
140139
s.useFeedbackPolicy = true;
141140
s.printSolverStatistics = true;
142141
s.printSolverStatus = true;
@@ -179,7 +178,6 @@ TEST(Exp1Test, Constrained) {
179178
ipm::Settings s;
180179
s.dt = 0.01;
181180
s.ipmIteration = 20;
182-
s.projectStateInputEqualityConstraints = true;
183181
s.useFeedbackPolicy = true;
184182
s.printSolverStatistics = true;
185183
s.printSolverStatus = true;
@@ -252,7 +250,6 @@ TEST(Exp1Test, MixedConstrained) {
252250
ipm::Settings s;
253251
s.dt = 0.01;
254252
s.ipmIteration = 20;
255-
s.projectStateInputEqualityConstraints = true;
256253
s.useFeedbackPolicy = true;
257254
s.printSolverStatistics = true;
258255
s.printSolverStatus = true;

ocs2_ipm/test/testCircularKinematics.cpp

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -144,72 +144,6 @@ TEST(test_circular_kinematics, solve_projected_EqConstraints) {
144144
ocs2::ipm::Settings s;
145145
s.dt = 0.01;
146146
s.ipmIteration = 20;
147-
s.projectStateInputEqualityConstraints = true;
148-
s.useFeedbackPolicy = true;
149-
s.printSolverStatistics = true;
150-
s.printSolverStatus = true;
151-
s.printLinesearch = true;
152-
s.printSolverStatistics = true;
153-
s.printSolverStatus = true;
154-
s.printLinesearch = true;
155-
s.nThreads = 1;
156-
s.initialBarrierParameter = 1.0e-02;
157-
s.targetBarrierParameter = 1.0e-04;
158-
s.barrierLinearDecreaseFactor = 0.2;
159-
s.barrierSuperlinearDecreasePower = 1.5;
160-
s.fractionToBoundaryMargin = 0.995;
161-
return s;
162-
}();
163-
164-
// Additional problem definitions
165-
const ocs2::scalar_t startTime = 0.0;
166-
const ocs2::scalar_t finalTime = 1.0;
167-
const ocs2::vector_t initState = (ocs2::vector_t(2) << 1.0, 0.0).finished(); // radius 1.0
168-
169-
// Solve
170-
ocs2::IpmSolver solver(settings, problem, zeroInitializer);
171-
solver.run(startTime, initState, finalTime);
172-
173-
// Inspect solution
174-
const auto primalSolution = solver.primalSolution(finalTime);
175-
for (int i = 0; i < primalSolution.timeTrajectory_.size(); i++) {
176-
std::cout << "time: " << primalSolution.timeTrajectory_[i] << "\t state: " << primalSolution.stateTrajectory_[i].transpose()
177-
<< "\t input: " << primalSolution.inputTrajectory_[i].transpose() << std::endl;
178-
}
179-
180-
// Check initial condition
181-
ASSERT_TRUE(primalSolution.stateTrajectory_.front().isApprox(initState));
182-
ASSERT_DOUBLE_EQ(primalSolution.timeTrajectory_.front(), startTime);
183-
ASSERT_DOUBLE_EQ(primalSolution.timeTrajectory_.back(), finalTime);
184-
185-
// Check constraint satisfaction.
186-
const auto performance = solver.getPerformanceIndeces();
187-
ASSERT_LT(performance.dynamicsViolationSSE, 1e-6);
188-
ASSERT_LT(performance.equalityConstraintsSSE, 1e-6);
189-
190-
// Check feedback controller
191-
for (int i = 0; i < primalSolution.timeTrajectory_.size() - 1; i++) {
192-
const auto t = primalSolution.timeTrajectory_[i];
193-
const auto& x = primalSolution.stateTrajectory_[i];
194-
const auto& u = primalSolution.inputTrajectory_[i];
195-
// Feed forward part
196-
ASSERT_TRUE(u.isApprox(primalSolution.controllerPtr_->computeInput(t, x)));
197-
}
198-
}
199-
200-
TEST(test_circular_kinematics, solve_EqConstraints_inQPSubproblem) {
201-
// optimal control problem
202-
ocs2::OptimalControlProblem problem = ocs2::createCircularKinematicsProblem("/tmp/ipm_test_generated");
203-
204-
// Initializer
205-
ocs2::DefaultInitializer zeroInitializer(2);
206-
207-
// Solver settings
208-
const auto settings = []() {
209-
ocs2::ipm::Settings s;
210-
s.dt = 0.01;
211-
s.ipmIteration = 20;
212-
s.projectStateInputEqualityConstraints = false; // <- false to turn off projection of state-input equalities
213147
s.useFeedbackPolicy = true;
214148
s.printSolverStatistics = true;
215149
s.printSolverStatus = true;
@@ -286,7 +220,6 @@ TEST(test_circular_kinematics, solve_projected_EqConstraints_IneqConstraints) {
286220
ocs2::ipm::Settings s;
287221
s.dt = 0.01;
288222
s.ipmIteration = 20;
289-
s.projectStateInputEqualityConstraints = true;
290223
s.useFeedbackPolicy = true;
291224
s.printSolverStatistics = true;
292225
s.printSolverStatus = true;
@@ -385,7 +318,6 @@ TEST(test_circular_kinematics, solve_projected_EqConstraints_MixedIneqConstraint
385318
ocs2::ipm::Settings s;
386319
s.dt = 0.01;
387320
s.ipmIteration = 20;
388-
s.projectStateInputEqualityConstraints = true;
389321
s.useFeedbackPolicy = true;
390322
s.printSolverStatistics = true;
391323
s.printSolverStatus = true;

ocs2_ipm/test/testSwitchedProblem.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ std::pair<PrimalSolution, std::vector<PerformanceIndex>> solveWithEventTime(scal
129129
ocs2::ipm::Settings settings;
130130
settings.dt = 0.05;
131131
settings.ipmIteration = 20;
132-
settings.projectStateInputEqualityConstraints = true;
133132
settings.printSolverStatistics = true;
134133
settings.printSolverStatus = true;
135134
settings.printLinesearch = true;

ocs2_ipm/test/testUnconstrained.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ std::pair<PrimalSolution, std::vector<PerformanceIndex>> solveWithFeedbackSettin
7070
ocs2::ipm::Settings settings;
7171
settings.dt = 0.05;
7272
settings.ipmIteration = 10;
73-
settings.projectStateInputEqualityConstraints = true;
7473
settings.useFeedbackPolicy = feedback;
7574
settings.printSolverStatistics = true;
7675
settings.printSolverStatus = true;

ocs2_ipm/test/testValuefunction.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ TEST(test_valuefunction, linear_quadratic_problem) {
7575
ocs2::ipm::Settings settings;
7676
settings.dt = 0.05;
7777
settings.ipmIteration = 1;
78-
settings.projectStateInputEqualityConstraints = true;
7978
settings.printSolverStatistics = false;
8079
settings.printSolverStatus = false;
8180
settings.printLinesearch = false;

0 commit comments

Comments
 (0)