Skip to content

Commit dfabca4

Browse files
committed
fix bugs and add initialization timer
1 parent 750f665 commit dfabca4

File tree

3 files changed

+19
-18
lines changed

3 files changed

+19
-18
lines changed

ocs2_ipm/src/IpmInitialization.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ std::pair<vector_t, vector_t> initializeIntermediateSlackVariable(OptimalControl
3939

4040
if (!ocpDefinition.stateInequalityConstraintPtr->empty() || !ocpDefinition.inequalityConstraintPtr->empty()) {
4141
constexpr auto request = Request::Constraint;
42-
ocpDefinition.preComputationPtr->requestPreJump(request, time, state);
42+
ocpDefinition.preComputationPtr->request(request, time, state, input);
4343
}
4444

4545
if (!ocpDefinition.stateInequalityConstraintPtr->empty()) {

ocs2_ipm/src/IpmSolver.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -107,26 +107,31 @@ void IpmSolver::reset() {
107107

108108
// reset timers
109109
totalNumIterations_ = 0;
110+
initializationTimer_.reset();
110111
linearQuadraticApproximationTimer_.reset();
111112
solveQpTimer_.reset();
112113
linesearchTimer_.reset();
113114
computeControllerTimer_.reset();
114115
}
115116

116117
std::string IpmSolver::getBenchmarkingInformation() const {
118+
const auto initializationTotal = initializationTimer_.getTotalInMilliseconds();
117119
const auto linearQuadraticApproximationTotal = linearQuadraticApproximationTimer_.getTotalInMilliseconds();
118120
const auto solveQpTotal = solveQpTimer_.getTotalInMilliseconds();
119121
const auto linesearchTotal = linesearchTimer_.getTotalInMilliseconds();
120122
const auto computeControllerTotal = computeControllerTimer_.getTotalInMilliseconds();
121123

122-
const auto benchmarkTotal = linearQuadraticApproximationTotal + solveQpTotal + linesearchTotal + computeControllerTotal;
124+
const auto benchmarkTotal =
125+
initializationTotal + linearQuadraticApproximationTotal + solveQpTotal + linesearchTotal + computeControllerTotal;
123126

124127
std::stringstream infoStream;
125128
if (benchmarkTotal > 0.0) {
126129
const scalar_t inPercent = 100.0;
127130
infoStream << "\n########################################################################\n";
128131
infoStream << "The benchmarking is computed over " << totalNumIterations_ << " iterations. \n";
129132
infoStream << "IPM Benchmarking\t :\tAverage time [ms] (% of total runtime)\n";
133+
infoStream << "\tInitialization :\t" << initializationTimer_.getAverageInMilliseconds() << " [ms] \t\t("
134+
<< initializationTotal / benchmarkTotal * inPercent << "%)\n";
130135
infoStream << "\tLQ Approximation :\t" << linearQuadraticApproximationTimer_.getAverageInMilliseconds() << " [ms] \t\t("
131136
<< linearQuadraticApproximationTotal / benchmarkTotal * inPercent << "%)\n";
132137
infoStream << "\tSolve QP :\t" << solveQpTimer_.getAverageInMilliseconds() << " [ms] \t\t("
@@ -216,6 +221,7 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
216221
const auto oldModeSchedule = primalSolution_.modeSchedule_;
217222
const auto& newModeSchedule = this->getReferenceManager().getModeSchedule();
218223

224+
initializationTimer_.startTimer();
219225
// Initialize the state and input
220226
if (!primalSolution_.timeTrajectory_.empty()) {
221227
std::ignore = trajectorySpread(oldModeSchedule, newModeSchedule, primalSolution_);
@@ -239,6 +245,7 @@ void IpmSolver::runImpl(scalar_t initTime, const vector_t& initState, scalar_t f
239245
initializeCostateTrajectory(timeDiscretization, x, lmd);
240246
initializeProjectionMultiplierTrajectory(timeDiscretization, nu);
241247
}
248+
initializationTimer_.endTimer();
242249

243250
// Bookkeeping
244251
performanceIndeces_.clear();
@@ -418,10 +425,8 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
418425
std::tie(slackStateIneq[i], std::ignore) = ipm::fromMultiplierCollection(slackIneqTrajectory_.preJumps[cachedEventIndex]);
419426
std::tie(dualStateIneq[i], std::ignore) = ipm::fromMultiplierCollection(dualIneqTrajectory_.preJumps[cachedEventIndex]);
420427
} else {
421-
const auto time = getIntervalStart(timeDiscretization[i]);
422-
const auto& state = x[i];
423-
slackStateIneq[i] = ipm::initializePreJumpSlackVariable(ocpDefinition, time, state, settings_.initialSlackLowerBound,
424-
settings_.initialSlackMarginRate);
428+
slackStateIneq[i] = ipm::initializePreJumpSlackVariable(ocpDefinition, getIntervalStart(timeDiscretization[i]), x[i],
429+
settings_.initialSlackLowerBound, settings_.initialSlackMarginRate);
425430
dualStateIneq[i] =
426431
ipm::initializeDualVariable(slackStateIneq[i], barrierParam, settings_.initialDualLowerBound, settings_.initialDualMarginRate);
427432
}
@@ -436,14 +441,8 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
436441
std::tie(dualStateIneq[i], dualStateInputIneq[i]) =
437442
ipm::fromMultiplierCollection(getIntermediateDualSolutionAtTime(slackIneqTrajectory_, time));
438443
} else {
439-
const auto& state = x[i];
440-
const auto& input = u[i];
441444
std::tie(slackStateIneq[i], slackStateInputIneq[i]) = ipm::initializeIntermediateSlackVariable(
442-
ocpDefinition, time, state, input, settings_.initialSlackLowerBound, settings_.initialSlackMarginRate);
443-
// Disable the state-only inequality constraints at the initial node
444-
if (i == 0) {
445-
slackStateIneq[i].resize(0);
446-
}
445+
ocpDefinition, time, x[i], u[i], settings_.initialSlackLowerBound, settings_.initialSlackMarginRate);
447446
dualStateIneq[i] =
448447
ipm::initializeDualVariable(slackStateIneq[i], barrierParam, settings_.initialDualLowerBound, settings_.initialDualMarginRate);
449448
dualStateInputIneq[i] = ipm::initializeDualVariable(slackStateInputIneq[i], barrierParam, settings_.initialDualLowerBound,
@@ -452,14 +451,16 @@ void IpmSolver::initializeSlackDualTrajectory(const std::vector<AnnotatedTime>&
452451
}
453452
}
454453

454+
// Disable the state-only inequality constraints at the initial node
455+
slackStateIneq[0].resize(0);
456+
dualStateIneq[0].resize(0);
457+
455458
if (interpolateTillFinalTime) {
456459
std::tie(slackStateIneq[N], std::ignore) = ipm::fromMultiplierCollection(slackIneqTrajectory_.final);
457460
std::tie(dualStateIneq[N], std::ignore) = ipm::fromMultiplierCollection(dualIneqTrajectory_.final);
458461
} else {
459-
const auto time = getIntervalStart(timeDiscretization[N]);
460-
const auto& state = x[N];
461-
slackStateIneq[N] = ipm::initializeTerminalSlackVariable(ocpDefinition, time, state, settings_.initialSlackLowerBound,
462-
settings_.initialSlackMarginRate);
462+
slackStateIneq[N] = ipm::initializeTerminalSlackVariable(ocpDefinition, getIntervalStart(timeDiscretization[N]), x[N],
463+
settings_.initialSlackLowerBound, settings_.initialSlackMarginRate);
463464
dualStateIneq[N] =
464465
ipm::initializeDualVariable(slackStateIneq[N], barrierParam, settings_.initialDualLowerBound, settings_.initialDualMarginRate);
465466
}

ocs2_ipm/test/Exp0Test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ TEST(Exp0Test, Constrained) {
140140
const vector_t xmin = (vector_t(2) << -7.5, -7.5).finished();
141141
const vector_t xmax = (vector_t(2) << 7.5, 7.5).finished();
142142
problem.stateInequalityConstraintPtr->add("xbound", getStateBoxConstraint(xmin, xmax));
143-
// problem.finalInequalityConstraintPtr->add("xbound", getStateBoxConstraint(xmin, xmax));
143+
problem.finalInequalityConstraintPtr->add("xbound", getStateBoxConstraint(xmin, xmax));
144144

145145
const scalar_t startTime = 0.0;
146146
const scalar_t finalTime = 2.0;

0 commit comments

Comments
 (0)