@@ -114,32 +114,61 @@ scalar_t fractionToBoundaryStepSize(const vector_t& v, const vector_t& dv, scala
114114}
115115
116116namespace {
117- MultiplierCollection toMultiplierCollection (vector_t && slackStateIneq, vector_t && dualStateIneq ,
118- vector_t && slackStateInputIneq = vector_t (), vector_t&& dualStateInputIneq = vector_t() ) {
117+ MultiplierCollection toMultiplierCollection (const multiple_shooting::ConstraintsSize constraintsSize, const vector_t & slackStateIneq ,
118+ const vector_t & dualStateIneq ) {
119119 MultiplierCollection multiplierCollection;
120- multiplierCollection.stateIneq .emplace_back (0.0 , std::move (slackStateIneq));
121- multiplierCollection.stateEq .emplace_back (0.0 , std::move (dualStateIneq));
122- multiplierCollection.stateInputIneq .emplace_back (0.0 , std::move (slackStateInputIneq));
123- multiplierCollection.stateInputEq .emplace_back (0.0 , std::move (dualStateInputIneq));
120+ size_t head = 0 ;
121+ for (const size_t size : constraintsSize.stateIneq ) {
122+ multiplierCollection.stateIneq .emplace_back (0.0 , slackStateIneq.segment (head, size));
123+ multiplierCollection.stateEq .emplace_back (0.0 , dualStateIneq.segment (head, size));
124+ head += size;
125+ }
126+ return multiplierCollection;
127+ }
128+
129+ MultiplierCollection toMultiplierCollection (const multiple_shooting::ConstraintsSize constraintsSize, const vector_t & slackStateIneq,
130+ const vector_t & dualStateIneq, const vector_t & slackStateInputIneq,
131+ const vector_t & dualStateInputIneq) {
132+ MultiplierCollection multiplierCollection = toMultiplierCollection (constraintsSize, slackStateIneq, dualStateIneq);
133+ size_t head = 0 ;
134+ for (const size_t size : constraintsSize.stateInputIneq ) {
135+ multiplierCollection.stateInputIneq .emplace_back (0.0 , slackStateInputIneq.segment (head, size));
136+ multiplierCollection.stateInputEq .emplace_back (0.0 , dualStateInputIneq.segment (head, size));
137+ }
124138 return multiplierCollection;
125139}
140+
141+ vector_t extractLagrangian (const std::vector<Multiplier>& termsMultiplier) {
142+ size_t n = 0 ;
143+ std::for_each (termsMultiplier.begin (), termsMultiplier.end (), [&](const Multiplier& m) { n += m.lagrangian .size (); });
144+
145+ vector_t vec (n);
146+ size_t head = 0 ;
147+ for (const auto & m : termsMultiplier) {
148+ vec.segment (head, m.lagrangian .size ()) = m.lagrangian ;
149+ head += m.lagrangian .size ();
150+ } // end of i loop
151+
152+ return vec;
153+ }
126154} // namespace
127155
128- void toSlackDual (MultiplierCollection& & multiplierCollection, vector_t & slackStateIneq, vector_t & dualStateIneq,
156+ void toSlackDual (const MultiplierCollection& multiplierCollection, vector_t & slackStateIneq, vector_t & dualStateIneq,
129157 vector_t & slackStateInputIneq, vector_t & dualStateInputIneq) {
130- slackStateIneq = std::move (multiplierCollection.stateIneq . front (). lagrangian );
131- dualStateIneq = std::move (multiplierCollection.stateEq . front (). lagrangian );
132- slackStateInputIneq = std::move (multiplierCollection.stateInputIneq . front (). lagrangian );
133- dualStateInputIneq = std::move (multiplierCollection.stateInputEq . front (). lagrangian );
158+ slackStateIneq = extractLagrangian (multiplierCollection.stateIneq );
159+ dualStateIneq = extractLagrangian (multiplierCollection.stateEq );
160+ slackStateInputIneq = extractLagrangian (multiplierCollection.stateInputIneq );
161+ dualStateInputIneq = extractLagrangian (multiplierCollection.stateInputEq );
134162}
135163
136- void toSlackDual (MultiplierCollection& & multiplierCollection, vector_t & slackStateIneq, vector_t & dualStateIneq) {
137- slackStateIneq = std::move (multiplierCollection.stateIneq . front (). lagrangian );
138- dualStateIneq = std::move (multiplierCollection.stateEq . front (). lagrangian );
164+ void toSlackDual (const MultiplierCollection& multiplierCollection, vector_t & slackStateIneq, vector_t & dualStateIneq) {
165+ slackStateIneq = extractLagrangian (multiplierCollection.stateIneq );
166+ dualStateIneq = extractLagrangian (multiplierCollection.stateEq );
139167}
140168
141- DualSolution toDualSolution (const std::vector<AnnotatedTime>& time, vector_array_t && slackStateIneq, vector_array_t && dualStateIneq,
142- vector_array_t && slackStateInputIneq, vector_array_t && dualStateInputIneq) {
169+ DualSolution toDualSolution (const std::vector<AnnotatedTime>& time, const std::vector<multiple_shooting::ConstraintsSize>& constraintsSize,
170+ const vector_array_t & slackStateIneq, const vector_array_t & dualStateIneq,
171+ const vector_array_t & slackStateInputIneq, const vector_array_t & dualStateInputIneq) {
143172 // Problem horizon
144173 const int N = static_cast <int >(time.size ()) - 1 ;
145174
@@ -152,14 +181,14 @@ DualSolution toDualSolution(const std::vector<AnnotatedTime>& time, vector_array
152181
153182 for (int i = 0 ; i < N; ++i) {
154183 if (time[i].event == AnnotatedTime::Event::PreEvent) {
155- dualSolution.preJumps .emplace_back (toMultiplierCollection (std::move ( slackStateIneq[i]), std::move ( dualStateIneq[i]) ));
184+ dualSolution.preJumps .emplace_back (toMultiplierCollection (constraintsSize[i], slackStateIneq[i], dualStateIneq[i]));
156185 dualSolution.intermediates .push_back (dualSolution.intermediates .back ()); // no event at the initial node
157186 } else {
158- dualSolution.intermediates .emplace_back (toMultiplierCollection ( std::move (slackStateIneq[i]), std::move (dualStateIneq[i]),
159- std::move ( slackStateInputIneq[i]), std::move ( dualStateInputIneq[i]) ));
187+ dualSolution.intermediates .emplace_back (
188+ toMultiplierCollection (constraintsSize[i], slackStateIneq[i], dualStateIneq[i], slackStateInputIneq[i], dualStateInputIneq[i]));
160189 }
161190 }
162- dualSolution.final = toMultiplierCollection (std::move ( slackStateIneq[N]), std::move ( dualStateIneq[N]) );
191+ dualSolution.final = toMultiplierCollection (constraintsSize[N], slackStateIneq[N], dualStateIneq[N]);
163192 dualSolution.intermediates .push_back (dualSolution.intermediates .back ());
164193
165194 return dualSolution;
0 commit comments