17 #include "../../../Generic/generics.hpp"    18 #include "../../../Generic/debug.hpp"    19 #include "../subgradient_descent.hpp"    29 template < 
typename T, 
typename Base = 
internal::Solver< T > >
    39     Eigen::Matrix< T, Eigen::Dynamic, 1 > update_rule(
    40         const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
    41         const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
    42         const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
    47     T L = 
static_cast<T
>( 0 );
    51 template < 
typename T, 
typename Base >
    55 template < 
typename T, 
typename Base >
    57     const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
    58     const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
    59     const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
    62     Eigen::Matrix< T, Eigen::Dynamic, 1 > Beta = Beta_0;
    64     unsigned int counter = 0;
    85 template < 
typename T, 
typename Base >
    87     const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
    88     const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
    89     const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
    94     Eigen::Matrix< T, Eigen::Dynamic, 1 > f_grad = 2.0*( X.transpose()*( X*Beta - Y ) );
    95     Eigen::Matrix< T, Eigen::Dynamic, 1 > Beta_temp = ( Beta - (1.0/L)*f_grad ).unaryExpr( 
SoftThres<T>( lambda/L ) );
    97     T f_beta = ( X*Beta_temp - Y ).squaredNorm();
    99     Eigen::Matrix< T, Eigen::Dynamic, 1  > f_part = X*Beta - Y;
   100     T taylor_term_0 = f_part.squaredNorm();
   102     Eigen::Matrix< T, Eigen::Dynamic, 1  > beta_diff = ( Beta_temp - Beta );
   104     T taylor_term_1 = f_grad.transpose()*beta_diff;
   106     T taylor_term_2 = L/2.0*beta_diff.squaredNorm();
   108     T f_beta_tilde = taylor_term_0 + taylor_term_1 + taylor_term_2;
   110     while( f_beta > f_beta_tilde ) {
   114         Beta_temp = ( Beta - (1.0/L)*f_grad ).unaryExpr( 
SoftThres<T>( lambda/L ) );
   116         f_beta = ( X*Beta_temp - Y ).squaredNorm();;
   118         beta_diff = ( Beta_temp - Beta );
   119         taylor_term_1 = f_grad.transpose()*beta_diff;
   120         taylor_term_2 = L/2.0*beta_diff.squaredNorm();
   122         f_beta_tilde = taylor_term_0 + taylor_term_1 + taylor_term_2;
   126     return ( Beta - 1.0/L*f_grad ).unaryExpr( 
SoftThres<T>( lambda/L ) );
 
Abstract base class for Sub-Gradient Descent algorithms ,such as ISTA and FISTA, with backtracking li...
Soft Threshold functor used to apply hdim::soft_threshold to each element in a matrix or vector...
#define DEBUG_PRINT(x,...)
Run the Iterative Shrinking and Thresholding Algorthim.