0001 function [u,A,time,iter] = alloc_sim(method,B,v,plim,rlim,T,varargin)
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 [k,m] = size(B);
0033
0034 copl = iscoplanar(B);
0035
0036 N = size(v,2);
0037
0038 u = zeros(m,N);
0039 A = zeros(m,N);
0040 iter = zeros(1,N);
0041 time = zeros(1,N);
0042
0043
0044 switch method
0045 case {'qp','dyn'}
0046 alg = 'wls';
0047 case 'dir'
0048 alg = 'dir';
0049 end
0050 M = 1;
0051 imax = 100;
0052 gam = 1e6;
0053 tol = 1e-6;
0054 hs = 1;
0055 ui = [];
0056 Wi = zeros(m,1);
0057 Wv = eye(k);
0058 Wu = eye(m);
0059 ud = zeros(m);
0060 W1 = eye(m);
0061 W2 = zeros(m);
0062 S = pinv(B);
0063
0064 for i=1:2:length(varargin)
0065 switch(varargin{i})
0066
0067 case 'alg'
0068 alg = varargin{i+1};
0069 case 'rep'
0070 M = varargin{i+1};
0071
0072
0073 case 'imax'
0074 imax = varargin{i+1};
0075 case 'gam'
0076 gam = varargin{i+1};
0077 case 'tol'
0078 tol = varargin{i+1};
0079 case 'hot'
0080 hs = varargin{i+1};
0081 case 'ui'
0082 ui = varargin{i+1};
0083 case 'Wi'
0084 Wi = varargin{i+1};
0085 case 'Wv'
0086 Wv = varargin{i+1};
0087 case 'Wu'
0088 Wu = varargin{i+1};
0089 case 'ud'
0090 ud = varargin{i+1};
0091 case 'W1'
0092 W1 = varargin{i+1};
0093 case 'W2'
0094 W2 = varargin{i+1};
0095 case 'S'
0096 S = varargin{i+1};
0097
0098 otherwise
0099 error(sprintf('Unknown option: %s',varargin{i}));
0100 end
0101 end
0102
0103 if strcmp(alg,'ip')
0104
0105 if any(any(Wv ~= eye(k))) | any(any(Wu ~= eye(m)))
0106 disp(' ')
0107 disp(['** Warning: Non-unit matrices Wv and Wu not handled by' ...
0108 ' IP_ALLOC **'])
0109 disp(' ')
0110 end
0111
0112 if strcmp(method,'dyn')
0113 disp(' ')
0114 disp(['** Warning: Dynamic allocation not handled by IP_ALLOC,' ...
0115 ' resorting to WLS_ALLOC **'])
0116 disp(' ');
0117 alg = 'wls';
0118 end
0119 end
0120
0121 if isempty(ui)
0122
0123 switch method
0124 case 'qp'
0125 [ui,Wi] = wls_alloc(B,v(:,1),plim(:,1),plim(:,2),Wv,Wu,ud);
0126 case 'dyn'
0127 [ui,Wi] = wls_alloc(B,v(:,1),plim(:,1),plim(:,2),Wv,W1,S*v(:,1));
0128 case 'dir'
0129 ui = dir_alloc(B,v(:,1),plim(:,1),plim(:,2));
0130 end
0131 end
0132
0133
0134 if hs
0135 u0 = ui;
0136 W0 = Wi;
0137 end
0138
0139
0140 if strcmp(method,'dyn')
0141 W1sq = W1^2;
0142 W2sq = W2^2;
0143 Wu = sqrtm(W1sq+W2sq);
0144 invWusq = inv(W1sq+W2sq);
0145 end
0146
0147
0148
0149 uprev = ui;
0150 for i=1:N
0151
0152 if isempty(rlim)
0153 umin = plim(:,1);
0154 umax = plim(:,2);
0155 else
0156 umin = max(plim(:,1),uprev+rlim(:,1)*T);
0157 umax = min(plim(:,2),uprev+rlim(:,2)*T);
0158 end
0159 if ~hs
0160 u0 = (umin+umax)/2;
0161 W0 = zeros(m,1);
0162 end
0163
0164
0165 i_min = W0 == -1;
0166 i_max = W0 == +1;
0167 u0(i_min) = umin(i_min);
0168 u0(i_max) = umax(i_max);
0169
0170
0171 if strcmp(method,'dyn')
0172 us = S*v(:,i);
0173 ud = invWusq*(W1sq*us+W2sq*uprev);
0174 end
0175
0176 tic;
0177 for l = 1:M
0178 switch alg
0179 case 'sls'
0180 [u(:,i),W,iter(i)] = ...
0181 sls_alloc(B+copl*j,v(:,i),umin,umax,Wv,Wu,ud,u0,W0,imax);
0182 case 'mls'
0183 [u(:,i),W,iter(i)] = ...
0184 mls_alloc(B,v(:,i),umin,umax,Wv,Wu,ud,u0,W0,imax);
0185 case 'wls'
0186 [u(:,i),W,iter(i)] = ...
0187 wls_alloc(B,v(:,i),umin,umax,Wv,Wu,ud,gam,u0,W0,imax);
0188
0189 case 'wls_c'
0190 [u(:,i),W,iter(i)] = ...
0191 wls_alloc_c(B,v(:,i),umin,umax,Wv,Wu,ud,gam,u0,W0,imax);
0192
0193 case 'wlsc'
0194 [u(:,i),W,iter(i)] = ...
0195 wlsc_alloc(B,v(:,i),umin,umax,Wv,Wu,ud,gam,u0,W0,imax);
0196 case 'ip'
0197 [u(:,i),iter(i)] = ...
0198 ip_alloc(B,v(:,i),umin,umax,ud,gam,tol,imax);
0199 case 'fxp'
0200 u(:,i) = fxp_alloc(B,v(:,i),umin,umax,Wv,Wu,ud,gam,u0,imax);
0201 case 'cgi'
0202 u(:,i) = cgi_alloc(B,v(:,i),umin,umax,Wv,Wu,ud,imax);
0203 case 'dir'
0204 u(:,i) = dir_alloc(B,v(:,i),plim(:,1),plim(:,2));
0205 otherwise
0206 error(sprintf('Unknown allocation algorithm: %s',alg));
0207 end
0208 end
0209
0210 time(i) = toc/M;
0211
0212 u(:,i) = max(umin,min(umax,u(:,i)));
0213
0214
0215
0216 A(:,i) = - 2*(u(:,i)==umin) + (u(:,i)==plim(:,1)) ...
0217 + 2*(u(:,i)==umax) - (u(:,i)==plim(:,2));
0218
0219 uprev = u(:,i);
0220
0221 if hs
0222 u0 = u(:,i);
0223 if any(strcmp(alg,{'sls','wls','wls_c','wlsc','mls'}))
0224 W0 = W;
0225 end
0226 end
0227 end