0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 clear
0014 clc
0015
0016
0017 rseed = sum(100*clock);
0018 rseed = 0;
0019
0020
0021 RandStream.setDefaultStream(RandStream('mt19937ar','seed',rseed));
0022
0023 N = 128;
0024 T = 20;
0025 M = 100;
0026
0027
0028 x = zeros(N,1);
0029 q = randperm(N);
0030 x(q(1:T)) = sign(randn(T,1));
0031
0032
0033 A = randn(M,N)/sqrt(M);
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 sigma = 0.01;
0049 e = randn(M,1)*sigma;
0050 y = A*x+e;
0051
0052
0053
0054 epsilon_vec = [ones(N/2,1); ones(N/2,1)*1e4]*1e-2;
0055
0056 tau = 1e-2;
0057 W_new = ones(N,1);
0058 W_new(abs(x)>0) = 1e-5./abs(x(abs(x)>0));
0059
0060 epsilon_vec = tau.*W_new;
0061 unique_eps = sort(unique(epsilon_vec),'descend');
0062 thresh = min(epsilon_vec);
0063
0064 maxiter = 4*N;
0065
0066 in = [];
0067 in.x_orig = x;
0068 in.epsilon_vec = epsilon_vec;
0069 in.maxiter = maxiter;
0070 in.delx_mode = 'mil';
0071 out = wtBPDN_function(A,y,in);
0072 xh_wt = out.x_out;
0073 gamma_wt = out.gamma;
0074 iter_wt = out.iter;
0075
0076
0077
0078
0079 z_x = zeros(N,1);
0080 gamma_x = [];
0081
0082
0083 Primal_constrk = -A'*y;
0084 constr_mask = abs(Primal_constrk)>epsilon_vec;
0085 [c i] = max(abs(Primal_constrk.*constr_mask));
0086 eps_iter = sum(unique_eps>c)+1;
0087
0088 gamma_xk = i;
0089
0090 z_x(gamma_xk) = -sign(Primal_constrk(gamma_xk));
0091 epsilon = c;
0092 Primal_constrk(gamma_xk) = sign(Primal_constrk(gamma_xk))*epsilon;
0093 xk_1 = zeros(N,1);
0094
0095 z_xk = z_x;
0096
0097
0098 done = 0;
0099 iter = 0;
0100 data_precision = eps;
0101
0102 old_delta = 0;
0103 out_x = [];
0104 count_delta_stop = 0;
0105
0106
0107 constraint_plots = 1;
0108
0109 AtAgx = A(:,gamma_xk)'*A(:,gamma_xk);
0110 iAtAgx = inv(AtAgx);
0111
0112 while ~done
0113 iter = iter+1;
0114
0115
0116 gamma_x = gamma_xk;
0117 z_x = z_xk;
0118 x_k = xk_1;
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130 indicator_temp = epsilon>epsilon_vec(gamma_x);
0131 del_x = iAtAgx*(indicator_temp.*z_x(gamma_x));
0132 del_x_vec = zeros(N,1);
0133 del_x_vec(gamma_x) = del_x;
0134
0135 pk = Primal_constrk;
0136
0137 dk = A'*(A(:,gamma_x)*del_x);
0138
0139
0140 pk_temp = Primal_constrk;
0141 gammaL_temp = find(abs(abs(Primal_constrk)-epsilon)<min(epsilon,1e-12));
0142
0143
0144 xk_temp = x_k;
0145 gammaX_temp = find(abs(x_k)<1*eps);
0146
0147
0148 temp_gamma = zeros(N,1);
0149 temp_gamma(gamma_x) = gamma_x;
0150 gamma_xc = find([1:N]' ~= temp_gamma);
0151
0152
0153 eps_temp = epsilon.*(epsilon>epsilon_vec(gamma_xc))+epsilon_vec(gamma_xc).*(epsilon<=epsilon_vec(gamma_xc));
0154 one_temp = epsilon>epsilon_vec(gamma_xc);
0155 if find(one_temp-1)
0156 stp = 1;
0157 end
0158 if find(eps_temp-epsilon)
0159 stp = 1;
0160 end
0161 delta1_constr = (eps_temp-pk(gamma_xc))./(one_temp+dk(gamma_xc));
0162 delta1_pos_ind = find(delta1_constr>0);
0163 delta1_pos = delta1_constr(delta1_pos_ind);
0164 [delta1 i_delta1] = min(delta1_pos);
0165 if isempty(delta1)
0166 delta1 = inf;
0167 end
0168 delta2_constr = (eps_temp+pk(gamma_xc))./(one_temp-dk(gamma_xc));
0169 delta2_pos_ind = find(delta2_constr>0);
0170 delta2_pos = delta2_constr(delta2_pos_ind);
0171 [delta2 i_delta2] = min(delta2_pos);
0172 if isempty(delta2)
0173 delta2 = inf;
0174 end
0175
0176 if delta1>delta2
0177 delta = delta2;
0178 i_delta = gamma_xc(delta2_pos_ind(i_delta2));
0179 else
0180 delta = delta1;
0181 i_delta = gamma_xc(delta1_pos_ind(i_delta1));
0182 end
0183
0184 delta3_constr = (-x_k(gamma_x)./del_x_vec(gamma_x));
0185 delta3_pos_index = find(delta3_constr>0);
0186 [delta3 i_delta3] = min(delta3_constr(delta3_pos_index));
0187 out_x_index = gamma_x(delta3_pos_index(i_delta3));
0188
0189 chk_x = 0;
0190 out_x = [];
0191 if delta3 > 0 & delta3 <= delta
0192 chk_x = 1;
0193 delta = delta3;
0194 out_x = out_x_index;
0195 end
0196
0197 [i_delta out_x delta -chk_x]
0198 if old_delta < 4*eps & delta < 4*eps
0199 count_delta_stop = count_delta_stop + 1;
0200 else
0201 count_delta_stop = 0;
0202 end
0203 if count_delta_stop >= 50
0204 disp('stuck in some corner');
0205 break;
0206 end
0207 old_delta = delta;
0208
0209 xk_1 = x_k+delta*del_x_vec;
0210 Primal_constrk = pk+delta*dk;
0211 epsilon_old = epsilon;
0212 epsilon = epsilon-delta;
0213
0214 if epsilon <= unique_eps(eps_iter)
0215 epsilon = unique_eps(eps_iter);
0216 delta_end = epsilon_old-epsilon;
0217 Primal_constrk = pk+delta_end*dk;
0218 epsilon_temp = epsilon.*(epsilon>epsilon_vec(gamma_xk))+epsilon_vec(gamma_xk).*(epsilon<=epsilon_vec(gamma_xk));
0219 Primal_constrk(gamma_x) = sign(Primal_constrk(gamma_x)).*epsilon_temp;
0220
0221 xk_1 = x_k + delta_end*del_x_vec;
0222 eps_iter = eps_iter+1;
0223 if eps_iter > length(unique_eps)
0224 disp('done!');
0225 break;
0226 else
0227 disp('switch epsilon!');
0228 continue;
0229 end
0230 end
0231 if epsilon <= min(epsilon_vec);
0232 delta_end = epsilon_old-thresh;
0233 Primal_constrk = pk+delta_end*dk;
0234 xk_1 = x_k + delta_end*del_x_vec;
0235 disp('done!');
0236 break;
0237 end
0238
0239 if length(gamma_x)==M & chk_x ==0
0240 stp =1;
0241 disp('Cannot do it Sire');
0242 break;
0243 end
0244
0245 if chk_x == 1
0246
0247 gx_old = gamma_x;
0248
0249 outx_index = find(gamma_x==out_x);
0250 gamma_x(outx_index) = gamma_x(end);
0251 gamma_x(end) = out_x;
0252 gamma_xk = gamma_x(1:end-1);
0253
0254 rowi = outx_index;
0255 colj = outx_index;
0256 AtAgx_ij = AtAgx;
0257 temp_row = AtAgx_ij(rowi,:);
0258 AtAgx_ij(rowi,:) = AtAgx_ij(end,:);
0259 AtAgx_ij(end,:) = temp_row;
0260 temp_col = AtAgx_ij(:,colj);
0261 AtAgx_ij(:,colj) = AtAgx_ij(:,end);
0262 AtAgx_ij(:,end) = temp_col;
0263
0264 iAtAgx_ij = iAtAgx;
0265 temp_row = iAtAgx_ij(colj,:);
0266 iAtAgx_ij(colj,:) = iAtAgx_ij(end,:);
0267 iAtAgx_ij(end,:) = temp_row;
0268 temp_col = iAtAgx_ij(:,rowi);
0269 iAtAgx_ij(:,rowi) = iAtAgx_ij(:,end);
0270 iAtAgx_ij(:,end) = temp_col;
0271
0272 AtAgx = AtAgx_ij(1:end-1,1:end-1);
0273 iAtAgx = update_inverse(AtAgx_ij, iAtAgx_ij,2);
0274 xk_1(out_x) = 0;
0275 else
0276
0277 gamma_xk = [gamma_x; i_delta];
0278 i_theta = i_delta;
0279 new_x = i_delta;
0280 AtAnl = A(:,gamma_x)'*A(:,new_x);
0281 AtAgx_mod = [AtAgx A(:,gamma_x)'*A(:,i_theta); AtAnl' A(:,new_x)'*A(:,i_theta)];
0282
0283 AtAgx = AtAgx_mod;
0284 iAtAgx = update_inverse(AtAgx, iAtAgx,1);
0285 xk_1(i_theta) = 0;
0286
0287 gamma_x = gamma_xk;
0288 end
0289
0290 z_xk = zeros(N,1);
0291 z_xk(gamma_xk) = -sign(Primal_constrk(gamma_xk));
0292 epsilon_temp = epsilon.*(epsilon>epsilon_vec(gamma_x))+epsilon_vec(gamma_x).*(epsilon<=epsilon_vec(gamma_x));
0293 Primal_constrk(gamma_x) = sign(Primal_constrk(gamma_x)).*epsilon_temp;
0294
0295 if iter > 500*T
0296 disp('too many iterations ooooooooops');
0297 break;
0298 end
0299
0300 if constraint_plots
0301 fig = figure(1);
0302 subplot(2,1,1)
0303 hold off
0304 plot(pk,'.r', 'MarkerSize',14);
0305 hold on;
0306 plot(Primal_constrk, 'LineWidth',1);
0307
0308 if chk_x == 0
0309 plot(new_x, Primal_constrk(new_x),'or','MarkerSize',18,'LineWidth',2);
0310 text(new_x, Primal_constrk(new_x)*1.1, ['Incoming \gamma = ',num2str(new_x)],'FontSize',14);
0311 else
0312 plot(out_x, Primal_constrk(out_x),'*k','MarkerSize',18,'LineWidth',2);
0313 text(out_x,Primal_constrk(out_x)*1.1, ['Outgoing \gamma = ',num2str(out_x)],'FontSize',14);
0314 end
0315 set(gca,'FontSize',16, 'XLim',[1 N] );
0316 title({'BPDN shrinkage constraints,'; ['n = ',num2str(N), ', m = ', num2str(M), ', T = ',num2str(T)]});
0317 plot(1:N, epsilon*ones(1,N),'--k','MarkerSize',12);
0318 plot(1:N, -epsilon*ones(1,N), '--k','MarkerSize',12);
0319 plot(1:N, epsilon_old*ones(1,N),'--m','MarkerSize',12);
0320 plot(1:N, -epsilon_old*ones(1,N), '--m','MarkerSize',12);
0321
0322 figure(1);
0323 subplot(2,1,2)
0324 hold off
0325 plot(x_k,'.r','MarkerSize',14); hold on;
0326 plot(xk_1,'LineWidth',1);
0327 if chk_x == 1
0328 plot(out_x, 0,'ok', 'MarkerSize',18,'LineWidth',2);
0329 else
0330 plot(new_x, 0,'or', 'MarkerSize',18,'LineWidth',2);
0331 end
0332 set(gca,'FontSize',16,'XLim',[1 N]);
0333 title(['BPDN estimate at \tau = ',num2str(epsilon), ', iter = ', num2str(iter)]);
0334
0335 if iter == 1
0336 disp(' ');
0337 disp('Every frame in the figure corresponds to a critical point on the homotopy path.')
0338 disp('Circle represents an incoming element, star represents an outgoing element.');
0339 disp(' ');
0340 disp('Put pause somewhere in the code to see this. ');
0341 disp('For now press some key to continue...');
0342
0343 end
0344
0345
0346
0347 end
0348
0349
0350 end
0351
0352 fig = figure(1);
0353 subplot(2,1,1)
0354 hold off
0355 plot(pk,'.r', 'MarkerSize',14);
0356 hold on;
0357 plot(Primal_constrk, 'LineWidth',1);
0358
0359
0360 set(gca,'FontSize',16, 'XLim',[1 N] );
0361 title({'BPDN shrinkage constraints,'; ['n = ',num2str(N), ', m = ', num2str(M), ', T = ',num2str(T)]});
0362 plot(1:N, epsilon*ones(1,N),'--k','MarkerSize',12);
0363 plot(1:N, -epsilon*ones(1,N), '--k','MarkerSize',12);
0364 plot(1:N, epsilon_old*ones(1,N),'--m','MarkerSize',12);
0365 plot(1:N, -epsilon_old*ones(1,N), '--m','MarkerSize',12);
0366
0367 figure(1);
0368 subplot(2,1,2)
0369 hold off
0370 plot(x_k,'.r','MarkerSize',14); hold on;
0371 plot(xk_1,'LineWidth',1);
0372 set(gca,'FontSize',16,'XLim',[1 N]);
0373 title(['BPDN estimate at \tau = ',num2str(thresh), ', iter = ', num2str(iter)]);
0374
0375
0376 digit = 6; if sigma > 0; digit = 7; end
0377 opts = [];
0378 opts.tol = 10^(-digit);
0379 W_new = ones(N,1);
0380 opts.weights = W_new;
0381 opts.print = 0;
0382 opts.maxit = maxiter;
0383
0384 opts.nu = 0; opts.rho = tau;
0385 tic;
0386 [x_yall1,Out] = yall1(A,y,opts);
0387
0388
0389 cvx_begin
0390 cvx_precision best
0391 variable xc(N);
0392 minimize( sum(epsilon_vec.*abs(xc))+ 1/2*sum(square(A*xc-y)))
0393 cvx_end
0394
0395
0396 figure(101); plot([xc xk_1])
0397 figure(102); plot([xc-xk_1])