@@ -37,7 +37,6 @@ namespace ipm {
3737void condenseIneqConstraints (scalar_t barrierParam, const vector_t & slack, const vector_t & dual,
3838 const VectorFunctionLinearApproximation& ineqConstraint, ScalarFunctionQuadraticApproximation& lagrangian) {
3939 assert (barrierParam > 0.0 );
40-
4140 const size_t nc = ineqConstraint.f .size ();
4241 const size_t nu = ineqConstraint.dfdu .cols ();
4342
@@ -95,8 +94,9 @@ vector_t retrieveSlackDirection(const VectorFunctionLinearApproximation& stateIn
9594
9695vector_t retrieveDualDirection (scalar_t barrierParam, const vector_t & slack, const vector_t & dual, const vector_t & slackDirection) {
9796 assert (barrierParam > 0.0 );
98- vector_t dualDirection (slackDirection.size ());
99- dualDirection.array () = -(dual.array () * slackDirection.array () + (slack.array () * dual.array () - barrierParam)) / slack.array ();
97+ vector_t dualDirection = dual.cwiseProduct (slack + slackDirection);
98+ dualDirection.array () -= barrierParam;
99+ dualDirection.array () /= -slack.array ();
100100 return dualDirection;
101101}
102102
@@ -108,14 +108,9 @@ scalar_t fractionToBoundaryStepSize(const vector_t& v, const vector_t& dv, scala
108108 return 1.0 ;
109109 }
110110
111- scalar_t minFractionToBoundary = 1.0 ;
112- vector_t fractionToBoundary = -marginRate * v.cwiseQuotient (dv);
113- for (int i = 0 ; i < fractionToBoundary.size (); ++i) {
114- if (fractionToBoundary[i] <= 0.0 ) {
115- fractionToBoundary[i] = 1.0 ;
116- }
117- }
118- return std::min (1.0 , fractionToBoundary.minCoeff ());
111+ const vector_t invFractionToBoundary = (-1.0 / marginRate) * dv.cwiseQuotient (v);
112+ const auto alpha = invFractionToBoundary.maxCoeff ();
113+ return alpha > 0.0 ? std::min (1.0 / alpha, 1.0 ): 1.0 ;
119114}
120115
121116} // namespace ipm
0 commit comments