17 #include "../../../Generic/generics.hpp"    18 #include "../subgradient_descent.hpp"    22 template < 
typename T, 
typename Base = 
internal::Solver< T > >
    29     FISTA( 
const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0, T L_0 = 0.1 );
    32     Eigen::Matrix< T, Eigen::Dynamic, 1 > update_rule(
    33         const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
    34         const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
    35         const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta_0,
    40     Eigen::Matrix< T, Eigen::Dynamic, 1 > update_beta_fista (
    41         const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
    42         const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
    43         const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
    47     Eigen::Matrix< T, Eigen::Dynamic, 1 > y_k;
    48     Eigen::Matrix< T, Eigen::Dynamic, 1 > y_k_old;
    50     Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > x_k_less_1;
    53     T t_k = 
static_cast<T
>( 1 );
    54     T L = 
static_cast<T
>( 0 );
    57 template < 
typename T, 
typename Base >
    63 template < 
typename T, 
typename Base >
    65     const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
    66     const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
    67     const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
    71     Eigen::Matrix< T, Eigen::Dynamic, 1 > x_k = Beta;
    76     T t_k_plus_1 = ( 1.0 + std::sqrt( 1.0 + 4.0 * 
square( t_k ) ) ) / 2.0;
    79     y_k = x_k + ( t_k - 1.0 ) / ( t_k_plus_1 ) * ( x_k - x_k_less_1 );
    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,
   100     unsigned int counter = 0;
   114     return update_beta_fista( X, Y, Beta, L, lambda );;
   117 template < 
typename T, 
typename Base >
   119     const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic >& X,
   120     const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Y,
   121     const Eigen::Matrix< T, Eigen::Dynamic, 1 >& Beta,
   130     Eigen::Matrix< T, Eigen::Dynamic, 1 > f_grad = 2.0*( X.transpose()*( X*y_k_old - Y ) );
   132     Eigen::Matrix< T, Eigen::Dynamic, 1 > to_modify = y_k_old - (1.0/L)*f_grad;
   133     Eigen::Matrix< T, Eigen::Dynamic, 1 > y_k_temp = to_modify.unaryExpr( 
SoftThres<T>( lambda/L ) );
   135     unsigned int counter = 0;
   137     T f_beta = ( X*y_k_temp - Y ).squaredNorm();
   139     Eigen::Matrix< T, Eigen::Dynamic, 1 > f_part = X*y_k_old - Y;
   140     T taylor_term_0 = f_part.squaredNorm();
   142     Eigen::Matrix< T, Eigen::Dynamic, 1 > beta_diff = ( y_k_temp - y_k_old );
   144     T taylor_term_1 = f_grad.transpose()*beta_diff;
   146     T taylor_term_2 = L/2.0*beta_diff.squaredNorm();
   148     T f_beta_tilde = taylor_term_0 + taylor_term_1 + taylor_term_2;
   150     while( f_beta > f_beta_tilde ) {
   158         to_modify = y_k_old - (1.0/L)*f_grad;
   159         y_k_temp = to_modify.unaryExpr( 
SoftThres<T>( lambda/L ) );
   161         f_beta = ( X*y_k_temp - Y ).squaredNorm();;
   163         beta_diff = ( y_k_temp - y_k_old );
   164         taylor_term_1 = f_grad.transpose()*beta_diff;
   165         taylor_term_2 = L/2.0*beta_diff.squaredNorm();
   167         f_beta_tilde = taylor_term_0 + taylor_term_1 + taylor_term_2;
   171     Eigen::Matrix< T, Eigen::Dynamic, 1 > x_k = Beta;
   175     to_modify = y_k_old - (1.0/L)*f_grad;
   178     T t_k_plus_1 = ( 1.0 + std::sqrt( 1.0 + 4.0 * 
square( t_k ) ) ) / 2.0;
   181     y_k = x_k + ( t_k - 1.0 ) / ( t_k_plus_1 ) * ( x_k - x_k_less_1 );
 
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,...)
T square(T &val)
Compute the square of a value. 
Run the Fast Iterative Shrinking and Thresholding Algorthim.