10 #include <initializer_list>
33 inline const FunctionPtr &
function()
const noexcept {
return f_; }
49 template<
typename... Vals>
50 const Eigen::VectorXd & value(Vals &&... vals)
const;
55 template<
typename... Vals>
76 template<
typename... Vals>
77 const Eigen::VectorXd & velocity(Vals &&... vals)
const;
84 template<
typename... Vals>
85 const Eigen::VectorXd & normalAcceleration(Vals &&... vals)
const;
92 template<
typename... Vals>
96 static Eigen::VectorXd toVec(std::initializer_list<double> val);
99 void assign(
size_t i,
const Eigen::VectorXd & val,
bool value)
const;
100 void assign(
Variable & x,
const Eigen::VectorXd & val,
bool value)
const;
103 void assign(
const Eigen::VectorXd & val)
const;
104 void assign(
const Eigen::VectorXd & val,
const Eigen::VectorXd & vel)
const;
109 template<
typename... Vals>
110 void parseValues(
const Eigen::VectorXd & v, Vals &&... vals)
const;
111 template<
typename... Vals>
112 void parseValues(std::initializer_list<double> v, Vals &&... vals)
const;
113 template<
typename... Vals>
114 void parseValues(
Variable & x, Vals &&... vals)
const;
117 template<
typename... Vals>
118 void parseValues_(
int i,
const Eigen::VectorXd & v, Vals &&... vals)
const;
119 template<
typename... Vals>
120 void parseValues_(
int i, std::initializer_list<double> v, Vals &&... vals)
const;
121 template<
typename... Vals>
122 void parseValues_(
Variable & x,
const Eigen::VectorXd & v, Vals &&... vals)
const;
123 template<
typename... Vals>
124 void parseValues_(
Variable & x, std::initializer_list<double> v, Vals &&... vals)
const;
128 void parseValues_(T)
const;
131 void parseValues_(
int i,
const Eigen::VectorXd & v)
const;
132 void parseValues_(
int i, std::initializer_list<double> v)
const;
133 void parseValues_(
Variable & x,
const Eigen::VectorXd & v)
const;
134 void parseValues_(
Variable & x, std::initializer_list<double> v)
const;
139 template<
typename... Vals>
140 void parseValuesAndVelocities(
const Eigen::VectorXd & v, Vals &&... vals)
const;
141 template<
typename... Vals>
142 void parseValuesAndVelocities(std::initializer_list<double> v, Vals &&... vals)
const;
143 template<
typename... Vals>
144 void parseValuesAndVelocities(
Variable & x, Vals &&... vals)
const;
147 template<
typename... Vals>
148 void parseValuesAndVelocities_(
int i,
149 const Eigen::VectorXd & val,
150 const Eigen::VectorXd & vel,
151 Vals &&... vals)
const;
152 template<
typename... Vals>
153 void parseValuesAndVelocities_(
int i,
154 const Eigen::VectorXd & val,
155 std::initializer_list<double> vel,
156 Vals &&... vals)
const;
157 template<
typename... Vals>
158 void parseValuesAndVelocities_(
int i,
159 std::initializer_list<double> val,
160 const Eigen::VectorXd & vel,
161 Vals &&... vals)
const;
162 template<
typename... Vals>
163 void parseValuesAndVelocities_(
int i,
164 std::initializer_list<double> val,
165 std::initializer_list<double> vel,
166 Vals &&... vals)
const;
167 template<
typename... Vals>
168 void parseValuesAndVelocities_(
Variable & x,
169 const Eigen::VectorXd & val,
170 const Eigen::VectorXd & vel,
171 Vals &&... vals)
const;
172 template<
typename... Vals>
173 void parseValuesAndVelocities_(
Variable & x,
174 const Eigen::VectorXd & val,
175 std::initializer_list<double> vel,
176 Vals &&... vals)
const;
177 template<
typename... Vals>
178 void parseValuesAndVelocities_(
Variable & x,
179 std::initializer_list<double> val,
180 const Eigen::VectorXd & vel,
181 Vals &&... vals)
const;
182 template<
typename... Vals>
183 void parseValuesAndVelocities_(
Variable & x,
184 std::initializer_list<double> val,
185 std::initializer_list<double> vel,
186 Vals &&... vals)
const;
190 void parseValuesAndVelocities_(T)
const;
192 void parseValuesAndVelocities_(
int, T)
const;
193 template<
typename T,
typename U>
194 void parseValuesAndVelocities_(T, U)
const;
197 void parseValuesAndVelocities_(
int i,
const Eigen::VectorXd & val,
const Eigen::VectorXd & vel)
const;
198 void parseValuesAndVelocities_(
int i,
const Eigen::VectorXd & val, std::initializer_list<double> vel)
const;
199 void parseValuesAndVelocities_(
int i, std::initializer_list<double> val,
const Eigen::VectorXd & vel)
const;
200 void parseValuesAndVelocities_(
int i, std::initializer_list<double> val, std::initializer_list<double> vel)
const;
201 void parseValuesAndVelocities_(
Variable & x,
const Eigen::VectorXd & val,
const Eigen::VectorXd & vel)
const;
202 void parseValuesAndVelocities_(
Variable & x,
const Eigen::VectorXd & val, std::initializer_list<double> vel)
const;
203 void parseValuesAndVelocities_(
Variable & x, std::initializer_list<double> val,
const Eigen::VectorXd & vel)
const;
204 void parseValuesAndVelocities_(
Variable & x,
205 std::initializer_list<double> val,
206 std::initializer_list<double> vel)
const;
215 std::vector<VariablePtr> dx_;
218 template<
typename... Vals>
222 if(f_->isOutputEnabled(Output::Value))
224 parseValues(std::forward<Vals>(vals)...);
230 throw std::runtime_error(
"Underlying function does not provide a value output.");
234 template<
typename... Vals>
236 Vals &&... vals)
const
239 if(f_->isOutputEnabled(Output::Jacobian))
241 parseValues(std::forward<Vals>(vals)...);
243 return f_->jacobian(x);
247 throw std::runtime_error(
"Underlying function does not provide a jacobian output.");
251 template<
typename... Vals>
255 if(f_->isOutputEnabled(Output::Velocity))
257 parseValuesAndVelocities(std::forward<Vals>(vals)...);
259 return f_->velocity();
263 throw std::runtime_error(
"Underlying function does not provide a velocity output.");
267 template<
typename... Vals>
271 if(f_->isOutputEnabled(Output::NormalAcceleration))
273 parseValuesAndVelocities(std::forward<Vals>(vals)...);
274 normalAccelerationGraph_.
execute();
275 return f_->normalAcceleration();
279 throw std::runtime_error(
"Underlying function does not provide a normalAcceleration output.");
283 template<
typename... Vals>
287 if(f_->isOutputEnabled(Output::JDot))
289 parseValuesAndVelocities(std::forward<Vals>(vals)...);
295 throw std::runtime_error(
"Underlying function does not provide a JDot output.");
299 template<
typename... Vals>
300 inline void UpdatelessFunction::parseValues(
const Eigen::VectorXd & v, Vals &&... vals)
const
301 { parseValues_(0, v, std::forward<Vals>(vals)...); }
303 template<
typename... Vals>
304 inline void UpdatelessFunction::parseValues(std::initializer_list<double> v, Vals &&... vals)
const
305 { parseValues_(0, v, std::forward<Vals>(vals)...); }
307 template<
typename... Vals>
308 inline void UpdatelessFunction::parseValues(Variable & x, Vals &&... vals)
const
309 { parseValues_(x, std::forward<Vals>(vals)...); }
311 template<
typename... Vals>
312 inline void UpdatelessFunction::parseValues_(
int i,
const Eigen::VectorXd & v, Vals &&... vals)
const
315 parseValues_(i + 1, std::forward<Vals>(vals)...);
318 template<
typename... Vals>
319 inline void UpdatelessFunction::parseValues_(
int i, std::initializer_list<double> v, Vals &&... vals)
const
320 { parseValues_(i, toVec(v), std::forward<Vals>(vals)...); }
322 template<
typename... Vals>
323 inline void UpdatelessFunction::parseValues_(Variable & x,
const Eigen::VectorXd & v, Vals &&... vals)
const
326 parseValues_(std::forward<Vals>(vals)...);
329 template<
typename... Vals>
330 inline void UpdatelessFunction::parseValues_(Variable & x, std::initializer_list<double> v, Vals &&... vals)
const
331 { parseValues_(x, toVec(v), std::forward<Vals>(vals)...); }
334 inline void UpdatelessFunction::parseValues_(T)
const
338 "Incorrect number of argument. You likely did not observe the alternation between variables and values.");
341 template<
typename... Vals>
342 inline void UpdatelessFunction::parseValuesAndVelocities(
const Eigen::VectorXd & v, Vals &&... vals)
const
343 { parseValuesAndVelocities_(0, v, std::forward<Vals>(vals)...); }
345 template<
typename... Vals>
346 inline void UpdatelessFunction::parseValuesAndVelocities(std::initializer_list<double> v, Vals &&... vals)
const
347 { parseValuesAndVelocities_(0, v, std::forward<Vals>(vals)...); }
349 template<
typename... Vals>
350 inline void UpdatelessFunction::parseValuesAndVelocities(Variable & x, Vals &&... vals)
const
351 { parseValuesAndVelocities_(x, std::forward<Vals>(vals)...); }
353 template<
typename... Vals>
354 inline void UpdatelessFunction::parseValuesAndVelocities_(
int i,
355 const Eigen::VectorXd & val,
356 const Eigen::VectorXd & vel,
357 Vals &&... vals)
const
359 assign(i, val,
true);
360 assign(i, vel,
false);
361 parseValuesAndVelocities_(i + 1, std::forward<Vals>(vals)...);
364 template<
typename... Vals>
365 inline void UpdatelessFunction::parseValuesAndVelocities_(
int i,
366 const Eigen::VectorXd & val,
367 std::initializer_list<double> vel,
368 Vals &&... vals)
const
369 { parseValuesAndVelocities_(i, val, toVec(vel), std::forward<Vals>(vals)...); }
371 template<
typename... Vals>
372 inline void UpdatelessFunction::parseValuesAndVelocities_(
int i,
373 std::initializer_list<double> val,
374 const Eigen::VectorXd & vel,
375 Vals &&... vals)
const
376 { parseValuesAndVelocities_(i, toVec(val), vel, std::forward<Vals>(vals)...); }
378 template<
typename... Vals>
379 inline void UpdatelessFunction::parseValuesAndVelocities_(
int i,
380 std::initializer_list<double> val,
381 std::initializer_list<double> vel,
382 Vals &&... vals)
const
383 { parseValuesAndVelocities_(i, toVec(val), toVec(vel), std::forward<Vals>(vals)...); }
385 template<
typename... Vals>
386 inline void UpdatelessFunction::parseValuesAndVelocities_(Variable & x,
387 const Eigen::VectorXd & val,
388 const Eigen::VectorXd & vel,
389 Vals &&... vals)
const
391 assign(x, val,
true);
392 assign(x, vel,
false);
393 parseValuesAndVelocities_(std::forward<Vals>(vals)...);
396 template<
typename... Vals>
397 inline void UpdatelessFunction::parseValuesAndVelocities_(Variable & x,
398 const Eigen::VectorXd & val,
399 std::initializer_list<double> vel,
400 Vals &&... vals)
const
401 { parseValuesAndVelocities_(x, val, toVec(vel), std::forward<Vals>(vals)...); }
403 template<
typename... Vals>
404 inline void UpdatelessFunction::parseValuesAndVelocities_(Variable & x,
405 std::initializer_list<double> val,
406 const Eigen::VectorXd & vel,
407 Vals &&... vals)
const
408 { parseValuesAndVelocities_(x, toVec(val), vel, std::forward<Vals>(vals)...); }
410 template<
typename... Vals>
411 inline void UpdatelessFunction::parseValuesAndVelocities_(Variable & x,
412 std::initializer_list<double> val,
413 std::initializer_list<double> vel,
414 Vals &&... vals)
const
415 { parseValuesAndVelocities_(x, toVec(val), toVec(vel), std::forward<Vals>(vals)...); }
418 inline void UpdatelessFunction::parseValuesAndVelocities_(T)
const
421 "alternation between variables, values and velocities.");
425 inline void UpdatelessFunction::parseValuesAndVelocities_(
int, T)
const
428 "Incorrect number of argument. You likely forgot a value or velocity.");
431 template<
typename T,
typename U>
432 inline void UpdatelessFunction::parseValuesAndVelocities_(T, U)
const
435 "alternation between variables, values and velocities.");
#define TVM_DLLAPI
Definition: api.h:35
Definition: VariableVector.h:41
const std::vector< VariablePtr > & variables() const
Definition: Variable.h:49
Definition: CallGraph.h:23
void execute() const
Definition: CallGraph.h:32
Definition: MatrixWithProperties.h:54
Definition: UpdatelessFunction.h:24
const Eigen::VectorXd & normalAcceleration(Vals &&... vals) const
Definition: UpdatelessFunction.h:268
UpdatelessFunction(FunctionPtr f)
const Eigen::VectorXd & value(Vals &&... vals) const
Definition: UpdatelessFunction.h:219
const VariableVector & variables() const noexcept
Definition: UpdatelessFunction.h:30
tvm::internal::MatrixConstRefWithProperties JDot(const Variable &x, Vals &&... vals) const
Definition: UpdatelessFunction.h:284
tvm::internal::MatrixConstRefWithProperties jacobian(const Variable &x, Vals &&... vals) const
Definition: UpdatelessFunction.h:235
const Eigen::VectorXd & velocity(Vals &&... vals) const
Definition: UpdatelessFunction.h:252
std::shared_ptr< function::abstract::Function > FunctionPtr
Definition: defs.h:57