17 namespace algo {
namespace ad {
27 template<
typename E1,
typename E2>
61 return detail::getValue(_e1) + detail::getValue(_e2);
70 return detail::getValue(_e1) + detail::getValue(_e2);
77 decltype(detail::dual_add_function(E1(), E2()))
80 return detail::dual_add_function(_e1, _e2);
88 decltype(detail::dual_add_function(E1(), E2()))
91 return detail::dual_add_function(_e1, _e2);
97 const_closure1_type _e1;
98 const_closure2_type _e2;
111 template<
typename E1,
typename E2>
114 const dual_expression<E1>& e1,
115 const dual_expression<E2>& e2)
117 return dual_add<E1, E2>(e1(), e2());
128 template<
typename E2>
132 const dual_expression<E2>& e2)
134 return dual_add<double, E2>(e1, e2());
145 template<
typename E1>
148 const dual_expression<E1>& e1,
151 return dual_add<E1, double>(e1(), e2);
156 template<
typename E1,
typename E2>
190 return detail::getValue(_e1) - detail::getValue(_e2);
199 return detail::getValue(_e1) - detail::getValue(_e2);
206 decltype(detail::dual_minus_function(E1(), E2()))
209 return detail::dual_minus_function(_e1, _e2);
216 decltype(detail::dual_minus_function(E1(), E2()))
219 return detail::dual_minus_function(_e1, _e2);
225 const_closure1_type _e1;
226 const_closure2_type _e2;
238 template<
typename E1,
typename E2>
241 const dual_expression<E1>& e1,
242 const dual_expression<E2>& e2)
244 return dual_minus<E1, E2>(e1(), e2());
255 template<
typename E2>
256 dual_minus<double, E2>
259 const dual_expression<E2>& e2)
261 return dual_minus<double, E2>(e1, e2());
272 template<
typename E1>
273 dual_minus<E1, double>
275 const dual_expression<E1>& e1,
278 return dual_minus<E1, double>(e1(), e2);
289 template<
typename E1,
typename E2>
323 return detail::getValue(_e1) * detail::getValue(_e2);
332 return detail::getValue(_e1) * detail::getValue(_e2);
339 decltype(detail::dual_multiplies_function(E1(), E2()))
342 return detail::dual_multiplies_function(_e1, _e2);
349 decltype(detail::dual_multiplies_function(E1(), E2()))
352 return detail::dual_multiplies_function(_e1, _e2);
358 const_closure1_type _e1;
359 const_closure2_type _e2;
371 template<
typename E1,
typename E2>
372 dual_multiplies<E1, E2>
374 const dual_expression<E1>& e1,
375 const dual_expression<E2>& e2)
377 return dual_multiplies<E1, E2>(e1(), e2());
388 template<
typename E2>
389 dual_multiplies<double, E2>
392 const dual_expression<E2>& e2)
394 return dual_multiplies<double, E2>(e1, e2());
405 template<
typename E1>
406 dual_multiplies<E1, double>
408 const dual_expression<E1>& e1,
411 return dual_multiplies<E1, double>(e1(), e2);
422 template<
typename E1,
typename E2>
456 return detail::getValue(_e1) / detail::getValue(_e2);
465 return detail::getValue(_e1) / detail::getValue(_e2);
472 decltype(detail::dual_divide_function(E1(), E2()))
475 return detail::dual_divide_function(_e1, _e2);
482 decltype(detail::dual_divide_function(E1(), E2()))
485 return detail::dual_divide_function(_e1, _e2);
491 const_closure1_type _e1;
492 const_closure2_type _e2;
504 template<
typename E1,
typename E2>
507 const dual_expression<E1>& e1,
508 const dual_expression<E2>& e2)
510 return dual_divide<E1, E2>(e1(), e2());
521 template<
typename E2>
522 dual_divide<double, E2>
525 const dual_expression<E2>& e2)
527 return dual_divide<double, E2>(e1, e2());
538 template<
typename E1>
539 dual_divide<E1, double>
541 const dual_expression<E1>& e1,
544 return dual_divide<E1, double>(e1(), e2);
dual_multiplies()
the constructor is required by dual_expression.
Definition: dual_binary_operator.hpp:302
dual_minus(const E1 &e1, const E2 &e2)
Definition: dual_binary_operator.hpp:179
decltype(detail::dual_divide_function(E1(), E2())) getDerivative()
Definition: dual_binary_operator.hpp:473
decltype(detail::dual_multiplies_function(E1(), E2())) getDerivative()
Definition: dual_binary_operator.hpp:340
decltype(detail::dual_minus_function(E1(), E2())) getDerivative()
Definition: dual_binary_operator.hpp:207
double getValue()
Definition: dual_binary_operator.hpp:454
double getValue()
Definition: dual_binary_operator.hpp:59
Definition: dual_binary_operator.hpp:157
dual_divide(const E1 &e1, const E2 &e2)
Definition: dual_binary_operator.hpp:445
double getValue() const
Definition: dual_binary_operator.hpp:330
double getValue()
Definition: dual_binary_operator.hpp:188
dual_divide()
the constructor is required.
Definition: dual_binary_operator.hpp:435
Definition: dual_binary_operator.hpp:423
decltype(detail::dual_add_function(E1(), E2())) getDerivative()
Definition: dual_binary_operator.hpp:78
double getValue() const
Definition: dual_binary_operator.hpp:463
dual_add()
the constructor is required by getDerivative.
Definition: dual_binary_operator.hpp:40
Definition: dual_expression.hpp:19
double getValue()
Definition: dual_binary_operator.hpp:321
dual_add(const E1 &e1, const E2 &e2)
Definition: dual_binary_operator.hpp:50
Definition: ublas_matrix_expression_concept.hpp:5
Definition: dual_binary_operator.hpp:28
dual_multiplies(const E1 &e1, const E2 &e2)
Definition: dual_binary_operator.hpp:312
double getValue() const
Definition: dual_binary_operator.hpp:68
helper functions for binary operators.
double getValue() const
Definition: dual_binary_operator.hpp:197
Definition: dual_binary_operator.hpp:290
dual_minus()
the constructor is required by getDerivative.
Definition: dual_binary_operator.hpp:169