0001
0002
0003
0004 SIM_stack = cell(maxsim,1);
0005 SIM_memory = cell(maxsim,1);
0006
0007 for sim = 1:maxsim
0008
0009 in = []; in.type = sType; in.T = T; in.randgen = 1; in.take_fwt = 0;
0010 switch sType
0011 case 'blocks'
0012 in.take_fwt = 1;
0013 in.wType = 'haar';
0014 case 'heavisine'
0015 in.take_fwt = 1;
0016 in.wType = 'daub4';
0017 case 'pcwpoly';
0018 in.take_fwt = 1;
0019 in.wType = 'daub8';
0020 end
0021 x = genSignal(N,in);
0022
0023 [val ind] = sort(abs(x),'descend');
0024 ind_pos = ind(val>0);
0025 gamma_orig = ind_pos(1:min(length(ind_pos),M-1));
0026
0027
0028 in = []; in.type = mType;
0029 A = genAmat(M,N,in);
0030
0031
0032 sigma = sqrt(norm(A*x)^2/10^(SNR/10)/M);
0033
0034 e = randn(M,1)*sigma;
0035 y = A*x+e;
0036
0037
0038
0039
0040
0041
0042 if lambda > 0
0043 tau = lambda*max(abs(A'*y));
0044 else
0045
0046 tau = max(1e-4*max(abs(A'*y)),sigma*sqrt(log(N)));
0047 end
0048
0049
0050 maxiter = 2*N;
0051
0052
0053 in = [];
0054 in.A = A; in.y = y; in.x = x;
0055 in.x_init = zeros(N,1); in.max_rwt = rwt_adp;
0056 in.tau = tau;
0057 in.rwt_mode = rwt_mode;
0058 in.delx_mode = delx_mode;
0059 in.debias = 0;
0060 in.verbose = 0;
0061 if in.verbose
0062 fprintf('sType-%s, mType-%s, (N,M,T)-%d,%d,%d ',sType,mType,N,M,T);
0063 end
0064 out = script_rwtBPDN_adaptive(in);
0065 xh_adp = out.x_out;
0066 iter_adp = out.iter;
0067 gamma_adp = out.gamma;
0068 W_new = out.W_new;
0069 xh_adp_init = out.x_init;
0070 err_adp = out.err;
0071 time_adp = out.time;
0072 supp_diff_adp = out.supp_diff;
0073
0074
0075 in = [];
0076 in.A = A; in.y = y; in.x = x;
0077 in.x_init = zeros(N,1); in.max_rwt = rwt;
0078 in.tau = tau;
0079 in.rwt_mode = rwt_mode;
0080 in.delx_mode = delx_mode;
0081 out = script_rwtBPDN_iterative(in);
0082 xh_rwt = out.x_out;
0083 xh_rwt_init = out.x_init;
0084 iter_rwt = out.iter;
0085 gamma_rwt = out.gamma;
0086 err_rwt = out.err;
0087 time_rwt = out.time;
0088 supp_diff_rwt = out.supp_diff;
0089
0090
0091 alpha = 5; beta = 10;
0092 W_new = ones(N,1); W_new(gamma_orig) = 1/alpha./(beta*abs(x(gamma_orig)));
0093
0094
0095
0096
0097
0098 in = [];
0099 in.tau = tau;
0100 in.maxiter = maxiter;
0101 in.x_orig = x;
0102 in.record = 1;
0103 in.delx_mode = 'mil';
0104
0105 AW = A*diag(1./W_new);
0106 tic
0107 out_new = BPDN_homotopy_function(AW, y, in);
0108
0109 time_orac = toc;
0110 xh_orac = out_new.x_out.*(1./W_new);
0111 gamma_orac = out_new.gamma;
0112 iter_orac = out_new.iter;
0113
0114
0115 x_LS = zeros(N,1);
0116 x_LS(gamma_orig) = A(:,gamma_orig)\y;
0117
0118
0119 in = [];
0120 in.Te = round(1.2*T);
0121 out = OMP_function(y,A,in);
0122 x_omp = out.x_out;
0123 iter_omp = out.iter;
0124 gamma_omp = out.gamma;
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165 iter_spgl1 = []; err_spgl1 = []; supp_diff_spgl1 = []; time_spgl1 = [];
0166 if ~exist('spgSetParms','file'); error('Solver SPGL1 is not found.'); end
0167
0168 W_new = ones(N,1);
0169
0170 delta = sqrt(M)*sigma;
0171 x_spgl1 = [];
0172
0173 for rwt_itr = 1:rwt+1
0174 spg_opts = spgSetParms('verbosity',0,'weights',W_new,'iterations',maxiter);
0175 [x_spgl1,r,g,info] = spgl1(A,y,0,delta,x_spgl1,spg_opts);
0176
0177 rerr = norm(x_spgl1-x)/norm(x);
0178 iter_spgl1 = [iter_spgl1 (info.nProdA+info.nProdAt)/2];
0179 err_spgl1 = [err_spgl1 rerr];
0180 supp_diff_spgl1 = [supp_diff_spgl1 length(setxor(gamma_orig,find(x_spgl1)))];
0181 time_spgl1 = [time_spgl1 info.timeTotal];
0182 [alpha beta epsilon] = weight_param(rwt_mode,rwt_itr,x_spgl1,M);
0183 W_new = 1/alpha./(beta*abs(x_spgl1)+epsilon);
0184 end
0185
0186
0187
0188 digit = 6; if sigma > 0; digit = 4; end
0189 opts = [];
0190 opts.tol = 10^(-digit);
0191 W_new = ones(N,1);
0192 opts.weights = W_new;
0193 opts.print = 0;
0194 opts.maxit = maxiter/2;
0195 x_yall1 = [];
0196
0197 iter_yall1 = [];
0198 err_yall1 = [];
0199 time_yall1 = [];
0200 supp_diff_yall1 = [];
0201 for rwt_itr = 1:rwt+1
0202 opts.nu = 0; opts.rho = tau;
0203 tic;
0204 [x_yall1,Out] = yall1(A,y,opts);
0205
0206 time_yall1 = [time_yall1 toc];
0207
0208 iter_yall1 = [iter_yall1 (Out.cntA+Out.cntAt)/2];
0209 rerr = norm(x-x_yall1)/norm(x);
0210 err_yall1 = [err_yall1 rerr];
0211
0212 supp_diff_yall1 = [supp_diff_yall1 length(setxor(gamma_orig,find(x_yall1)))];
0213
0214 [alpha beta epsilon] = weight_param(rwt_mode,rwt_itr,x_yall1,M);
0215 W_new = 1/alpha./(beta*abs(x_yall1)+epsilon);
0216 opts.x0 = x_yall1;
0217 opts.weights = W_new;
0218 end
0219
0220
0221 W_new = 1;
0222
0223 x_sparsa = 0;
0224 iter_sparsa = [];
0225 err_sparsa = [];
0226 time_sparsa = [];
0227 supp_diff_sparsa = [];
0228 for rwt_itr = 1:rwt+1
0229 psi_function = @(x,tau) soft(x,tau*W_new);
0230 phi_function = @(x) sum(abs(W_new.*x));
0231 tic;
0232 [x_SpaRSA,x_debias_SpaRSA_m,obj_SpaRSA_m_cont,...
0233 times_SpaRSA_m_cont,debias_start_SpaRSA_m,mse_SpaRSA_m,taus_SpaRSA_m, numA, numAt]= ...
0234 SpaRSA_adpW(y,A,tau,...
0235 'Monotone',0,...
0236 'adp_wt',0,...
0237 'W_new',W_new,...
0238 'Debias',0,...
0239 'Initialization',x_sparsa,...
0240 'StopCriterion',2,...
0241 'ToleranceA',1e-4,...
0242 'psi',psi_function,...
0243 'phi',phi_function,...
0244 'Safeguard',1,...
0245 'MaxiterA',maxiter,...
0246 'Verbose',0,...
0247 'True_x',x,...
0248 'Continuation',1,...
0249 'Continuationsteps',-1);
0250 x_sparsa = x_SpaRSA;
0251
0252 time_sparsa = [time_sparsa toc];
0253
0254
0255 iter_sparsa = [iter_sparsa (numA+numAt)/2];
0256 rerr = norm(x-x_sparsa)/norm(x);
0257 err_sparsa = [err_sparsa rerr];
0258
0259
0260 if rerr > 100
0261 fprintf('rerr big... iter # %d in %s\n',sim,str0);
0262 end
0263
0264 supp_diff_sparsa = [supp_diff_sparsa length(setxor(gamma_orig,find(x_sparsa)))];
0265
0266 [alpha beta epsilon] = weight_param(rwt_mode,rwt_itr,x_sparsa,M);
0267 W_new = 1/alpha./(beta*abs(x_sparsa)+epsilon);
0268 end
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340 SIM_stack{sim} = [sim, tau, norm(x-x_LS)/norm(x), norm(x-xh_orac)/norm(x), iter_orac, ...
0341 norm(x-xh_adp)/norm(x), sum(iter_adp,2), sum(time_adp,2), ...
0342 norm(x-xh_rwt)/norm(x), sum(iter_rwt,2), sum(time_rwt,2), ...
0343 norm(x-x_yall1)/norm(x), sum(iter_yall1,2), sum(time_yall1,2), ...
0344 norm(x-x_sparsa)/norm(x), sum(iter_sparsa,2), sum(time_sparsa,2), ...
0345 norm(x-x_spgl1)/norm(x), sum(iter_spgl1,2), sum(time_spgl1,2), ...
0346 norm(x-x_omp)/norm(x), iter_omp];
0347
0348
0349
0350
0351
0352 exp = 1;
0353 SIM_memory{sim}{exp,1} = 'adp';
0354 SIM_memory{sim}{exp,2} = iter_adp;
0355 SIM_memory{sim}{exp,3} = err_adp;
0356 SIM_memory{sim}{exp,4} = supp_diff_adp;
0357 SIM_memory{sim}{exp,5} = time_adp;
0358
0359 exp = exp+1;
0360 SIM_memory{sim}{exp,1} = 'rwt';
0361 SIM_memory{sim}{exp,2} = iter_rwt;
0362 SIM_memory{sim}{exp,3} = err_rwt;
0363 SIM_memory{sim}{exp,4} = supp_diff_rwt;
0364 SIM_memory{sim}{exp,5} = time_rwt;
0365
0366 exp = exp+1;
0367 SIM_memory{sim}{exp,1} = 'yall1';
0368 SIM_memory{sim}{exp,2} = iter_yall1;
0369 SIM_memory{sim}{exp,3} = err_yall1;
0370 SIM_memory{sim}{exp,4} = supp_diff_yall1;
0371 SIM_memory{sim}{exp,5} = time_yall1;
0372
0373 exp = exp+1;
0374 SIM_memory{sim}{exp,1} = 'sparsa';
0375 SIM_memory{sim}{exp,2} = iter_sparsa;
0376 SIM_memory{sim}{exp,3} = err_sparsa;
0377 SIM_memory{sim}{exp,4} = supp_diff_sparsa;
0378 SIM_memory{sim}{exp,5} = time_sparsa;
0379
0380 exp = exp+1;
0381 SIM_memory{sim}{exp,1} = 'spgl1';
0382 SIM_memory{sim}{exp,2} = iter_spgl1;
0383 SIM_memory{sim}{exp,3} = err_spgl1;
0384 SIM_memory{sim}{exp,4} = supp_diff_spgl1;
0385 SIM_memory{sim}{exp,5} = time_spgl1;
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407 end
0408
0409 mS = mean(cell2mat(SIM_stack),1);
0410 str1 = 'maxsim %d. tau = %3.4g, oracLS=%3.4g. (err,iter,time): oracWT-%3.4g,%3.4g; adp-%3.4g,%3.4g,%3.4g; rwt-%3.4g,%3.4g,%3.4g; yall1-%3.4g,%3.4g,%3.4g; sparsa-%3.4g,%3.4g,%3.4g; spgl1-%3.4g,%3.4g,%3.4g; omp-%3.4g,%3.4g.';
0411 str2 = sprintf([str1,' \n'], maxsim, mS(2:end));
0412 disp(str2);
0413