0001 function out = compute_delta_v2(in)
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 gamma_x = in.gamma; gamma_xc = in.gamma_c;
0029 pk = in.pk(gamma_xc); dk = in.dk(gamma_xc);
0030 if length(in.ak) == 1
0031 ak = in.ak*ones(length(gamma_xc),1);
0032 else
0033 ak = in.ak(gamma_xc);
0034 end
0035
0036 delx_vec = in.delx_vec; x_k = in.x;
0037
0038
0039 if isfield(in,'shrinkage_flag'); shrinkage_flag = in.shrinkage_flag; else shrinkage_flag = 2; end
0040
0041 if isfield(in,'nonneg'); nonneg = in.nonneg; else nonneg = 0; end
0042
0043 out = [];
0044
0045
0046 if shrinkage_flag ~= 0
0047
0048
0049
0050 delta1_constr = (ak-pk)./(dk);
0051
0052 delta1_pos_ind = find(delta1_constr>0);
0053 delta1_pos = delta1_constr(delta1_pos_ind);
0054 [delta1 i_delta1] = min(delta1_pos);
0055 if isempty(delta1)
0056 delta1 = inf;
0057 end
0058
0059
0060 delta2_constr = (-ak-pk)./(dk);
0061
0062 delta2_pos_ind = find(delta2_constr>0);
0063 delta2_pos = delta2_constr(delta2_pos_ind);
0064 [delta2 i_delta2] = min(delta2_pos);
0065 if isempty(delta2)
0066 delta2 = inf;
0067 end
0068
0069 if delta1>delta2 || nonneg
0070
0071
0072 delta = delta2;
0073 idelta = gamma_xc(delta2_pos_ind(i_delta2));
0074 else
0075 delta = delta1;
0076 idelta = gamma_xc(delta1_pos_ind(i_delta1));
0077 end
0078
0079 out.delta_in = delta; out.idelta_in = idelta;
0080 if shrinkage_flag == 1
0081 out.delta = delta; out.idelta = idelta;
0082 out.flag = 1;
0083 return;
0084 end
0085 end
0086
0087 if shrinkage_flag ~= 1
0088 delta3_constr = (-x_k(gamma_x)./delx_vec(gamma_x));
0089 delta3_pos_index = find(delta3_constr>0);
0090 [delta3 i_delta3] = min(delta3_constr(delta3_pos_index));
0091 out_x = gamma_x(delta3_pos_index(i_delta3));
0092 if isempty(delta3)
0093 delta3 = inf;
0094 end
0095
0096 out.delta_out = delta3; out.idelta_out = out_x;
0097
0098 if shrinkage_flag == 0
0099 out.delta = delta3; out.idelta = out_x;
0100 out.flag = 0;
0101 return;
0102 end
0103 end
0104
0105 flag = 1;
0106 if delta3 > 0 && delta3 <= delta
0107 flag = 0;
0108 delta = delta3;
0109 idelta = out_x;
0110 end
0111
0112 out.delta = delta; out.idelta = idelta;
0113 out.flag = flag;
0114