0001 function [u,iter] = ip_alloc(B,v,umin,umax,ud,gam,tol,imax)
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 if nargin < 8
0037 imax = 100;
0038 [k,m] = size(B);
0039 if nargin < 7, tol = 1e-4; end
0040 if nargin < 6, gam = 1e4; end
0041 if nargin < 5, ud = zeros(m,1); end
0042 end
0043
0044
0045
0046
0047
0048
0049
0050
0051 h = 1/gam; A = B; b = v - B*umin; xd = ud - umin; xmax = umax - umin;
0052
0053
0054 c = -2*(b'*A + h*xd');
0055
0056
0057 [x,iter] = pdq(A,b,c',xmax,h,tol,imax);
0058
0059
0060 u = x + umin;
0061
0062 function [x,iter] = pdq(A,b,c,u,wc,tol,imax);
0063
0064
0065 [k,m] = size(A);
0066 As2=A*sqrt(2);
0067 [s,w,x,z] = startpt(A,b,c,u,wc);
0068 rho = .9995; sig = 0.1; m2 = 2*m;
0069 xs = x.*s; wz = w.*z;
0070 mu = sig*(sum(xs + wz))/m2;
0071 nxl=norm(x,1); iHd = 0;
0072 ru = 0; rc = 0; rb = 0;
0073
0074 for iter = 1:imax+1
0075 if (mu < tol)
0076
0077 break;
0078 end;
0079 rxs = (xs - mu);
0080 iw = 1./w; rwz = (wz - mu);
0081 ix = 1./x; ixs = ix.*s;
0082 iwz = iw.*z;
0083 d = 2*wc + ixs + iwz;
0084 [ds,dw,dx,dz] = direct(d,As2,rb,rc,ru,rxs,rwz,ix,iw,ixs,iwz,z);
0085 alpha = stepsize(dx,ds,dw,dz,x,s,w,z);
0086 ralpha = rho*alpha;
0087 s = s + ralpha*ds;
0088 w = w + ralpha*dw;
0089 x = x + ralpha*dx;
0090 z = z + ralpha*dz;
0091
0092 xs = x.*s; wz = w.*z;
0093 gap = sum(xs + wz)/m2;
0094 mu = min(.1,100*gap)*gap;
0095
0096 end
0097
0098 iter=iter-1;
0099
0100
0101
0102 function [s,w,x,z] = startpt(A,b,c,u,wc);
0103
0104 m = size(A,2);
0105 en = ones(m,1);
0106
0107 x = u/2; w = u - x; z = en; s = en;
0108 if 0
0109 AA = csm(A');
0110 for i=1:m
0111 AA(i,i) = AA(i,i) + wc;
0112 end
0113 else
0114 AA = A'*A + wc*eye(m);
0115 end
0116 ec = c + 2*AA*x;
0117 g = .1; sg = 1+g;
0118 i = find(ec>0); s(i) = sg*ec(i); z(i) = g*ec(i);
0119 i = find(ec<0); z(i) = -sg*ec(i); s(i) = -g*ec(i);
0120
0121
0122
0123 function [ds,dw,dx,dz] = direct(d,As2,rb,rc,ru,rxs,rwz,ix,iw,ixs,iwz,z);
0124
0125 ixrxs = ix.*rxs; iwrwz = iw.*rwz;
0126 rr = iwrwz - ixrxs;
0127
0128 if 0
0129 iHd = smwf(d,As2);
0130 dx = iHd*rr;
0131 else
0132
0133 dx = (diag(d)+As2'*As2)\rr;
0134 end
0135 ds = -ixs.*dx - ixrxs; dw = -dx;
0136 dz = -iwz.*dw - iwrwz;
0137
0138
0139
0140 function alpha = stepsize(dx,ds,dw,dz,x,s,w,z);
0141 i = find(ds<0); as = min(-s(i)./ds(i));
0142 i = find(dw<0); aw = min(-w(i)./dw(i));
0143 i = find(dx<0); ax = min(-x(i)./dx(i));
0144 i = find(dz<0); az = min(-z(i)./dz(i));
0145 alpha = min([aw ax as az 1]);
0146
0147
0148
0149
0150
0151
0152
0153
0154 function X = csm(B);
0155
0156 [m,n] = size(B);
0157 for i=1:m-1
0158 for j=i+1:m
0159 X(i,j) = B(i,:)*B(j,:)';
0160 X(j,i) = X(i,j);
0161 end;
0162 end;
0163 for i = 1:m; X(i,i) = B(i,:)*B(i,:)'; end;
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173 function H = smwf(A,B);
0174
0175 [k,m] = size(B);
0176 iA = 1./A; iAB = zeros(m,k); BiA = zeros(k,m); BAB = zeros(k);
0177 for i = 1:k iAB(:,i) = iA.*B(i,:)'; end;
0178 for i = 1:k BiA(i,:) = B(i,:).*iA'; end;
0179 for i=1:k-1
0180 for j=i+1:k
0181 BAB(i,j) = B(i,:)*iAB(:,j);
0182 BAB(j,i) = BAB(i,j);
0183 end;
0184 end;
0185 for i = 1:k; BAB(i,i) = B(i,:)*iAB(:,i); end;
0186 Q = BAB;
0187 for i = 1:k; Q(i,i) = Q(i,i) + 1; end
0188 QBA = Q\iAB';
0189 for i=1:m-1
0190 for j=i+1:m
0191 ABQBA(i,j) = iAB(i,:)*QBA(:,j);
0192 ABQBA(j,i) = ABQBA(i,j);
0193 end;
0194 end;
0195 for i = 1:m; ABQBA(i,i) = iAB(i,:)*QBA(:,i); end
0196 H = -ABQBA;
0197 for i = 1:m
0198 H(i,i) = iA(i) + H(i,i);
0199 end
0200