HDIM  1.0.0
Packages for High Dimensional Linear Regression
solver.hpp
1 #ifndef SOLVER_HPP
2 #define SOLVER_HPP
3 
4 // C System-Headers
5 //
6 // C++ System headers
7 #include <functional> // std::function
8 // Eigen Headers
9 #include <eigen3/Eigen/Dense>
10 #include <eigen3/Eigen/Core>
11 // Boost Headers
12 //
13 // SPAMS Headers
14 //
15 // OpenMP Headers
16 //
17 // Project Specific Headers
18 #include "../Generic/generics.hpp"
19 #include "../Generic/debug.hpp"
20 #include "abstractsolver.hpp"
21 
22 namespace hdim {
23 
24 namespace internal {
25 
26 template < typename T >
27 
31 class Solver : public AbstractSolver < T > {
32 
33  public:
34 
35  Solver();
36  virtual ~Solver() = 0;
37 
38  virtual Eigen::Matrix< T, Eigen::Dynamic, 1 > operator()(
39  const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
40  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
41  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
42  T lambda,
43  unsigned int num_iterations );
44 
45  virtual Eigen::Matrix< T, Eigen::Dynamic, 1 > operator()(
46  const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
47  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
48  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
49  T lambda,
50  T duality_gap_target );
51 
52  protected:
53 
54  virtual Eigen::Matrix< T, Eigen::Dynamic, 1 > update_rule(
55  const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
56  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
57  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
58  T lambda ) = 0;
59 
60 };
61 
62 template < typename T >
64  DEBUG_PRINT( "Using Plain Solver.");
65 }
66 
67 template < typename T >
69 
70 // Iterative
71 template < typename T >
72 Eigen::Matrix< T, Eigen::Dynamic, 1 > Solver<T>::operator()(
73  const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
74  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
75  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
76  T lambda,
77  T duality_gap_target ) {
78 
79  Eigen::Matrix< T, Eigen::Dynamic, 1 > Beta = Beta_0;
80 
81  bool optim_continue = true;
82 
83  while( optim_continue ) {
84 
85  T dg = duality_gap( X, Y, Beta, lambda );
86 
87  if( dg <= duality_gap_target ) {
88  optim_continue = false;
89  }
90 
91  Beta = update_rule( X, Y, Beta, lambda );
92  }
93 
94  return Beta;
95 
96 }
97 
98 // Duality Gap Convergence Criteria
99 template < typename T >
100 Eigen::Matrix< T, Eigen::Dynamic, 1 > Solver<T>::operator()(
101  const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
102  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
103  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
104  T lambda,
105  unsigned int num_iterations ) {
106 
107  Eigen::Matrix< T, Eigen::Dynamic, 1 > Beta = Beta_0;
108 
109  for( unsigned int i = 0; i < num_iterations ; i++ ) {
110 
111  Beta = update_rule( X, Y, Beta, lambda );
112  DEBUG_PRINT( "Duality Gap:" << duality_gap( X, Y, Beta, lambda ) );
113 
114  }
115 
116  return Beta;
117 
118 }
119 
120 }
121 
122 }
123 
124 #endif // SOLVER_HPP
Definition: fos.hpp:18
Abstract base class for solvers that do not make use of GAP SAFE screening rules. ...
Definition: solver.hpp:31
#define DEBUG_PRINT(x,...)
Definition: debug.hpp:73
Abstract base class for all iterative solvers.
virtual Eigen::Matrix< T, Eigen::Dynamic, 1 > operator()(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &X, const Eigen::Matrix< T, Eigen::Dynamic, 1 > &Y, const Eigen::Matrix< T, Eigen::Dynamic, 1 > &Beta_0, T lambda, unsigned int num_iterations)
Run the AbstractSolver for a fixed number of steps, specified by num_iterations.
Definition: solver.hpp:100