Algorith sandbox
dual_binary_operator_helper.hpp
Go to the documentation of this file.
1 
9 #pragma once
10 
11 namespace algo { namespace ad { namespace detail {
12  /*--------------------------------------------------------------------------
13  * dual_add_function
14  *------------------------------------------------------------------------*/
25  template<typename E1, typename E2>
26  auto dual_add_function(const dual_expression<E1>& e1, const dual_expression<E2>& e2)
27  -> decltype(e1().getDerivative() + e2().getDerivative())
28  {
29  return e1().getDerivative() + e2().getDerivative();
30  }
40  template<typename E2>
41  auto dual_add_function(const double e1, const dual_expression<E2>& e2)
42  -> decltype(e2().getDerivative())
43  {
44  return e2().getDerivative();
45  }
55  template<typename E1>
56  auto dual_add_function(const dual_expression<E1>& e1, const double e2)
57  -> decltype(e1().getDerivative())
58  {
59  return e1().getDerivative();
60  }
61  /*--------------------------------------------------------------------------
62  * dual_minus_function
63  *------------------------------------------------------------------------*/
74  template<typename E1, typename E2>
75  auto dual_minus_function(const dual_expression<E1>& e1, const dual_expression<E2>& e2)
76  -> decltype(e1().getDerivative() - e2().getDerivative())
77  {
78  return e1().getDerivative() - e2().getDerivative();
79  }
89  template<typename E2>
90  auto dual_minus_function(const double e1, const dual_expression<E2>& e2)
91  -> decltype(e2().getDerivative())
92  {
93  return e2().getDerivative();
94  }
104  template<typename E1>
105  auto dual_minus_function(const dual_expression<E1>& e1, const double e2)
106  -> decltype(e1().getDerivative())
107  {
108  return e1().getDerivative();
109  }
110  /*--------------------------------------------------------------------------
111  * dual_multiplies_function
112  *------------------------------------------------------------------------*/
123  template<typename E1, typename E2>
124  auto dual_multiplies_function(
125  const dual_expression<E1>& e1,
126  const dual_expression<E2>& e2)
127  -> decltype(e1().getDerivative() * e2().getValue() + e1().getValue() * e2().getDerivative())
128  {
129  return e1().getDerivative() * e2().getValue() + e1().getValue() * e2().getDerivative();
130  }
140  template<typename E2>
141  auto dual_multiplies_function(const double e1, const dual_expression<E2>& e2)
142  -> decltype(e2().getDerivative())
143  {
144  return e2().getDerivative();
145  }
155  template<typename E1>
156  auto dual_multiplies_function(const dual_expression<E1>& e1, const double e2)
157  -> decltype(e1().getDerivative())
158  {
159  return e1().getDerivative();
160  }
161  /*--------------------------------------------------------------------------
162  * dual_divide_function
163  *------------------------------------------------------------------------*/
174  template<typename E1, typename E2>
175  auto dual_divide_function(
176  const dual_expression<E1>& e1,
177  const dual_expression<E2>& e2)
178  -> decltype((e1().getDerivative() * e2().getValue() - e1().getValue() * e2().getDerivative())
179  / (e1().getValue() * e1().getValue()))
180  {
181  return (e1().getDerivative() * e2().getValue() - e1().getValue() * e2().getDerivative())
182  / (e1().getValue() * e1().getValue());
183  }
193  template<typename E2>
194  auto dual_divide_function(const double e1, const dual_expression<E2>& e2)
195  -> decltype(e2().getDerivative())
196  {
197  return e2().getDerivative();
198  }
208  template<typename E1>
209  auto dual_divide_function(const dual_expression<E1>& e1, const double e2)
210  -> decltype(e1().getDerivative())
211  {
212  return e1().getDerivative();
213  }
214 } } } // namespace algo { namespace ad { namespace detail {
215 
Definition: ublas_matrix_expression_concept.hpp:5