@@ -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
116117std::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 :\t Average time [ms] (% of total runtime)\n " ;
133+ infoStream << " \t Initialization :\t " << initializationTimer_.getAverageInMilliseconds () << " [ms] \t\t ("
134+ << initializationTotal / benchmarkTotal * inPercent << " %)\n " ;
130135 infoStream << " \t LQ Approximation :\t " << linearQuadraticApproximationTimer_.getAverageInMilliseconds () << " [ms] \t\t ("
131136 << linearQuadraticApproximationTotal / benchmarkTotal * inPercent << " %)\n " ;
132137 infoStream << " \t Solve 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 }
0 commit comments