samer@0: /* samer@0: * Copyright (c) 2000, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.maths.opt; samer@0: import samer.maths.*; samer@0: import samer.core.*; samer@0: import samer.core.types.*; samer@0: import samer.core.util.heavy.*; samer@0: samer@0: /** samer@0: unconstrained minimiser for smooth functions: samer@0: - ConjugateGradient samer@0: - OR Quasi-newton (using GillMurray updates) samer@0: samer@0: - Safeguarded cubic interpolation line search using gradients samer@0: */ samer@0: samer@0: samer@0: public class UnconstrainedConjGrad extends MinimiserBase samer@0: { samer@0: ConjGrad dir; samer@0: double guess; samer@0: samer@0: public UnconstrainedConjGrad(Vec v, Functionx f) samer@0: { samer@0: super(v,f); samer@0: dir = new ConjGrad(this); samer@0: add(new VParameter( "hessian", new DoubleModel() { samer@0: public void set(double h) { dir.invhess=1/h; } samer@0: public double get() { return 1/dir.invhess; } samer@0: } )); samer@0: } samer@0: samer@0: public void stopping() {} samer@0: public void run() samer@0: { samer@0: double beta; samer@0: int i, maxiter=getMaxiter(); samer@0: boolean triedSteepest=false; samer@0: samer@0: // dir.resetHessian(1); samer@0: evaluate(); samer@0: dir.init(); samer@0: setSlope(); samer@0: // beta = vs.beta.value; samer@0: beta = initialStep(); samer@0: sig1.off(); samer@0: samer@0: for (i=0; i=P1.f)) { samer@0: // tiny step was no good samer@0: sig1.on(); samer@0: sig2.off(); samer@0: if (gconv.isSatisfied(P1.g,this)) break; samer@0: if (triedSteepest=true) break; samer@0: sig2.on(); samer@0: samer@0: beta = this.beta.value; samer@0: samer@0: samer@0: dir.init(); // reset to steepest descent samer@0: setSlope(); samer@0: triedSteepest=true; samer@0: continue; samer@0: } samer@0: samer@0: if (xfconv.isSatisfied(this)) { break; } samer@0: samer@0: beta = nextStep(); samer@0: // beta = vs.beta.value; samer@0: dir.update(); samer@0: move(); samer@0: perIteration(); samer@0: } samer@0: samer@0: perOptimisation(i); // finishing off stuff samer@0: } samer@0: }