0001
0002
0003
0004
0005
0006
0007
0008 function [] = init(obj, forceupdate)
0009
0010 if (nargin<2)
0011 forceupdate = true;
0012 end
0013
0014
0015 if (forceupdate || ~isvector(obj.uxbox) || length(obj.uxbox)~=obj.Nxbox)
0016 if (obj.Nxbox>0)
0017 obj.uxbox = obj.allopts.uinit_box*ones(obj.Nxbox,1);
0018 else
0019 obj.uxbox = [];
0020 end
0021 end
0022 obj.uxboxnew = ones(obj.Nxbox,1);
0023
0024 if (forceupdate || ~isvector(obj.uineq) || length(obj.uineq)~=obj.Nineq)
0025 if (obj.Nineq>0)
0026 obj.uineq = obj.allopts.uinit*ones(obj.Nineq,1);
0027 else
0028 obj.uineq = [];
0029 end
0030 end
0031 obj.uineqnew = ones(obj.Nineq,1);
0032
0033 if (forceupdate || ~isvector(obj.ueq) || length(obj.ueq)~=obj.Neq)
0034 if (obj.Neq>0)
0035 obj.ueq = obj.allopts.uinit_eq*ones(obj.Neq,1);
0036 else
0037 obj.ueq = [];
0038 end
0039 end
0040
0041 if (forceupdate || ~isvector(obj.pxbox) || length(obj.pxbox)~=obj.Nxbox)
0042 if (obj.Nxbox>0)
0043 obj.pxbox = obj.allopts.pinit*ones(obj.Nxbox,1);
0044 else
0045 obj.pxbox = [];
0046 end
0047 end
0048
0049 if (forceupdate || ~isvector(obj.pineq) || length(obj.pineq)~=obj.Nineq)
0050 if (obj.Nineq>0)
0051 obj.pineq = obj.allopts.pinit*ones(obj.Nineq,1);
0052 else
0053 obj.pineq = [];
0054 end
0055 end
0056
0057
0058
0059 if (forceupdate || ~isvector(obj.PYbox) || length(obj.PYbox)~=obj.NYbox)
0060 if (obj.NYbox>0)
0061
0062 pnew=1;
0063 for k=1:obj.NYbox
0064 kuser=obj.Yboxmap(k);
0065 Ykuserx=obj.Y{kuser};
0066 Ykx = obj.Yboxshift(k)*speye(size(Ykuserx)) + obj.Yboxmlt(k) .* Ykuserx;
0067
0068
0069 [pnew, nfactor] = p_check2(-Ykx, pnew);
0070 end
0071
0072
0073 obj.PYbox=pnew*ones(obj.NYbox,1);
0074
0075 else
0076 obj.PYbox = [];
0077 end
0078 end
0079
0080
0081 if (forceupdate || ~isvector(obj.PA) || length(obj.PA)~=obj.NA)
0082 if (obj.NA>0)
0083
0084
0085
0086 pnew=1;
0087 for k=obj.Aindphi
0088 kuser=obj.Amap(k);
0089 [Akuserx, obj.userdata] = obj.mconfun(obj.x, obj.Y, kuser, obj.userdata);
0090 Akx = obj.Ashift(k)*speye(size(Akuserx)) + obj.Amlt(k) .* Akuserx;
0091
0092
0093 [pnew, nfactor] = p_check2(-Akx, pnew);
0094 end
0095
0096
0097 obj.PA=pnew*ones(obj.NA,1);
0098 else
0099 obj.PA=[];
0100 end
0101 end
0102
0103
0104 if (forceupdate || isempty(obj.UA))
0105 obj.UA = [];
0106 obj.UAnew = [];
0107 for k=1:obj.NA
0108 kuser=obj.Amap(k);
0109 [Akuserx, obj.userdata] = obj.mconfun(obj.x, obj.Y, kuser, obj.userdata);
0110 obj.UA{k} = eye(size(Akuserx));
0111
0112 obj.UAnew{k} = eye(size(Akuserx));
0113 end
0114 end
0115
0116 if (forceupdate || isempty(obj.UYbox))
0117 obj.UYbox = [];
0118 obj.UYboxnew = [];
0119 for k=1:obj.NYbox
0120 kuser=obj.Yboxmap(k);
0121 obj.UYbox{k} = eye(size(obj.Y{kuser}));
0122 obj.UYboxnew{k} = eye(size(obj.Y{kuser}));
0123 end
0124 end
0125
0126 end
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143 function [p, nfactor] = p_check2(M, p)
0144
0145 rSafetyFactor = 1.2;
0146
0147 rFactor=2;
0148 nfactor=0;
0149
0150 [n m] = size(M);
0151 Missparse = n>10 && issparse(M) && nnz(M)<0.15*n*n;
0152
0153 if (Missparse)
0154 perm=amd(M);
0155 M=M(perm,perm);
0156 I=speye(n,n);
0157 else
0158
0159 M=full(M);
0160 I=eye(n,n);
0161 end
0162
0163 p = p/rSafetyFactor;
0164
0165 [R,k] = chol(M+p*I);
0166 nfactor=nfactor+1;
0167 if (k==0)
0168
0169 return;
0170 end
0171
0172 while (k~=0)
0173 p=rFactor*p;
0174 [R,k] = chol(M+p*I);
0175
0176 nfactor=nfactor+1;
0177
0178 end
0179
0180 p = p*rSafetyFactor;
0181
0182 end
0183
0184
0185
0186