41 double a=0,
b=0,
c=-
sqr(delta), *sp=s, *up=
u;
45 a+=
sqr(*up);
b+=*up * *sp;
c+=
sqr(*sp);
86 if (q1>q2) { output=
v1;
return tmp1+tmp2; }
87 output=v2;
return tmp1-tmp2;
93 double **h=H, sum,l,
a=
INF;
102 for (j=0; j<
n; j++)
if (j!=i) sum+=
condorAbs(h[i][j]);
108 l=
mmax(l,normG/delta-a);
115 double **h=H, sum,l,
a=-
INF;
126 l=
mmax(0.0,normG/delta+a);
133 double **h=H, sum,
a=-
INF;
148 int *infoOut,
int maxIter,
double *lambda1,
Vector minusG,
Matrix H)
152 const double theta=0.01;
154 const double kappaEasy=0.01, kappaHard=0.02;
156 double normG,
lambda,lambdaCorrection, lambdaPlus, lambdaL, lambdaU,
158 int info=0,
n=minusG.
sz();
162 bool gIsNull, choleskyFactorAlreadyComputed=
false;
176 lambdaU=
mmax(lambdaU,(1+kappaEasy)*lambdaL);
178 lambda=
mmax(lambda, lambdaL);
179 lambda=
mmin(lambda, lambdaU);
183 if (!choleskyFactorAlreadyComputed)
185 if (!H.
cholesky(L, lambda, &lambdaCorrection))
188 lambdaL=
mmax(lambdaL,lambda+lambdaCorrection);
189 lambda=
mmax(
sqrt(lambdaL*lambdaU), lambdaL+theta*(lambdaU-lambdaL));
192 }
else choleskyFactorAlreadyComputed=
false;
199 normS=s.euclidianNorm();
202 #ifndef POWEL_TERMINATION 203 if (
condorAbs(normS-delta)<kappaEasy*delta)
205 s.multiply(delta/normS);
213 double sHs=s.scalarProduct(HLambda.
multiply(s));
214 if (
sqr(delta/normS-1)<kappaEasy*(1+lambda*delta*delta/sHs))
216 s.multiply(delta/normS);
226 if (lambda==0) { info=1;
break; }
227 lambdaU=
mmin(lambdaU,lambda);
228 }
else lambdaL=
mmax(lambdaL,lambda);
234 lambdaPlus=lambda+(normS-
delta)/delta*
sqr(normS)/
sqr(omega.euclidianNorm());
235 lambdaPlus=
mmax(lambdaPlus, lambdaL);
236 lambdaPlus=
mmin(lambdaPlus, lambdaU);
241 #ifndef POWEL_TERMINATION 246 lambdaL=
mmax(lambdaL,lambda-uHu);
248 alpha=
findAlpha(s,
u,delta,q,pointXk,sFinal,minusG,H);
250 #ifndef POWEL_TERMINATION 252 kappaHard*(s.scalarProduct(HLambda.
multiply(s)) ))
254 if (
sqr(alpha)*uHu+sHs<
255 kappaHard*(sHs+lambda*
sqr(delta)))
258 s=sFinal; info=2;
break;
261 if ((normS>delta)&&(!gIsNull)) { lambda=lambdaPlus;
continue; };
263 if (H.
cholesky(L, lambdaPlus, &lambdaCorrection))
266 choleskyFactorAlreadyComputed=
true;
270 lambdaL=
mmax(lambdaL,lambdaPlus);
273 lambda=
mmax(
sqrt(lambdaL*lambdaU), lambdaL+theta*(lambdaU-lambdaL));
276 if (infoOut) *infoOut=info;
284 while (lambdaL<0.99*lambdaU)
286 lambda=0.5*(lambdaL+lambdaU);
287 if (H.
cholesky(L,-lambda)) lambdaL=lambda;
298 int *infoOut,
int maxIter,
double *lambda1)
308 int *infoOut,
int maxIter,
double *lambda1)
void sqrt(Image< double > &op)
Matrix multiply(Matrix B)
void solveTransposInPlace(Vector y)
bool cholesky(MatrixTriangle matL, double lambda=0, double *lambdaCorrection=NULL)
void solveInPlace(Vector b)
void gradientHessian(Vector P, Vector G, Matrix H)
double scalarProduct(Vector v)
static Vector emptyVector
void addUnityInPlace(double d)
void copyFrom(Vector r, int _n=0)
static Polynomial emptyPolynomial