Algorith sandbox
dual_binary_operator.hpp
Go to the documentation of this file.
1 
9 #pragma once
12 #include "algo/ad/dual.hpp"
14 #include "algo/ad/fwd.h"
15 #include "algo/ad/traits.hpp"
16 
17 namespace algo { namespace ad {
18  /*--------------------------------------------------------------------------
19  * dual_add
20  *------------------------------------------------------------------------*/
27  template<typename E1, typename E2>
28  class dual_add : public dual_expression<dual_add<E1, E2> > {
29  //private typedef
30  private:
31  //public typedef
32  public:
33  typedef typename const_closure_type_traits<E1>::type const_closure1_type;
34  typedef typename const_closure_type_traits<E2>::type const_closure2_type;
35  //public function
36  public:
41  : _e1(0), _e2(0)
42  {
43  }
50  dual_add(const E1& e1, const E2& e2)
51  : _e1(e1), _e2(e2)
52  {
53  }
59  double getValue()
60  {
61  return detail::getValue(_e1) + detail::getValue(_e2);
62  }
68  double getValue() const
69  {
70  return detail::getValue(_e1) + detail::getValue(_e2);
71  }
77  decltype(detail::dual_add_function(E1(), E2()))
79  {
80  return detail::dual_add_function(_e1, _e2);
81  }
82 
88  decltype(detail::dual_add_function(E1(), E2()))
89  getDerivative() const
90  {
91  return detail::dual_add_function(_e1, _e2);
92  }
93  //private function
94  private:
95  //private members
96  private:
97  const_closure1_type _e1;
98  const_closure2_type _e2;
99  };
100 
111  template<typename E1, typename E2>
112  dual_add<E1, E2>
113  operator +(
114  const dual_expression<E1>& e1,
115  const dual_expression<E2>& e2)
116  {
117  return dual_add<E1, E2>(e1(), e2());
118  }
128  template<typename E2>
129  dual_add<double, E2>
130  operator +(
131  const double e1,
132  const dual_expression<E2>& e2)
133  {
134  return dual_add<double, E2>(e1, e2());
135  }
145  template<typename E1>
146  dual_add<E1, double>
147  operator +(
148  const dual_expression<E1>& e1,
149  const double e2)
150  {
151  return dual_add<E1, double>(e1(), e2);
152  }
153  /*--------------------------------------------------------------------------
154  * dual_minus
155  *------------------------------------------------------------------------*/
156  template<typename E1, typename E2>
157  class dual_minus : public dual_expression<dual_minus<E1, E2> > {
158  //private typedef
159  private:
160  //public typedef
161  public:
162  typedef typename const_closure_type_traits<E1>::type const_closure1_type;
163  typedef typename const_closure_type_traits<E2>::type const_closure2_type;
164  //public function
165  public:
170  : _e1(0), _e2(0)
171  {
172  }
179  dual_minus(const E1& e1, const E2& e2)
180  : _e1(e1), _e2(e2)
181  {
182  }
188  double getValue()
189  {
190  return detail::getValue(_e1) - detail::getValue(_e2);
191  }
197  double getValue() const
198  {
199  return detail::getValue(_e1) - detail::getValue(_e2);
200  }
206  decltype(detail::dual_minus_function(E1(), E2()))
208  {
209  return detail::dual_minus_function(_e1, _e2);
210  }
216  decltype(detail::dual_minus_function(E1(), E2()))
218  {
219  return detail::dual_minus_function(_e1, _e2);
220  }
221  //private function
222  private:
223  //private members
224  private:
225  const_closure1_type _e1;
226  const_closure2_type _e2;
227  };
238  template<typename E1, typename E2>
239  dual_minus<E1, E2>
240  operator -(
241  const dual_expression<E1>& e1,
242  const dual_expression<E2>& e2)
243  {
244  return dual_minus<E1, E2>(e1(), e2());
245  }
255  template<typename E2>
256  dual_minus<double, E2>
257  operator -(
258  const double e1,
259  const dual_expression<E2>& e2)
260  {
261  return dual_minus<double, E2>(e1, e2());
262  }
272  template<typename E1>
273  dual_minus<E1, double>
274  operator -(
275  const dual_expression<E1>& e1,
276  const double e2)
277  {
278  return dual_minus<E1, double>(e1(), e2);
279  }
280  /*--------------------------------------------------------------------------
281  * dual_multiplies
282  *------------------------------------------------------------------------*/
289  template<typename E1, typename E2>
290  class dual_multiplies : public dual_expression<dual_multiplies<E1, E2> > {
291  //private typedef
292  private:
293  //public typedef
294  public:
295  typedef typename const_closure_type_traits<E1>::type const_closure1_type;
296  typedef typename const_closure_type_traits<E2>::type const_closure2_type;
297  //public function
298  public:
303  : _e1(0), _e2(0)
304  {
305  }
312  dual_multiplies(const E1& e1, const E2& e2)
313  : _e1(e1), _e2(e2)
314  {
315  }
321  double getValue()
322  {
323  return detail::getValue(_e1) * detail::getValue(_e2);
324  }
330  double getValue() const
331  {
332  return detail::getValue(_e1) * detail::getValue(_e2);
333  }
339  decltype(detail::dual_multiplies_function(E1(), E2()))
341  {
342  return detail::dual_multiplies_function(_e1, _e2);
343  }
349  decltype(detail::dual_multiplies_function(E1(), E2()))
351  {
352  return detail::dual_multiplies_function(_e1, _e2);
353  }
354  //private function
355  private:
356  //private members
357  private:
358  const_closure1_type _e1;
359  const_closure2_type _e2;
360  };
371  template<typename E1, typename E2>
372  dual_multiplies<E1, E2>
373  operator *(
374  const dual_expression<E1>& e1,
375  const dual_expression<E2>& e2)
376  {
377  return dual_multiplies<E1, E2>(e1(), e2());
378  }
388  template<typename E2>
389  dual_multiplies<double, E2>
390  operator *(
391  const double e1,
392  const dual_expression<E2>& e2)
393  {
394  return dual_multiplies<double, E2>(e1, e2());
395  }
405  template<typename E1>
406  dual_multiplies<E1, double>
407  operator *(
408  const dual_expression<E1>& e1,
409  const double e2)
410  {
411  return dual_multiplies<E1, double>(e1(), e2);
412  }
413  /*--------------------------------------------------------------------------
414  * dual_divide
415  *------------------------------------------------------------------------*/
422  template<typename E1, typename E2>
423  class dual_divide : public dual_expression<dual_divide<E1, E2> > {
424  //private typedef
425  private:
426  //public typedef
427  public:
428  typedef typename const_closure_type_traits<E1>::type const_closure1_type;
429  typedef typename const_closure_type_traits<E2>::type const_closure2_type;
430  //public function
431  public:
436  : _e1(0), _e2(0)
437  {
438  }
445  dual_divide(const E1& e1, const E2& e2)
446  : _e1(e1), _e2(e2)
447  {
448  }
454  double getValue()
455  {
456  return detail::getValue(_e1) / detail::getValue(_e2);
457  }
463  double getValue() const
464  {
465  return detail::getValue(_e1) / detail::getValue(_e2);
466  }
472  decltype(detail::dual_divide_function(E1(), E2()))
474  {
475  return detail::dual_divide_function(_e1, _e2);
476  }
482  decltype(detail::dual_divide_function(E1(), E2()))
484  {
485  return detail::dual_divide_function(_e1, _e2);
486  }
487  //private function
488  private:
489  //private members
490  private:
491  const_closure1_type _e1;
492  const_closure2_type _e2;
493  };
504  template<typename E1, typename E2>
505  dual_divide<E1, E2>
506  operator /(
507  const dual_expression<E1>& e1,
508  const dual_expression<E2>& e2)
509  {
510  return dual_divide<E1, E2>(e1(), e2());
511  }
521  template<typename E2>
522  dual_divide<double, E2>
523  operator /(
524  const double e1,
525  const dual_expression<E2>& e2)
526  {
527  return dual_divide<double, E2>(e1, e2());
528  }
538  template<typename E1>
539  dual_divide<E1, double>
540  operator /(
541  const dual_expression<E1>& e1,
542  const double e2)
543  {
544  return dual_divide<E1, double>(e1(), e2);
545  }
546 } } // namespace algo { namespace ad {
dual_multiplies()
the constructor is required by dual_expression.
Definition: dual_binary_operator.hpp:302
dual_expression class.
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
forward declarations.
helper funtions.
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
dual class.
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