0001
0002
0003
0004 function [status] = eval_alddx(obj)
0005
0006
0007 status = 0;
0008
0009
0010 if (true || obj.ALddxtck < obj.ticker)
0011 starttime = cputime;
0012
0013
0014
0015
0016 x=obj.x;
0017 Y=obj.Y;
0018
0019
0020 userdata=obj.userdata;
0021
0022
0023
0024 if (obj.NgNLN + obj.NgLIN>0)
0025 [gx, userdata] = obj.confun(x, Y, userdata);
0026 ineqx = obj.ineqshift + obj.ineqmlt .* gx(obj.ineqmap);
0027 obj.eqx = obj.eqshift + gx(obj.eqmap);
0028
0029 [gdx, userdata] = obj.congrad(x, Y, userdata);
0030
0031 if (obj.Nineq>0)
0032 ineqdx = gdx(:,obj.ineqmap) * spdiags(obj.ineqmlt,0,obj.Nineq,obj.Nineq);
0033 else
0034 ineqdx = [];
0035 end
0036
0037 obj.eqdx = gdx(:,obj.eqmap);
0038 end
0039
0040
0041
0042
0043
0044
0045
0046
0047 if (obj.Nineq>0)
0048 ind=1:obj.Nineq;
0049 Lmlt_long=obj.ineqmlt(ind).*obj.uineq(ind).*obj.phi2_D(ineqx(ind)./obj.pineq(ind));
0050
0051
0052 Lmlt = full(sparse(obj.ineqmap(ind),1,Lmlt_long,obj.NgNLN+obj.NgLIN,1));
0053 else
0054 Lmlt = zeros(obj.NgNLN+obj.NgLIN,1);
0055 end
0056
0057
0058
0059
0060
0061 for k=1:obj.Neq
0062 kuser=obj.eqmap(k);
0063 Lmlt(kuser)=obj.ueq(k);
0064 end
0065
0066
0067 if (~isempty(obj.lagrhess))
0068 [ALddx, userdata] = obj.lagrhess(x,Y,Lmlt,userdata);
0069 if (isempty(ALddx))
0070 ALddx=sparse(obj.Nx+obj.NYnnz,obj.Nx+obj.NYnnz);
0071 end
0072 else
0073
0074 [ALddx, userdata] = obj.objhess(x,Y,userdata);
0075 if (isempty(ALddx))
0076 ALddx=sparse(obj.Nx+obj.NYnnz,obj.Nx+obj.NYnnz);
0077 end
0078 for kuser=1:obj.NgNLN
0079 [gddx, userdata] = obj.conhess(x,Y,kuser,userdata);
0080 ALddx = ALddx + Lmlt(kuser)*gddx;
0081 end
0082 end
0083
0084
0085
0086
0087 if (obj.Nxbox>0)
0088 xboxx = obj.xboxshift + obj.xboxmlt .* obj.xall(obj.xboxmap);
0089
0090
0091
0092
0093
0094
0095 diagxbox=zeros(obj.Nx+obj.NYnnz,1);
0096
0097 ind=obj.xboxindbar;
0098 if ~isempty(ind)
0099 for k=ind
0100 kuser=obj.xboxmap(k);
0101 diagxbox(kuser) = diagxbox(kuser) + obj.uxbox(k)*obj.pxbox(k)*obj.phibar_D2(xboxx(k));
0102 end
0103 end
0104
0105 ind=obj.xboxindphi;
0106 if ~isempty(ind)
0107 for k=ind
0108 kuser=obj.xboxmap(k);
0109 diagxbox(kuser) = diagxbox(kuser) + obj.uxbox(k)/obj.pxbox(k)*obj.phi2_D2(xboxx(k)/obj.pxbox(k));
0110 end
0111 end
0112 ALddx = ALddx + spdiags(diagxbox,0,obj.Nx+obj.NYnnz,obj.Nx+obj.NYnnz);
0113 end
0114
0115
0116
0117
0118
0119 ind=obj.ineqindphi;
0120 if (~isempty(ind))
0121 coef=obj.uineq(ind)./obj.pineq(ind).*obj.phi2_D2(ineqx(ind)./obj.pineq(ind));
0122 ALddx = ALddx + ineqdx(:,ind) * spdiags(coef,0,length(ind),length(ind)) * ineqdx(:,ind)';
0123
0124 end
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134 if ~isempty(obj.Yboxindbar)
0135 for k=obj.Yboxindbar
0136
0137 pkx=obj.PYbox(k);
0138 Ykx = Y{obj.Yboxmap(k)};
0139 Akx=-obj.Yboxshift(k)*speye(size(Ykx)) - obj.Yboxmlt(k)*Ykx;
0140
0141
0142 chol(Akx);
0143 invAkx = full(inv(Akx));
0144
0145
0146
0147
0148 mlt=-obj.Yboxmlt(k);
0149 mapper=obj.vec2Ymap{obj.Yboxmap(k)};
0150 dim=mapper.dim;
0151 lAdep=mapper.nelem;
0152 offset=obj.Nx + mapper.xmap(1) - 1;
0153 irow=mapper.irow;
0154 icol=mapper.icol;
0155
0156 Akdixall=cell(lAdep,1);
0157
0158
0159 Akddx=zeros(lAdep,lAdep);
0160 for ii=1:lAdep
0161 if (irow(ii)==icol(ii))
0162
0163 Akdix = sparse(irow(ii),icol(ii),mlt,dim,dim);
0164 else
0165
0166 Akdix = sparse([irow(ii),icol(ii)],[icol(ii),irow(ii)],[mlt,mlt],dim,dim);
0167 end
0168
0169 Akdixall{ii}=Akdix;
0170
0171
0172 for jj=1:ii-1
0173 hij=0.5*pkx*mextrdsdsmat(invAkx, Akdix, invAkx, Akdixall{jj});
0174 Akddx(ii,jj)=hij;
0175 Akddx(jj,ii)=hij;
0176 end
0177
0178
0179 hij=0.5*pkx*mextrdsdsmat(invAkx, Akdix, invAkx, Akdix);
0180 Akddx(ii,ii)=hij;
0181
0182 end
0183 Adep=offset+[1:lAdep];
0184
0185
0186 Akddx_expand=sparse(obj.Nx+obj.NYnnz,obj.Nx+obj.NYnnz);
0187
0188 Akddx_expand(Adep,Adep)=Akddx;
0189 ALddx=ALddx + Akddx_expand;
0190
0191 end
0192 end
0193
0194
0195 if ~isempty(obj.Yboxindphi)
0196 for k=obj.Yboxindphi
0197 pkx=obj.PYbox(k);
0198 Ykx = obj.Y{obj.Yboxmap(k)};
0199 Akx=obj.Yboxshift(k)*speye(size(Ykx)) + obj.Yboxmlt(k)*Ykx;
0200 umatk=obj.UYbox{k};
0201
0202
0203 Z=(pkx*speye(size(Akx))-Akx);
0204
0205 invZ=full(inv(Z));
0206 pZUZ=pkx^2*invZ*umatk*invZ;
0207
0208 mlt=obj.Yboxmlt(k);
0209 mapper=obj.vec2Ymap{obj.Yboxmap(k)};
0210 dim=mapper.dim;
0211 lAdep=mapper.nelem;
0212 offset=obj.Nx + mapper.xmap(1) - 1;
0213 irow=mapper.irow;
0214 icol=mapper.icol;
0215
0216 Akdixall=cell(lAdep,1);
0217
0218
0219 Akddx=zeros(lAdep,lAdep);
0220 for ii=1:lAdep
0221 if (irow(ii)==icol(ii))
0222
0223 Akdix = sparse(irow(ii),icol(ii),mlt,dim,dim);
0224 else
0225
0226 Akdix = sparse([irow(ii),icol(ii)],[icol(ii),irow(ii)],[mlt,mlt],dim,dim);
0227 end
0228
0229 Akdixall{ii}=Akdix;
0230
0231
0232 for jj=1:ii-1
0233 hij=mextrdsdsmat(pZUZ, Akdix, invZ, Akdixall{jj});
0234 Akddx(ii,jj)=hij;
0235 Akddx(jj,ii)=hij;
0236 end
0237
0238
0239 hij=mextrdsdsmat(pZUZ, Akdix, invZ, Akdix);
0240 Akddx(ii,ii)=hij;
0241
0242 end
0243 Adep=offset+[1:lAdep];
0244
0245
0246 Akddx_expand=sparse(obj.Nx+obj.NYnnz,obj.Nx+obj.NYnnz);
0247
0248 Akddx_expand(Adep,Adep)=Akddx;
0249 ALddx=ALddx + Akddx_expand;
0250
0251 end
0252 end
0253
0254
0255 if ~isempty(obj.Aindphi)
0256 for k=obj.Aindphi
0257 pkx=obj.PA(k);
0258
0259 kuser=obj.Amap(k);
0260 [Akuserx, userdata] = obj.mconfun(x, Y, kuser, userdata);
0261 Akx = obj.Ashift(k)*speye(size(Akuserx)) + obj.Amlt(k) .* Akuserx;
0262 umatk=obj.UA{k};
0263
0264 Z=(pkx*speye(size(Akx))-Akx);
0265
0266 invZ=full(inv(Z));
0267
0268 pZUZ=pkx^2*invZ*umatk*invZ;
0269
0270
0271 Adep=obj.Adep{kuser};
0272 lAdep=length(Adep);
0273 Akdixall=cell(lAdep,1);
0274
0275
0276
0277 Akddx_nnz=lAdep*(lAdep+1)/2;
0278 Akddx_val=zeros(Akddx_nnz,1);
0279 Akddx_row=zeros(Akddx_nnz,1);
0280 Akddx_col=zeros(Akddx_nnz,1);
0281 idx = 0;
0282 for ii=1:lAdep
0283 i=Adep(ii);
0284 [Akdix, userdata] = obj.mcongrad(x,Y,kuser,i,userdata);
0285 if (obj.Amlt(k)<0)
0286
0287 Akdix = -Akdix;
0288 end
0289
0290 Akdixall{ii}=Akdix;
0291 Akddx_row(idx+1:idx+ii)=i;
0292 Akddx_col(idx+1:idx+ii)=Adep(1:ii);
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312 vec = mextrcolumn(pZUZ,Akdix,invZ,Akdixall(1:ii));
0313 Akddx_val(idx+1:idx+ii)=vec;
0314
0315 idx = idx+ii;
0316 end
0317
0318
0319
0320 Akddx_lagr = [];
0321 if (kuser<=obj.NANLN)
0322 if (~isempty(obj.mconlagrhess))
0323 [Akddx_lagr, userdata] = obj.mconlagrhess(x,Y,kuser,pZUZ,userdata);
0324 if (obj.Amlt(k)~=1)
0325 Akddx_lagr = obj.Amlt(k)*Akddx_lagr;
0326 end
0327 else
0328
0329
0330 idx = 0;
0331 for ii=1:lAdep
0332 i=Adep(ii);
0333 for jj=1:ii-1
0334
0335 [Akddijx, userdata] = obj.mconhess(x,Y,kuser,Adep(jj),i,userdata);
0336 if (~isempty(Akddijx))
0337
0338
0339
0340
0341 hij=obj.Amlt(k)*trace(Akddijx*pZUZ);
0342
0343
0344 Akddx_val(idx+jj)=Akddx_val(idx+jj)+hij;
0345
0346 end
0347 end
0348 [Akddijx, userdata] = obj.mconhess(x,Y,kuser,i,i,userdata);
0349 if (~isempty(Akddijx))
0350
0351 hij=obj.Amlt(k)*trace(Akddijx*pZUZ);
0352
0353 Akddx_val(idx+ii)=Akddx_val(idx+ii)+hij;
0354
0355 end
0356 idx = idx+ii;
0357 end
0358 end
0359 end
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369 Akddx_expand = sparse(Akddx_row,Akddx_col,Akddx_val,obj.Nx+obj.NYnnz,obj.Nx+obj.NYnnz,lAdep*lAdep);
0370 Akddx_expand = Akddx_expand + tril(Akddx_expand,-1)';
0371 if (isempty(Akddx_lagr))
0372
0373
0374 ALddx=ALddx + Akddx_expand;
0375
0376 else
0377 ALddx=ALddx + Akddx_expand + Akddx_lagr;
0378 end
0379
0380 end
0381 end
0382
0383
0384 obj.userdata=userdata;
0385
0386
0387 obj.ALddx = ALddx;
0388 obj.ALddxtck = obj.ticker;
0389
0390
0391 obj.stats_ncall_alddx = obj.stats_ncall_alddx + 1;
0392 obj.stats_time_alddx = obj.stats_time_alddx + cputime - starttime;
0393
0394 end
0395