update_dual
PURPOSE 
update_dual.m
SYNOPSIS 
function [i_theta, out_lambda, theta, chk_lambda] = update_dual(gamma_x, gamma_lambda, z_lambda, lambda_k, del_lambda_p, ak, bk, new_lambda, out_x);
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_theta, out_lambda, theta, chk_lambda] = update_dual(gamma_x, gamma_lambda, z_lambda, lambda_k, del_lambda_p, ak, bk, new_lambda, out_x);
0028
0029 N = length(lambda_k);
0030
0031
0032
0033 temp_gamma = zeros(N,1);
0034 temp_gamma(gamma_x) = gamma_x;
0035 gamma_xc = find([1:N]' ~= temp_gamma);
0036
0037 theta1_constr = (1-ak(gamma_xc))./bk(gamma_xc);
0038 theta1_pos_index = find(theta1_constr>0);
0039 theta1_pos = theta1_constr(theta1_pos_index);
0040 [theta1 i_theta1] = min(theta1_pos);
0041 if isempty(theta1)
0042 theta1 = inf;
0043 end
0044 theta2_constr = -(1+ak(gamma_xc))./bk(gamma_xc);
0045 theta2_pos_index = find(theta2_constr>0);
0046 theta2_pos = theta2_constr(theta2_pos_index);
0047 [theta2 i_theta2] = min(theta2_pos);
0048 if isempty(theta2)
0049 theta2 = inf;
0050 end
0051
0052 if theta1 > theta2
0053 theta = theta2;
0054 i_theta = gamma_xc(theta2_pos_index(i_theta2));
0055 else
0056 theta = theta1;
0057 i_theta = gamma_xc(theta1_pos_index(i_theta1));
0058 end
0059
0060 gamma_lambda_app = [gamma_lambda; new_lambda];
0061 theta3_constr = (-lambda_k(gamma_lambda_app)./del_lambda_p(gamma_lambda_app));
0062 theta3_pos_index = find(theta3_constr>0);
0063 [theta3 i_theta3] = min(theta3_constr(theta3_pos_index));
0064 out_lambda_index = gamma_lambda_app(theta3_pos_index(i_theta3));
0065
0066 chk_lambda = 0;
0067 out_lambda = [];
0068 if theta3 > 0 & theta3<theta
0069 chk_lambda = 1;
0070 theta = theta3;
0071 out_lambda = out_lambda_index;
0072 end
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082 lambdak_1 = lambda_k+theta*del_lambda_p;
0083 lambdak_1(out_lambda) = 0;
0084 wrong_sign = find(sign(lambdak_1(gamma_lambda)).*z_lambda(gamma_lambda)==-1);
0085 if ~isempty(gamma_lambda(wrong_sign))
0086 chk_lambda = 1;
0087 theta = 0;
0088 out_lambda = gamma_lambda(wrong_sign(1));
0089 end
0090
0091
0092
0093
0094
0095
0096
0097
0098 i_theta_temp = gamma_xc(find(abs(ak(gamma_xc)+theta*bk(gamma_xc))-1 >= 10*eps));
0099 if ~isempty(out_x)
0100 i_theta_more = i_theta_temp(find(i_theta_temp~=out_x));
0101 else
0102 i_theta_more = i_theta_temp;
0103 end
0104 if ~isempty(i_theta_more)
0105 theta = 0;
0106 i_theta = i_theta_more(1);
0107 out_lambda=[];
0108 chk_lambda=0;
0109 end
Generated on Mon 10-Jun-2013 23:03:23 by m2html © 2005