add_decomposable_gradient.hpp
Go to the documentation of this file.
1 
13 #ifndef MLPACK_CORE_OPTIMIZERS_FUNCTION_ADD_DECOMPOSABLE_GRADIENT_HPP
14 #define MLPACK_CORE_OPTIMIZERS_FUNCTION_ADD_DECOMPOSABLE_GRADIENT_HPP
15 
16 #include "traits.hpp"
17 
18 namespace mlpack {
19 namespace optimization {
20 
26 template<typename FunctionType,
27  bool HasDecomposableEvaluateWithGradient =
28  traits::HasEvaluateWithGradient<FunctionType,
30  bool HasDecomposableGradient =
31  traits::HasGradient<FunctionType,
34 {
35  public:
36  // Provide a dummy overload so the name 'Gradient' exists for this object.
37  void Gradient(traits::UnconstructableType&, const size_t, const size_t);
38 };
39 
43 template<typename FunctionType, bool HasDecomposableEvaluateWithGradient>
44 class AddDecomposableGradient<FunctionType, HasDecomposableEvaluateWithGradient,
45  true>
46 {
47  public:
48  // Reflect the existing Gradient().
49  void Gradient(const arma::mat& coordinates,
50  const size_t begin,
51  arma::mat& gradient,
52  const size_t batchSize)
53  {
54  static_cast<FunctionType*>(
55  static_cast<Function<FunctionType>*>(this))->Gradient(coordinates,
56  begin, gradient, batchSize);
57  }
58 };
59 
64 template<typename FunctionType>
65 class AddDecomposableGradient<FunctionType, true, false>
66 {
67  public:
77  void Gradient(const arma::mat& coordinates,
78  const size_t begin,
79  arma::mat& gradient,
80  const size_t batchSize)
81  {
82  // The returned objective value will be ignored.
83  (void) static_cast<Function<FunctionType>*>(this)->EvaluateWithGradient(
84  coordinates, begin, gradient, batchSize);
85  }
86 };
87 
93 template<typename FunctionType,
94  bool HasDecomposableEvaluateWithGradient =
95  traits::HasEvaluateWithGradient<FunctionType,
97  bool HasDecomposableGradient =
98  traits::HasGradient<FunctionType,
101 {
102  public:
103  // Provide a dummy overload so the name 'Gradient' exists for this object.
104  void Gradient(traits::UnconstructableType&, const size_t, const size_t) const;
105 };
106 
110 template<typename FunctionType, bool HasDecomposableEvaluateWithGradient>
111 class AddDecomposableGradientConst<FunctionType,
112  HasDecomposableEvaluateWithGradient, true>
113 {
114  public:
115  // Reflect the existing Gradient().
116  void Gradient(const arma::mat& coordinates,
117  const size_t begin,
118  arma::mat& gradient,
119  const size_t batchSize) const
120  {
121  static_cast<const FunctionType*>(
122  static_cast<const Function<FunctionType>*>(this))->Gradient(coordinates,
123  begin, gradient, batchSize);
124  }
125 };
126 
131 template<typename FunctionType>
132 class AddDecomposableGradientConst<FunctionType, true, false>
133 {
134  public:
144  void Gradient(const arma::mat& coordinates,
145  const size_t begin,
146  arma::mat& gradient,
147  const size_t batchSize) const
148  {
149  // The returned objective value will be ignored.
150  (void) static_cast<
151  const Function<FunctionType>*>(this)->EvaluateWithGradient(coordinates,
152  begin, gradient, batchSize);
153  }
154 };
155 
161 template<typename FunctionType,
162  bool HasDecomposableEvaluateWithGradient =
163  traits::HasEvaluateWithGradient<FunctionType,
165  bool HasDecomposableGradient =
166  traits::HasGradient<FunctionType,
169 {
170  public:
171  // Provide a dummy overload so the name 'Gradient' exists for this object.
173  const size_t,
174  const size_t);
175 };
176 
180 template<typename FunctionType, bool HasDecomposableEvaluateWithGradient>
181 class AddDecomposableGradientStatic<FunctionType,
182  HasDecomposableEvaluateWithGradient, true>
183 {
184  public:
185  // Reflect the existing Gradient().
186  static void Gradient(const arma::mat& coordinates,
187  const size_t begin,
188  arma::mat& gradient,
189  const size_t batchSize)
190  {
191  FunctionType::Gradient(coordinates, begin, gradient, batchSize);
192  }
193 };
194 
199 template<typename FunctionType>
200 class AddDecomposableGradientStatic<FunctionType, true, false>
201 {
202  public:
212  static void Gradient(const arma::mat& coordinates,
213  const size_t begin,
214  arma::mat& gradient,
215  const size_t batchSize)
216  {
217  // The returned objective value will be ignored.
218  (void) FunctionType::EvaluateWithGradient(coordinates, begin, gradient,
219  batchSize);
220  }
221 };
222 
223 } // namespace optimization
224 } // namespace mlpack
225 
226 #endif
The AddDecomposableEvaluateStatic mixin class will add a decomposable static Gradient() method if a d...
static double EvaluateWithGradient(traits::UnconstructableType &, const size_t, const size_t)
The AddDecomposableGradientConst mixin class will add a decomposable const Gradient() method if a dec...
.hpp
Definition: add_to_po.hpp:21
static void Gradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize)
Calculate the gradient and store it in the given matrix, starting at the given decomposable function ...
void Gradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize)
void Gradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize) const
double(*)(const arma::mat &, const size_t, arma::mat &, const size_t) DecomposableEvaluateWithGradientStaticForm
This is the form of a decomposable static EvaluateWithGradient() method.
Definition: traits.hpp:152
double(FunctionType::*)(const arma::mat &, const size_t, arma::mat &, const size_t) const DecomposableEvaluateWithGradientConstForm
This is the form of a decomposable const EvaluateWithGradient() method.
Definition: traits.hpp:147
void Gradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize) const
Calculate the gradient and store it in the given matrix, starting at the given decomposable function ...
The AddDecomposableGradient mixin class will add a decomposable Gradient() method if a decomposable E...
void(FunctionType::*)(const arma::mat &, const size_t, arma::mat &, const size_t) DecomposableGradientForm
This is the form of a decomposable non-const Gradient() method.
Definition: traits.hpp:127
void Gradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize)
Calculate the gradient and store it in the given matrix, starting at the given decomposable function ...
This is a utility type used to provide unusable overloads from each of the mixin classes.
Definition: traits.hpp:255
void(FunctionType::*)(const arma::mat &, const size_t, arma::mat &, const size_t) const DecomposableGradientConstForm
This the form of a decomposable const Gradient() method.
Definition: traits.hpp:132
static void Gradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize)
double(FunctionType::*)(const arma::mat &, const size_t, arma::mat &, const size_t) DecomposableEvaluateWithGradientForm
This is the form of a decomposable non-const EvaluateWithGradient() method.
Definition: traits.hpp:142
The Function class is a wrapper class for any FunctionType that will add any possible derived methods...
Definition: function.hpp:22
void Gradient(traits::UnconstructableType &, const size_t, const size_t)
void(*)(const arma::mat &, const size_t, arma::mat &, const size_t) DecomposableGradientStaticForm
This is the form of a decomposable static Gradient() method.
Definition: traits.hpp:137