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
0034
0035
0036 function out = wtBPDN_Update_function_v1(A, y, in);
0037
0038
0039 x_old = in.x_old;
0040 gamma_xh = in.gamma;
0041 pk_old = in.pk_old;
0042 W_old = in.W_old;
0043 W_new = in.W_new;
0044 maxiter = in.maxiter;
0045
0046 t0 = cputime;
0047 N = size(A,2);
0048 M = size(A,1);
0049
0050
0051
0052 xk_1 = x_old;
0053
0054 epsilon = 0;
0055 Wk = (1-epsilon)*W_old + epsilon*W_new;
0056 dW = W_new-W_old;
0057 z_x = -sign(pk_old);
0058
0059 done = 0;
0060 iter = 0;
0061 idelta = gamma_xh(1); flag = 1;
0062 itr_history = [];
0063
0064
0065 in_delx = [];
0066 delx_mode = in.delx_mode;
0067 rhs = -dW.*z_x;
0068 opts = in;
0069 update_mode = 'init1';
0070 update_delx;
0071
0072
0073 while ~done
0074 iter = iter+1;
0075 x_k = xk_1;
0076
0077 delx_vec = zeros(N,1);
0078 delx_vec(gamma_xh) = delx;
0079
0080 if sign(delx_vec(idelta)) == sign(pk_old(idelta)) && iter > 1
0081 delta = 0; flag = 0;
0082 else
0083 pk = pk_old;
0084 dk = A'*(A(:,gamma_xh)*delx);
0085
0086 if flag == 0 && dW(idelta) < sign(pk(idelta))*dk(idelta)
0087 delta = 0; flag = 1;
0088 else
0089 temp_gamma = zeros(N,1);
0090 temp_gamma(gamma_xh) = gamma_xh;
0091 gamma_xc = find([1:N]' ~= temp_gamma);
0092
0093
0094 in.delta_flag = 2;
0095 in.pk = pk; in.dk = dk;
0096 in.ak = Wk; in.bk = dW;
0097 in.gamma = gamma_xh; in.gamma_c = gamma_xc;
0098 in.delx_vec = delx_vec; in.x = xk_1;
0099 out = compute_delta(in);
0100 delta = out.delta; idelta = out.idelta;
0101 flag = out.flag;
0102 end
0103 end
0104
0105 e0 = epsilon;
0106 epsilon = e0 + delta;
0107
0108 if epsilon > 1
0109 delta_end = 1-e0;
0110 xk_1 = x_k + delta_end*delx_vec;
0111 break;
0112 end
0113
0114 xk_1 = x_k + delta*delx_vec;
0115 gamma_x_old = gamma_xh;
0116
0117
0118 itr_history = [itr_history; idelta delta flag];
0119
0120
0121 update_supp;
0122
0123 pk_old = pk+delta*dk;
0124 Wk_old = Wk;
0125 Wk = (1-epsilon)*W_old + epsilon*W_new;
0126 pk_old([gamma_xh; idelta]) = sign(pk_old([gamma_xh; idelta])).*Wk([gamma_xh; idelta]);
0127
0128
0129 z_x = -sign(pk_old);
0130 rhs = -dW.*z_x;
0131 update_mode = 'update';
0132 update_delx;
0133
0134
0135
0136
0137
0138
0139
0140 constr_violation = nnz((abs(pk_old(gamma_xc))-Wk(gamma_xc))>1e-10);
0141 sign_violation = nnz((sign(pk_old(gamma_xh))+sign(xk_1(gamma_xh)))>1);
0142 if constr_violation
0143 chk = gamma_xc((abs(pk_old(gamma_xc))-Wk(gamma_xc))>1e-10);
0144 stp = 1;
0145 fprintf('problem... with constraint violation -- %s \n', mfilename);
0146 fprintf('Refactorize the matrix... recompute delx \n');
0147
0148 update_mode = 'init0';
0149 update_delx;
0150 end
0151 if sign_violation>=1
0152 chk = gamma_xh(sign(pk_old(gamma_xh))+sign(xk_1(gamma_xh))>1);
0153 stp = 1;
0154 fprintf('problem... sign mismatch -- %s \n',mfilename);
0155 fprintf('Refactorize the matrix... recompute delx \n');
0156 update_mode = 'init0';
0157 update_delx;
0158 end
0159 end
0160
0161 total_iter = iter;
0162 total_time = cputime-t0;
0163
0164 out = [];
0165 out.x_out = xk_1;
0166 out.gamma = gamma_xh;
0167 out.iter = total_iter;
0168 out.time = total_time;