DiSMEC++
objective.h
Go to the documentation of this file.
1 // Copyright (c) 2021, Aalto University, developed by Erik Schultheis
2 // All rights reserved.
3 //
4 // SPDX-License-Identifier: MIT
5 
6 #ifndef DISMEC_OBJECTIVE_H
7 #define DISMEC_OBJECTIVE_H
8 
9 #include <cstdint>
10 #include <memory>
11 #include "matrix_types.h"
12 #include "stats/tracked.h"
13 #include "fwd.h"
14 
15 namespace dismec::objective
16 {
41  class Objective : public stats::Tracked {
42  public:
43  Objective();
44  virtual ~Objective() noexcept = default;
45 
54  [[nodiscard]] real_t value(const HashVector& location);
55 
58  [[nodiscard]] virtual long num_variables() const noexcept = 0;
59 
68  void diag_preconditioner(const HashVector& location, Eigen::Ref<DenseRealVector> target);
69 
77  void project_to_line(const HashVector& location, const DenseRealVector& direction);
78 
87  [[nodiscard]] virtual real_t lookup_on_line(real_t position) = 0;
88 
100  virtual void declare_vector_on_last_line(const HashVector& location, real_t t) {};
101 
102 
110  void gradient_at_zero(Eigen::Ref<DenseRealVector> target);
111 
121  void gradient(const HashVector& location, Eigen::Ref<DenseRealVector> target);
122 
132  void hessian_times_direction(const HashVector& location,
133  const DenseRealVector& direction,
134  Eigen::Ref<DenseRealVector> target);
135 
144  void gradient_and_pre_conditioner(const HashVector& location,
145  Eigen::Ref<DenseRealVector> gradient,
146  Eigen::Ref<DenseRealVector> pre);
147 
148  private:
151  [[nodiscard]] virtual real_t value_unchecked(const HashVector& location) = 0;
152 
155  virtual void gradient_unchecked(const HashVector& location, Eigen::Ref<DenseRealVector> target) = 0;
156 
160  const HashVector& location,
161  const DenseRealVector& direction,
162  Eigen::Ref<DenseRealVector> target) = 0;
163 
167  virtual void gradient_at_zero_unchecked(Eigen::Ref<DenseRealVector> target);
168 
173  const HashVector& location,
174  Eigen::Ref<DenseRealVector> gradient,
175  Eigen::Ref<DenseRealVector> pre);
176 
179  virtual void diag_preconditioner_unchecked(const HashVector& location, Eigen::Ref<DenseRealVector> target);
180 
183  virtual void project_to_line_unchecked(const HashVector& location, const DenseRealVector& direction) = 0;
184  };
185 
186 }
187 
188 #endif //DISMEC_OBJECTIVE_H
An Eigen vector with versioning information, to implement simple caching of results.
Definition: hash_vector.h:43
Class that models an optimization objective.
Definition: objective.h:41
virtual void declare_vector_on_last_line(const HashVector &location, real_t t)
State that the given vector corresponds to a certain position on the line of the last line search.
Definition: objective.h:100
virtual void gradient_and_pre_conditioner_unchecked(const HashVector &location, Eigen::Ref< DenseRealVector > gradient, Eigen::Ref< DenseRealVector > pre)
Definition: objective.cpp:74
virtual void gradient_at_zero_unchecked(Eigen::Ref< DenseRealVector > target)
Definition: objective.cpp:90
void hessian_times_direction(const HashVector &location, const DenseRealVector &direction, Eigen::Ref< DenseRealVector > target)
Calculates the product of the Hessian matrix at location with direction.
Definition: objective.cpp:107
void gradient_at_zero(Eigen::Ref< DenseRealVector > target)
Gets the gradient for location zero.
Definition: objective.cpp:82
virtual ~Objective() noexcept=default
virtual void gradient_unchecked(const HashVector &location, Eigen::Ref< DenseRealVector > target)=0
virtual long num_variables() const noexcept=0
void gradient(const HashVector &location, Eigen::Ref< DenseRealVector > target)
Evaluate the gradient at location.
Definition: objective.cpp:96
virtual real_t value_unchecked(const HashVector &location)=0
virtual void hessian_times_direction_unchecked(const HashVector &location, const DenseRealVector &direction, Eigen::Ref< DenseRealVector > target)=0
virtual void diag_preconditioner_unchecked(const HashVector &location, Eigen::Ref< DenseRealVector > target)
Definition: objective.cpp:54
virtual void project_to_line_unchecked(const HashVector &location, const DenseRealVector &direction)=0
void gradient_and_pre_conditioner(const HashVector &location, Eigen::Ref< DenseRealVector > gradient, Eigen::Ref< DenseRealVector > pre)
Combines the calculation of gradient and pre-conditioner, which may be more efficient in some cases.
Definition: objective.cpp:58
virtual real_t lookup_on_line(real_t position)=0
Looks up the value of the objective on the line defined by the last call to project_to_line().
void project_to_line(const HashVector &location, const DenseRealVector &direction)
creates a function g such that g(a) = objective(location + a * direction) Use lookup_on_line() to eva...
Definition: objective.cpp:124
void diag_preconditioner(const HashVector &location, Eigen::Ref< DenseRealVector > target)
Get precondition to be used in CG optimization.
Definition: objective.cpp:43
real_t value(const HashVector &location)
Evaluate the objective at the given location.
Definition: objective.cpp:35
A base class to be used for all types that implement some for of statistics tracking.
Definition: tracked.h:42
Forward-declares types.
types::DenseVector< real_t > DenseRealVector
Any dense, real values vector.
Definition: matrix_types.h:40
float real_t
The default type for floating point values.
Definition: config.h:17