HDIM  1.0.0
Packages for High Dimensional Linear Regression
screening_rules.hpp
1 #ifndef SCREENING_RULES_HPP
2 #define SCREENING_RULES_HPP
3 
4 // C System-Headers
5 //
6 // C++ System headers
7 #include <vector>
8 // Eigen Headers
9 #include <eigen3/Eigen/Dense>
10 // Boost Headers
11 //
12 // Project Specific Headers
13 #include "../Generic/generics.hpp"
14 
15 namespace hdim {
16 
17 template < typename T >
18 Eigen::Matrix< T, Eigen::Dynamic, 1 > DualPoint(
19  const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
20  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
21  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
22  const T lambda ) {
23 
24  Eigen::Matrix< T, Eigen::Dynamic, 1 > residual = Y - X*Beta;
25  T alpha = 1.0 / ( X.transpose()*residual ).template lpNorm< Eigen::Infinity >();
26  T alpha_tilde = static_cast<T>( Y.transpose()*residual ) / ( lambda * residual.squaredNorm() );
27 
28  T s = std::min( std::max( alpha_tilde, - alpha ), alpha );
29 
30  return s*residual;
31 }
32 
33 template < typename T >
34 T DualityGap2 ( const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
35  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
36  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
37  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Nu,
38  const T lambda ) {
39 
40  T f_beta = 0.5*( Y - X*Beta ).squaredNorm() + lambda*Beta.template lpNorm< 1 >();
41  T d_nu = 0.5*Y.squaredNorm() - square( lambda ) / 2.0 *( Nu - Y * 1.0/lambda ).squaredNorm();
42 
43  return f_beta - d_nu;
44 
45 }
46 
47 template < typename T >
48 std::vector< unsigned int > SafeActiveSet (
49  const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
50  const Eigen::Matrix< T, Eigen::Dynamic, 1 >& center,
51  const T radius ) {
52 
53  unsigned int p = X.cols();
54  std::vector< unsigned int > active_indices;
55 
56  for( unsigned int j = 0; j < p ; j ++ ) {
57 
58  Eigen::Matrix< T, Eigen::Dynamic, 1 > X_j = X.col( j );
59 
60  T safe_region = std::abs( static_cast<T>( X_j.transpose() * center ) ) + radius * X_j.norm();
61 
62  if( safe_region >= static_cast<T>( 1 ) ) {
63  active_indices.push_back( j );
64  }
65 
66  }
67 
68  return active_indices;
69 }
70 
71 }
72 
73 
74 #endif // SCREENING_RULES_HPP
Definition: fos.hpp:18
T square(T &val)
Compute the square of a value.
Definition: generics.hpp:169