1 #ifndef SCREENING_RULES_HPP 2 #define SCREENING_RULES_HPP 9 #include <eigen3/Eigen/Dense> 13 #include "../Generic/generics.hpp" 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,
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() );
28 T s = std::min( std::max( alpha_tilde, - alpha ), alpha );
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,
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();
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,
53 unsigned int p = X.cols();
54 std::vector< unsigned int > active_indices;
56 for(
unsigned int j = 0; j < p ; j ++ ) {
58 Eigen::Matrix< T, Eigen::Dynamic, 1 > X_j = X.col( j );
60 T safe_region = std::abs( static_cast<T>( X_j.transpose() * center ) ) + radius * X_j.norm();
62 if( safe_region >= static_cast<T>( 1 ) ) {
63 active_indices.push_back( j );
68 return active_indices;
74 #endif // SCREENING_RULES_HPP
T square(T &val)
Compute the square of a value.