49 std::vector<BaseEdge::Ptr> cost_terms, eq_terms, ineq_terms;
55 std::vector<VectorVertex>& u_seq =
_intervals[i].u_seq;
59 if (u_seq.size() == 1)
65 nlp_fun.getNonIntegralStageFunctionEdges(k,
s, u_seq.front(),
_dt, u_prev, dt_prev, cost_terms, eq_terms, ineq_terms);
66 for (
BaseEdge::Ptr& edge : cost_terms) edges.addObjectiveEdge(edge);
67 for (
BaseEdge::Ptr& edge : eq_terms) edges.addEqualityEdge(edge);
68 for (
BaseEdge::Ptr& edge : ineq_terms) edges.addInequalityEdge(edge);
70 if (nlp_fun.hasIntegralTerms(k))
74 dynamics, nlp_fun.stage_cost, nlp_fun.stage_equalities, nlp_fun.stage_inequalities, k,
s, u_seq.front(),
_dt, s_next);
76 edges.addMixedEdge(edge);
82 dynamics,
s, u_seq.front(), s_next,
_dt);
84 edges.addEqualityEdge(edge);
92 int num_controls = (
int)u_seq.size();
97 std::make_shared<MultipleShootingEdge>(dynamics, nlp_fun.stage_cost, nlp_fun.stage_equalities, nlp_fun.stage_inequalities, k,
98 num_controls + 1, num_controls,
102 edge->setVertex(0,
s);
103 edge->setVertex(1, s_next);
105 for (
int i = 0; i < num_controls; ++i)
107 edge->setVertex(vert_idx++, u_seq[i]);
109 edge->setVertex(vert_idx++,
_dt);
111 edges.addMixedEdge(edge);
119 edge->setVertex(0,
s);
120 edge->setVertex(1, s_next);
121 edge->setVertex(2,
_dt);
122 for (
int i = 0; i < num_controls; ++i)
124 edge->setVertex(3 + i, u_seq[i]);
127 edges.addEqualityEdge(edge);
134 nlp_fun.getNonIntegralStageFunctionEdges(k,
s, u_seq.front(),
_dt, u_prev, dt_prev, cost_terms, eq_terms, ineq_terms);
135 for (
BaseEdge::Ptr& edge : cost_terms) edges.addObjectiveEdge(edge);
136 for (
BaseEdge::Ptr& edge : eq_terms) edges.addEqualityEdge(edge);
137 for (
BaseEdge::Ptr& edge : ineq_terms) edges.addInequalityEdge(edge);
140 for (
int i = 1; i < (
int)u_seq.size(); ++i)
145 if (nlp_fun.stage_cost)
150 for (
BaseEdge::Ptr& edge : cost_terms) edges.addObjectiveEdge(edge);
152 if (nlp_fun.stage_equalities)
157 for (
BaseEdge::Ptr& edge : eq_terms) edges.addEqualityEdge(edge);
159 if (nlp_fun.stage_inequalities)
164 for (
BaseEdge::Ptr& edge : ineq_terms) edges.addInequalityEdge(edge);
168 k += (
int)u_seq.size();
176 if (cost_edge) edges.addObjectiveEdge(cost_edge);
182 if (nlp_fun.final_stage_constraints->isEqualityConstraint())
183 edges.addEqualityEdge(constr_edge);
185 edges.addInequalityEdge(constr_edge);
193 nlp_fun.getFinalControlDeviationEdges(
n,
_u_ref,
_intervals.back().u_seq.back(),
_dt, cost_terms, eq_terms, ineq_terms);
194 for (
BaseEdge::Ptr& edge : cost_terms) edges.addObjectiveEdge(edge);
195 for (
BaseEdge::Ptr& edge : eq_terms) edges.addEqualityEdge(edge);
196 for (
BaseEdge::Ptr& edge : ineq_terms) edges.addInequalityEdge(edge);
200 ScalarVertex& dt_prev,
const StageFunction& stage_fun,
201 std::vector<BaseEdge::Ptr>& edges)
203 int dim = stage_fun.getNonIntegralControlTermDimension(k);
206 using Edge = UnaryVectorVertexEdge<StageFunction, &StageFunction::computeNonIntegralControlTerm>;
208 std::make_shared<Edge>(dim, k, stage_fun, uk, stage_fun.isLinearNonIntegralControlTerm(k), stage_fun.isLsqFormNonIntegralControlTerm(k));
209 edges.push_back(edge);
212 dim = stage_fun.getNonIntegralDtTermDimension(k);
215 using Edge = UnaryScalarVertexEdge<StageFunction, &StageFunction::computeNonIntegralDtTerm>;
217 std::make_shared<Edge>(dim, k, stage_fun, dt, stage_fun.isLinearNonIntegralDtTerm(k), stage_fun.isLsqFormNonIntegralDtTerm(k));
218 edges.push_back(edge);
221 dim = stage_fun.getNonIntegralControlDeviationTermDimension(k);
225 Edge::Ptr edge = std::make_shared<Edge>(dim, k, stage_fun, uk, u_prev, dt_prev,
false,
false);
226 edges.push_back(edge);
230 #ifdef MESSAGE_SUPPORT
231 void MultipleShootingGrid::fromMessage(
const messages::MultipleShootingGrid& message, std::stringstream* issues)
233 if (message.n() < 2 && issues) *issues <<
"MultipleShootingGrid: Number of states must be greater than or equal 2.\n";
234 if (message.dt() <= 0 && issues) *issues <<
"MultipleShootingGrid: Dt must be greater than 0.0.\n";
244 util::get_oneof_field_type(message.integrator(),
"explicit_integrator", type,
false);
249 integrator->fromMessage(message.integrator(), issues);
254 if (issues) *issues <<
"MultipleShootingGrid: unknown integration method specified.\n";
259 void MultipleShootingGrid::toMessage(messages::MultipleShootingGrid& message)
const