Algorith sandbox
dual_unary_operator.hpp
Go to the documentation of this file.
1 
9 #pragma once
13 #include "algo/ad/fwd.h"
14 #include "algo/ad/traits.hpp"
15 
16 namespace algo { namespace ad {
17  /*--------------------------------------------------------------------------
18  * dual_negate
19  *------------------------------------------------------------------------*/
25  template<typename E>
26  class dual_negate : public dual_expression<dual_negate<E> > {
27  //private typedef
28  private:
29  //public typedef
30  public:
31  typedef typename const_closure_type_traits<E>::type const_closure_type;
32  //public function
33  public:
38  : _e(0)
39  {
40  }
46  dual_negate(const E& e)
47  : _e(e)
48  {
49  }
55  double getValue()
56  {
57  return -detail::getValue(_e);
58  }
64  double getValue() const
65  {
66  return -detail::getValue(_e);
67  }
73  decltype(detail::dual_negate_helper(E()))
75  {
76  return detail::dual_negate_helper(_e);
77  }
83  decltype(detail::dual_negate_helper(E()))
84  getDerivative() const
85  {
86  return detail::dual_negate_helper(_e);
87  }
88  //private function
89  private:
90  //private members
91  private:
92  const_closure_type _e;
93  };
102  template<typename E>
103  dual_negate<E> operator -(const dual_expression<E>& e)
104  {
105  return dual_negate<E>(e());
106  }
107  /*--------------------------------------------------------------------------
108  * dual_exp
109  *------------------------------------------------------------------------*/
115  template<typename E>
116  class dual_exp : public dual_expression<dual_exp<E> > {
117  //private typedef
118  private:
119  //public typedef
120  public:
121  typedef typename const_closure_type_traits<E>::type const_closure_type;
122  //public function
123  public:
128  : _e(0)
129  {
130  }
136  dual_exp(const E& e)
137  : _e(e)
138  {
139  }
145  double getValue()
146  {
147  return std::exp(detail::getValue(_e));
148  }
154  double getValue() const
155  {
156  return std::exp(detail::getValue(_e));
157  }
163  decltype(detail::dual_exp_helper(E()))
165  {
166  return detail::dual_exp_helper(_e);
167  }
173  decltype(detail::dual_exp_helper(E()))
175  {
176  return detail::dual_exp_helper(_e);
177  }
178  //private function
179  private:
180  //private members
181  private:
182  const_closure_type _e;
183  };
192  template<typename E>
193  dual_exp<E> exp(const dual_expression<E>& e)
194  {
195  return dual_exp<E>(e());
196  }
197  /*--------------------------------------------------------------------------
198  * dual_log
199  *------------------------------------------------------------------------*/
205  template<typename E>
206  class dual_log : public dual_expression<dual_log<E> > {
207  //private typedef
208  private:
209  //public typedef
210  public:
211  typedef typename const_closure_type_traits<E>::type const_closure_type;
212  //public function
213  public:
218  : _e(0)
219  {
220  }
226  dual_log(const E& e)
227  : _e(e)
228  {
229  }
235  double getValue()
236  {
237  return std::log(detail::getValue(_e));
238  }
244  double getValue() const
245  {
246  return std::log(detail::getValue(_e));
247  }
253  decltype(detail::dual_log_helper(E()))
255  {
256  return detail::dual_log_helper(_e);
257  }
263  decltype(detail::dual_log_helper(E()))
265  {
266  return detail::dual_log_helper(_e);
267  }
268  //private function
269  private:
270  //private members
271  private:
272  const_closure_type _e;
273  };
282  template<typename E>
283  dual_log<E> log(const dual_expression<E>& e)
284  {
285  return dual_log<E>(e());
286  }
287  /*--------------------------------------------------------------------------
288  * dual_sin
289  *------------------------------------------------------------------------*/
295  template<typename E>
296  class dual_sin : public dual_expression<dual_sin<E> > {
297  //private typedef
298  private:
299  //public typedef
300  public:
301  typedef typename const_closure_type_traits<E>::type const_closure_type;
302  //public function
303  public:
308  : _e(0)
309  {
310  }
316  dual_sin(const E& e)
317  : _e(e)
318  {
319  }
325  double getValue()
326  {
327  return std::sin(detail::getValue(_e));
328  }
334  double getValue() const
335  {
336  return std::sin(detail::getValue(_e));
337  }
343  decltype(detail::dual_sin_helper(E()))
345  {
346  return detail::dual_sin_helper(_e);
347  }
353  decltype(detail::dual_sin_helper(E()))
355  {
356  return detail::dual_sin_helper(_e);
357  }
358  //private function
359  private:
360  //private members
361  private:
362  const_closure_type _e;
363  };
372  template<typename E>
373  dual_sin<E> sin(const dual_expression<E>& e)
374  {
375  return dual_sin<E>(e());
376  }
377  /*--------------------------------------------------------------------------
378  * dual_cos
379  *------------------------------------------------------------------------*/
385  template<typename E>
386  class dual_cos : public dual_expression<dual_cos<E> > {
387  //private typedef
388  private:
389  //public typedef
390  public:
391  typedef typename const_closure_type_traits<E>::type const_closure_type;
392  //public function
393  public:
398  : _e(0)
399  {
400  }
406  dual_cos(const E& e)
407  : _e(e)
408  {
409  }
415  double getValue()
416  {
417  return std::cos(detail::getValue(_e));
418  }
424  double getValue() const
425  {
426  return std::cos(detail::getValue(_e));
427  }
433  decltype(detail::dual_cos_helper(E()))
435  {
436  return detail::dual_cos_helper(_e);
437  }
443  decltype(detail::dual_cos_helper(E()))
445  {
446  return detail::dual_cos_helper(_e);
447  }
448  //private function
449  private:
450  //private members
451  private:
452  const_closure_type _e;
453  };
462  template<typename E>
463  dual_cos<E> cos(const dual_expression<E>& e)
464  {
465  return dual_cos<E>(e());
466  }
467 } } // namespace algo { namespace ad {
double getValue()
Definition: dual_unary_operator.hpp:145
dual_expression class.
decltype(detail::dual_log_helper(E())) getDerivative()
Definition: dual_unary_operator.hpp:254
dual_exp()
requires.
Definition: dual_unary_operator.hpp:127
decltype(detail::dual_exp_helper(E())) getDerivative()
Definition: dual_unary_operator.hpp:164
double getValue() const
Definition: dual_unary_operator.hpp:334
dual_negate()
the constructor is required.
Definition: dual_unary_operator.hpp:37
dual_sin()
the constructor is required.
Definition: dual_unary_operator.hpp:307
Definition: dual_unary_operator.hpp:116
Definition: dual_unary_operator.hpp:206
decltype(detail::dual_cos_helper(E())) getDerivative()
Definition: dual_unary_operator.hpp:434
decltype(detail::dual_negate_helper(E())) getDerivative()
Definition: dual_unary_operator.hpp:74
dual_negate(const E &e)
Definition: dual_unary_operator.hpp:46
double getValue() const
Definition: dual_unary_operator.hpp:424
forward declarations.
helper funtions.
Definition: dual_unary_operator.hpp:296
dual_exp(const E &e)
Definition: dual_unary_operator.hpp:136
double getValue()
Definition: dual_unary_operator.hpp:415
dual_cos(const E &e)
Definition: dual_unary_operator.hpp:406
dual_cos()
the constructor is required.
Definition: dual_unary_operator.hpp:397
dual_log()
the constructor is required.
Definition: dual_unary_operator.hpp:217
Definition: dual_expression.hpp:19
double getValue() const
Definition: dual_unary_operator.hpp:154
Definition: dual_unary_operator.hpp:386
Definition: ublas_matrix_expression_concept.hpp:5
double getValue()
Definition: dual_unary_operator.hpp:55
double getValue() const
Definition: dual_unary_operator.hpp:64
dual_sin(const E &e)
Definition: dual_unary_operator.hpp:316
double getValue()
Definition: dual_unary_operator.hpp:235
decltype(detail::dual_sin_helper(E())) getDerivative()
Definition: dual_unary_operator.hpp:344
dual_log(const E &e)
Definition: dual_unary_operator.hpp:226
double getValue()
Definition: dual_unary_operator.hpp:325
Definition: dual_unary_operator.hpp:26
double getValue() const
Definition: dual_unary_operator.hpp:244