23 void m_Ax(
double *Ax,
double *A,
double *x,
int n,
int ith)
41 int lassoCD(
double *Theta,
double *W,
double *S,
double lambda,
int n,
int ith,
int flag,
int maxIter,
double fGap,
double xGap)
45 double u, v, s_v, t=0, x_new;
46 double fun_new,fun_old=-100;
49 Ax= (
double *)malloc(
sizeof(
double)*n);
52 printf(
"\n Memory allocation failure!");
56 x= (
double *)malloc(
sizeof(
double)*n);
59 printf(
"\n Memory allocation failure!");
72 m_Ax(Ax, W, x, n, ith);
74 for (iter_step=0;iter_step<maxIter; iter_step++){
91 x_new= (s_v-lambda) / u;
94 x_new= (s_v + lambda) / u;
102 Ax[j]+= W[j*n+ i]*(x_new - x[i]);
104 x_change+=fabs(x[i]-x_new);
116 fun_new+=- S[i*n+ith]*x[i]+ lambda* fabs(x[i]);
127 if ( (fabs(fun_new-fun_old) <=fGap) || x_change <=xGap){
145 t=1/(W[ith*n+ith]-t);
146 Theta[ith*n + ith]=t;
151 W[i*n+ ith]=W[ith*n +i]=Ax[i];
152 Theta[i*n+ ith]=Theta[ith*n +i]=-x[i]*t;
159 W[i*n+ ith]=W[ith*n +i]=Ax[i];
160 Theta[i*n+ ith]=Theta[ith*n +i]=x[i];
171 void invCov(
double *Theta,
double *W,
double *S,
double lambda,
double sum_S,
int n,
172 int LassoMaxIter,
double fGap,
double xGap,
173 int maxIter,
double xtol)
175 int iter_step, i,j, ith;
180 W_old= (
double *)malloc(
sizeof(
double)*n*n);
184 printf(
"\n Memory allocation failure!");
191 W_old[i*n+j]=W[i*n+j]=S[i*n+j]+lambda;
193 W_old[i*n+j]=W[i*n+j]=S[i*n+j];
198 for (iter_step=0;iter_step<=maxIter; iter_step++){
199 for(ith=0;ith<n;ith++)
200 lassoCD(Theta, W, S, lambda, n, ith, flag, LassoMaxIter,fGap, xGap);
208 gap+=fabs(W[i*n+j]-W_old[i*n+j]);
209 W_old[i*n+j]=W[i*n+j];
215 if ( (gap <= xtol) || (iter_step==maxIter-1) ){
void invCov(double *Theta, double *W, double *S, double lambda, double sum_S, int n, int LassoMaxIter, double fGap, double xGap, int maxIter, double xtol)
void m_Ax(double *Ax, double *A, double *x, int n, int ith)
int lassoCD(double *Theta, double *W, double *S, double lambda, int n, int ith, int flag, int maxIter, double fGap, double xGap)