add_decomposable_evaluate_with_gradient.hpp
Go to the documentation of this file.
1 
13 #ifndef MLPACK_CORE_OPTIMIZERS_FUNCTION_ADD_DECOMPOSABLE_EVALUATE_W_GRADIENT_HPP
14 #define MLPACK_CORE_OPTIMIZERS_FUNCTION_ADD_DECOMPOSABLE_EVALUATE_W_GRADIENT_HPP
15 
16 #include "traits.hpp"
17 
18 namespace mlpack {
19 namespace optimization {
20 
26 template<typename FunctionType,
27  // Check if there is at least one non-const Evaluate() or Gradient().
28  bool HasDecomposableEvaluateGradient = traits::HasNonConstSignatures<
29  FunctionType,
30  traits::HasEvaluate,
34  traits::HasGradient,
38  bool HasDecomposableEvaluateWithGradient =
39  traits::HasEvaluateWithGradient<FunctionType,
42 {
43  public:
44  // Provide a dummy overload so the name 'EvaluateWithGradient' exists for this
45  // object.
47  const size_t);
48 };
49 
53 template<typename FunctionType, bool HasDecomposableEvaluateGradient>
55  HasDecomposableEvaluateGradient, true>
56 {
57  public:
58  // Reflect the existing Evaluate().
59  double EvaluateWithGradient(const arma::mat& coordinates,
60  const size_t begin,
61  arma::mat& gradient,
62  const size_t batchSize)
63  {
64  return static_cast<FunctionType*>(
65  static_cast<Function<FunctionType>*>(this))->EvaluateWithGradient(
66  coordinates, begin, gradient, batchSize);
67  }
68 };
69 
75 template<typename FunctionType>
76 class AddDecomposableEvaluateWithGradient<FunctionType, true, false>
77 {
78  public:
89  double EvaluateWithGradient(const arma::mat& coordinates,
90  const size_t begin,
91  arma::mat& gradient,
92  const size_t batchSize)
93  {
94  const double objective =
95  static_cast<Function<FunctionType>*>(this)->Evaluate(coordinates, begin,
96  batchSize);
97  static_cast<Function<FunctionType>*>(this)->Gradient(coordinates, begin,
98  gradient, batchSize);
99  return objective;
100  }
101 };
102 
109 template<typename FunctionType,
110  // Check if there is at least one const Evaluate() or Gradient().
111  bool HasDecomposableEvaluateGradient = traits::HasConstSignatures<
112  FunctionType,
113  traits::HasEvaluate,
116  traits::HasGradient,
119  bool HasDecomposableEvaluateWithGradient =
120  traits::HasEvaluateWithGradient<FunctionType,
123 {
124  public:
125  // Provide a dummy overload so the name 'EvaluateWithGradient' exists for this
126  // object.
128  const size_t) const;
129 };
130 
134 template<typename FunctionType, bool HasDecomposableEvaluateGradient>
136  HasDecomposableEvaluateGradient, true>
137 {
138  public:
139  // Reflect the existing Evaluate().
140  double EvaluateWithGradient(const arma::mat& coordinates,
141  const size_t begin,
142  arma::mat& gradient,
143  const size_t batchSize) const
144  {
145  return static_cast<const FunctionType*>(
146  static_cast<const Function<FunctionType>*>(this))->EvaluateWithGradient(
147  coordinates, begin, gradient, batchSize);
148  }
149 };
150 
156 template<typename FunctionType>
157 class AddDecomposableEvaluateWithGradientConst<FunctionType, true, false>
158 {
159  public:
170  double EvaluateWithGradient(const arma::mat& coordinates,
171  const size_t begin,
172  arma::mat& gradient,
173  const size_t batchSize) const
174  {
175  const double objective =
176  static_cast<const Function<FunctionType>*>(this)->Evaluate(coordinates,
177  begin, batchSize);
178  static_cast<const Function<FunctionType>*>(this)->Gradient(coordinates,
179  begin, gradient, batchSize);
180  return objective;
181  }
182 };
183 
190 template<typename FunctionType,
191  bool HasDecomposableEvaluateGradient =
192  traits::HasEvaluate<FunctionType,
193  traits::DecomposableEvaluateStaticForm>::value &&
194  traits::HasGradient<FunctionType,
196  bool HasDecomposableEvaluateWithGradient =
197  traits::HasEvaluateWithGradient<FunctionType,
200 {
201  public:
202  // Provide a dummy overload so the name 'EvaluateWithGradient' exists for this
203  // object.
204  static double EvaluateWithGradient(traits::UnconstructableType&, const size_t,
205  const size_t);
206 };
207 
211 template<typename FunctionType, bool HasDecomposableEvaluateGradient>
213  HasDecomposableEvaluateGradient, true>
214 {
215  public:
216  // Reflect the existing Evaluate().
217  static double EvaluateWithGradient(const arma::mat& coordinates,
218  const size_t begin,
219  arma::mat& gradient,
220  const size_t batchSize)
221  {
222  return FunctionType::EvaluateWithGradient(coordinates, begin, gradient,
223  batchSize);
224  }
225 };
226 
232 template<typename FunctionType>
233 class AddDecomposableEvaluateWithGradientStatic<FunctionType, true, false>
234 {
235  public:
246  double EvaluateWithGradient(const arma::mat& coordinates,
247  const size_t begin,
248  arma::mat& gradient,
249  const size_t batchSize) const
250  {
251  const double objective = FunctionType::Evaluate(coordinates, begin,
252  batchSize);
253  FunctionType::Gradient(coordinates, begin, gradient, batchSize);
254  return objective;
255  }
256 };
257 
258 } // namespace optimization
259 } // namespace mlpack
260 
261 #endif
double EvaluateWithGradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize) const
Return both the evaluated objective function and its gradient, storing the gradient in the given matr...
double EvaluateWithGradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize)
Return both the evaluated objective function and its gradient, storing the gradient in the given matr...
.hpp
Definition: add_to_po.hpp:21
The AddDecomposableEvaluateWithGradient mixin class will add a decomposable EvaluateWithGradient() me...
double(FunctionType::*)(const arma::mat &, const size_t, const size_t) const DecomposableEvaluateConstForm
This is the form of a decomposable const Evaluate() method.
Definition: traits.hpp:117
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
double EvaluateWithGradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize)
The AddDecomposableEvaluateWithGradientStatic mixin class will add a decomposable static EvaluateWith...
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
The AddDecomposableEvaluateWithGradientConst mixin class will add a decomposable const EvaluateWithGr...
This is a utility type used to provide unusable overloads from each of the mixin classes.
Definition: traits.hpp:255
static double EvaluateWithGradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize)
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
double EvaluateWithGradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize) const
double EvaluateWithGradient(const arma::mat &coordinates, const size_t begin, arma::mat &gradient, const size_t batchSize) const
Return both the evaluated objective function and its gradient, storing the gradient in the given matr...
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
double EvaluateWithGradient(traits::UnconstructableType &, const size_t, const size_t)
Utility struct: sometimes we want to know if we have two functions available, and that at least one o...
Definition: traits.hpp:318
The Function class is a wrapper class for any FunctionType that will add any possible derived methods...
Definition: function.hpp:22
double(*)(const arma::mat &, const size_t, const size_t) DecomposableEvaluateStaticForm
This is the form of a decomposable static Evaluate() method.
Definition: traits.hpp:122
double(FunctionType::*)(const arma::mat &, const size_t, const size_t) DecomposableEvaluateForm
This is the form of a decomposable Evaluate() method.
Definition: traits.hpp:112
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