0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 function out = wtBPDN_Update_function_v2(A, y, in);
0034
0035
0036 x_old = in.x_old;
0037 gamma_xh = in.gamma;
0038 pk_old = in.pk_old;
0039 yhat = in.yhat;
0040
0041 tau = in.tau;
0042 maxiter = in.maxiter;
0043
0044 t0 = cputime;
0045 N = size(A,2);
0046 M = size(A,1);
0047
0048
0049
0050 xk_1 = x_old;
0051 ds = pk_old;
0052 d = A'*(yhat-y);
0053
0054 epsilon = 0;
0055
0056 done = 0;
0057 iter = 0;
0058 itr_history = [];
0059 idelta = gamma_xh(1); flag = 1;
0060
0061
0062 in_delx = [];
0063 delx_mode = in.delx_mode;
0064 rhs = ds-d;
0065 update_mode = 'init1';
0066 update_delx;
0067
0068 while ~done
0069 iter = iter+1;
0070 x_k = xk_1;
0071 z_x = -sign(pk_old);
0072
0073
0074
0075
0076
0077
0078
0079 delx_vec = zeros(N,1);
0080 delx_vec(gamma_xh) = delx;
0081
0082 if sign(delx_vec(idelta)) == sign(pk_old(idelta)) && iter > 1
0083 delta = 0; flag = 0;
0084 else
0085 pk = pk_old;
0086 dk = A'*(A(:,gamma_xh)*delx)+d-ds;
0087
0088 temp_gamma = zeros(N,1);
0089 temp_gamma(gamma_xh) = gamma_xh;
0090 gamma_xc = find([1:N]' ~= temp_gamma);
0091
0092
0093 delta1_constr = (tau-pk)./(dk);
0094 delta1_constr = delta1_constr(gamma_xc);
0095 delta2_constr = (-tau-pk)./(dk);
0096 delta2_constr = delta2_constr(gamma_xc);
0097 delta3_constr = (-x_k(gamma_xh)./delx);
0098 idelta_1 = (delta1_constr>0);
0099 idelta_2 = (delta2_constr>0);
0100 idelta_3 = (delta3_constr>0);
0101 delta1 = min(delta1_constr(idelta_1));
0102 delta2 = min(delta2_constr(idelta_2));
0103 delta3 = min(delta3_constr(idelta_3));
0104 if isempty(delta1); delta1 = inf; end
0105 if isempty(delta2); delta2 = inf; end
0106 if isempty(delta3); delta3 = inf; end
0107 if delta1>delta2
0108 delta = delta2;
0109 idelta = gamma_xc(delta2_constr==delta2);
0110 flag = 1;
0111 else
0112 delta = delta1;
0113 idelta = gamma_xc(delta1_constr==delta1);
0114 flag = 1;
0115 end
0116 if delta3 <= delta
0117 delta = delta3;
0118 idelta = gamma_xh(delta3_constr == delta3);
0119 flag = 0;
0120 end
0121 end
0122
0123 e0 = epsilon;
0124 epsilon = e0 + delta;
0125
0126 if epsilon > 1
0127 delta_end = 1-e0;
0128 xk_1 = x_k + delta_end*delx_vec;
0129 break;
0130 end
0131
0132 xk_1 = x_k + delta*delx_vec;
0133 gamma_x_old = gamma_xh;
0134
0135
0136 itr_history = [itr_history; idelta delta flag];
0137
0138
0139 update_supp
0140
0141 pk_old = pk+delta*dk;
0142 pk_old([gamma_xh; idelta]) = sign(pk_old([gamma_xh; idelta])).*tau;
0143
0144
0145 rhs = ds-d;
0146 update_mode = 'update';
0147 update_delx;
0148
0149
0150
0151
0152
0153
0154
0155 constr_violation = nnz((abs(pk_old(gamma_xc))-tau)>1e-10);
0156 sign_violation = nnz((sign(pk_old(gamma_xh))+sign(xk_1(gamma_xh)))>1);
0157 if constr_violation
0158 chk = gamma_xc((abs(pk_old(gamma_xc))-tau)>1e-10);
0159 stp = 1;
0160 fprintf('problem... with constraint violation -- %s', mfilename);
0161
0162 fprintf('Refactorize the matrix... recompute delx \n');
0163 update_mode = 'init0';
0164 update_delx;
0165 end
0166 if sign_violation>=1
0167 chk = gamma_xh(sign(pk_old(gamma_xh))+sign(xk_1(gamma_xh))>1);
0168 stp = 1;
0169 fprintf('problem... sign mismatch -- %s',mfilename);
0170 fprintf('Refactorize the matrix... recompute delx \n');
0171 update_mode = 'init0';
0172 update_delx;
0173 end
0174
0175
0176
0177 end
0178
0179 total_iter = iter;
0180 total_time = cputime-t0;
0181
0182 out = [];
0183 out.x_out = xk_1;
0184 out.gamma = gamma_xh;
0185 out.iter = total_iter;
0186 out.time = total_time;