TVM  0.9.4
UpdatelessFunction.h
Go to the documentation of this file.
1 
3 #pragma once
4 
6 #include <tvm/graph/CallGraph.h>
7 #include <tvm/internal/meta.h>
8 
9 #include <algorithm>
10 #include <initializer_list>
11 
12 namespace tvm
13 {
14 
15 namespace utils
16 {
17 
24 {
25 public:
28 
30  inline const VariableVector & variables() const noexcept { return f_->variables(); }
31 
33  inline const FunctionPtr & function() const noexcept { return f_; }
34 
49  template<typename... Vals>
50  const Eigen::VectorXd & value(Vals &&... vals) const;
51 
55  template<typename... Vals>
56  tvm::internal::MatrixConstRefWithProperties jacobian(const Variable & x, Vals &&... vals) const;
57 
76  template<typename... Vals>
77  const Eigen::VectorXd & velocity(Vals &&... vals) const;
78 
84  template<typename... Vals>
85  const Eigen::VectorXd & normalAcceleration(Vals &&... vals) const;
86 
92  template<typename... Vals>
93  tvm::internal::MatrixConstRefWithProperties JDot(const Variable & x, Vals &&... vals) const;
94 
95 private:
96  static Eigen::VectorXd toVec(std::initializer_list<double> val);
97 
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;
101 
103  void assign(const Eigen::VectorXd & val) const;
104  void assign(const Eigen::VectorXd & val, const Eigen::VectorXd & vel) const;
105 
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;
115 
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;
125 
127  template<typename T>
128  void parseValues_(T) const;
129 
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;
135 
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;
145 
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;
187 
189  template<typename T>
190  void parseValuesAndVelocities_(T) const;
191  template<typename T>
192  void parseValuesAndVelocities_(int, T) const;
193  template<typename T, typename U>
194  void parseValuesAndVelocities_(T, U) const;
195 
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;
207 
208  FunctionPtr f_;
209  tvm::graph::CallGraph valueGraph_;
210  tvm::graph::CallGraph jacobianGraph_;
211  tvm::graph::CallGraph velocityGraph_;
212  tvm::graph::CallGraph normalAccelerationGraph_;
213  tvm::graph::CallGraph JDotGraph_;
214  // ensure that derivative will exist.
215  std::vector<VariablePtr> dx_;
216 };
217 
218 template<typename... Vals>
219 inline const Eigen::VectorXd & UpdatelessFunction::value(Vals &&... vals) const
220 {
222  if(f_->isOutputEnabled(Output::Value))
223  {
224  parseValues(std::forward<Vals>(vals)...);
225  valueGraph_.execute();
226  return f_->value();
227  }
228  else
229  {
230  throw std::runtime_error("Underlying function does not provide a value output.");
231  }
232 }
233 
234 template<typename... Vals>
236  Vals &&... vals) const
237 {
239  if(f_->isOutputEnabled(Output::Jacobian))
240  {
241  parseValues(std::forward<Vals>(vals)...);
242  jacobianGraph_.execute();
243  return f_->jacobian(x);
244  }
245  else
246  {
247  throw std::runtime_error("Underlying function does not provide a jacobian output.");
248  }
249 }
250 
251 template<typename... Vals>
252 inline const Eigen::VectorXd & UpdatelessFunction::velocity(Vals &&... vals) const
253 {
255  if(f_->isOutputEnabled(Output::Velocity))
256  {
257  parseValuesAndVelocities(std::forward<Vals>(vals)...);
258  velocityGraph_.execute();
259  return f_->velocity();
260  }
261  else
262  {
263  throw std::runtime_error("Underlying function does not provide a velocity output.");
264  }
265 }
266 
267 template<typename... Vals>
268 inline const Eigen::VectorXd & UpdatelessFunction::normalAcceleration(Vals &&... vals) const
269 {
271  if(f_->isOutputEnabled(Output::NormalAcceleration))
272  {
273  parseValuesAndVelocities(std::forward<Vals>(vals)...);
274  normalAccelerationGraph_.execute();
275  return f_->normalAcceleration();
276  }
277  else
278  {
279  throw std::runtime_error("Underlying function does not provide a normalAcceleration output.");
280  }
281 }
282 
283 template<typename... Vals>
285 {
287  if(f_->isOutputEnabled(Output::JDot))
288  {
289  parseValuesAndVelocities(std::forward<Vals>(vals)...);
290  JDotGraph_.execute();
291  return f_->JDot(x);
292  }
293  else
294  {
295  throw std::runtime_error("Underlying function does not provide a JDot output.");
296  }
297 }
298 
299 template<typename... Vals>
300 inline void UpdatelessFunction::parseValues(const Eigen::VectorXd & v, Vals &&... vals) const
301 { parseValues_(0, v, std::forward<Vals>(vals)...); }
302 
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)...); }
306 
307 template<typename... Vals>
308 inline void UpdatelessFunction::parseValues(Variable & x, Vals &&... vals) const
309 { parseValues_(x, std::forward<Vals>(vals)...); }
310 
311 template<typename... Vals>
312 inline void UpdatelessFunction::parseValues_(int i, const Eigen::VectorXd & v, Vals &&... vals) const
313 {
314  assign(i, v, true);
315  parseValues_(i + 1, std::forward<Vals>(vals)...);
316 }
317 
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)...); }
321 
322 template<typename... Vals>
323 inline void UpdatelessFunction::parseValues_(Variable & x, const Eigen::VectorXd & v, Vals &&... vals) const
324 {
325  assign(x, v, true);
326  parseValues_(std::forward<Vals>(vals)...);
327 }
328 
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)...); }
332 
333 template<typename T>
334 inline void UpdatelessFunction::parseValues_(T) const
335 {
336  static_assert(
338  "Incorrect number of argument. You likely did not observe the alternation between variables and values.");
339 }
340 
341 template<typename... Vals>
342 inline void UpdatelessFunction::parseValuesAndVelocities(const Eigen::VectorXd & v, Vals &&... vals) const
343 { parseValuesAndVelocities_(0, v, std::forward<Vals>(vals)...); }
344 
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)...); }
348 
349 template<typename... Vals>
350 inline void UpdatelessFunction::parseValuesAndVelocities(Variable & x, Vals &&... vals) const
351 { parseValuesAndVelocities_(x, std::forward<Vals>(vals)...); }
352 
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
358 {
359  assign(i, val, true);
360  assign(i, vel, false);
361  parseValuesAndVelocities_(i + 1, std::forward<Vals>(vals)...);
362 }
363 
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)...); }
370 
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)...); }
377 
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)...); }
384 
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
390 {
391  assign(x, val, true);
392  assign(x, vel, false);
393  parseValuesAndVelocities_(std::forward<Vals>(vals)...);
394 }
395 
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)...); }
402 
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)...); }
409 
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)...); }
416 
417 template<typename T>
418 inline void UpdatelessFunction::parseValuesAndVelocities_(T) const
419 {
420  static_assert(::tvm::internal::always_false<T>::value, "Incorrect number of argument. You likely did not observe the "
421  "alternation between variables, values and velocities.");
422 }
423 
424 template<typename T>
425 inline void UpdatelessFunction::parseValuesAndVelocities_(int, T) const
426 {
428  "Incorrect number of argument. You likely forgot a value or velocity.");
429 }
430 
431 template<typename T, typename U>
432 inline void UpdatelessFunction::parseValuesAndVelocities_(T, U) const
433 {
434  static_assert(::tvm::internal::always_false<T>::value, "Incorrect number of argument. You likely did not observe the "
435  "alternation between variables, values and velocities.");
436 }
437 
438 } // namespace utils
439 
440 } // namespace tvm
#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: meta.h:91
Definition: UpdatelessFunction.h:24
const Eigen::VectorXd & normalAcceleration(Vals &&... vals) const
Definition: UpdatelessFunction.h:268
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
Definition: Clock.h:12
std::shared_ptr< function::abstract::Function > FunctionPtr
Definition: defs.h:57