update_primal
PURPOSE 
update_primal.m
SYNOPSIS 
function [i_delta, out_x, delta, chk_x] = update_primal(gamma_x, gamma_lambda, z_x, x_k, del_x_vec, pk, dk, epsilon, out_lambda);
DESCRIPTION 
CROSS-REFERENCE INFORMATION 
This function calls:
This function is called by:
SOURCE CODE 
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 function [i_delta, out_x, delta, chk_x] = update_primal(gamma_x, gamma_lambda, z_x, x_k, del_x_vec, pk, dk, epsilon, out_lambda);
0028
0029 N = length(x_k);
0030
0031
0032
0033 temp_gamma = zeros(N,1);
0034 temp_gamma(gamma_lambda) = gamma_lambda;
0035 gamma_lc = find([1:N]' ~= temp_gamma);
0036
0037 delta1_constr = (epsilon-pk(gamma_lc))./(1+dk(gamma_lc));
0038 delta1_pos_ind = find(delta1_constr>0);
0039 delta1_pos = delta1_constr(delta1_pos_ind);
0040 [delta1 i_delta1] = min(delta1_pos);
0041 if isempty(delta1)
0042 delta1 = inf;
0043 end
0044 delta2_constr = (epsilon+pk(gamma_lc))./(1-dk(gamma_lc));
0045 delta2_pos_ind = find(delta2_constr>0);
0046 delta2_pos = delta2_constr(delta2_pos_ind);
0047 [delta2 i_delta2] = min(delta2_pos);
0048 if isempty(delta2)
0049 delta2 = inf;
0050 end
0051
0052 if delta1>delta2
0053 delta = delta2;
0054 i_delta = gamma_lc(delta2_pos_ind(i_delta2));
0055 else
0056 delta = delta1;
0057 i_delta = gamma_lc(delta1_pos_ind(i_delta1));
0058 end
0059
0060 delta3_constr = (-x_k(gamma_x)./del_x_vec(gamma_x));
0061 delta3_pos_index = find(delta3_constr>0);
0062 [delta3 i_delta3] = min(delta3_constr(delta3_pos_index));
0063 out_x_index = gamma_x(delta3_pos_index(i_delta3));
0064
0065 chk_x = 0;
0066 out_x = [];
0067 if delta3 > 0 & delta3 <= delta
0068 chk_x = 1;
0069 delta = delta3;
0070 out_x = out_x_index;
0071 end
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086 xk_1 = x_k+delta*del_x_vec;
0087 xk_1(out_x) = 0;
0088 wrong_sign = find(sign(xk_1(gamma_x)).*z_x(gamma_x)==-1);
0089 if ~isempty(gamma_x(wrong_sign))
0090 disp('Sign mismatch!');
0091
0092
0093 chk_x = 1;
0094 delta = 0;
0095
0096
0097
0098 out_x = gamma_x(wrong_sign(1));
0099 end
0100
0101
0102
0103
0104 i_delta_temp = gamma_lc(abs(pk(gamma_lc)+delta*dk(gamma_lc))-(epsilon-delta) >= 10*eps);
0105 if ~isempty(i_delta_temp)
0106 if ~isempty(out_lambda)
0107 i_delta_more = i_delta_temp;
0108 else
0109 i_delta_more = i_delta_temp;
0110 end
0111 if length(i_delta_more)>=1 & ~sum((i_delta_temp==i_delta))
0112
0113 disp('Degenerate indices in previous iteration!');
0114
0115
0116
0117
0118 [v_temp i_temp] = max(-pk(i_delta_more)./dk(i_delta_more));
0119 i_delta = i_delta_more(i_temp);
0120 delta = 0;
0121 chk_x = 0;
0122 out_x = [];
0123 end
0124 end
Generated on Mon 10-Jun-2013 23:03:23 by m2html © 2005