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.util.heavy.*; samer@0: samer@0: samer@0: /** samer@0: unconstrained minimiser for smooth functions: samer@0: - ConjugateGradient samer@0: - OR Quasi-newton (using GillMurray uydates) samer@0: samer@0: - Safeguarded cubic interpolation line search using gradients samer@0: */ samer@0: samer@0: samer@0: samer@0: samer@0: samer@0: public class UnconstrainedMinimiser extends MinimiserBase samer@0: { samer@0: GillMurray dir; samer@0: double guess; samer@0: samer@0: /** expects to find Vec at top of stack, samer@0: Functionx just below. samer@0: */ samer@0: public UnconstrainedMinimiser(Vec v, Functionx f) samer@0: { samer@0: // can we rely on evaluation order here? samer@0: super(v,f); samer@0: dir = new GillMurray(this); samer@0: add( dir.hessin.viewable()); samer@0: } samer@0: 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 = beta.value; samer@0: beta = initialStep(); samer@0: sig1.off(); samer@0: samer@0: for (i=1; i<=maxiter; i++) { samer@0: samer@0: lstest.init(); samer@0: step(beta); samer@0: ls.run(lstest); // line search samer@0: lsiters.next(lstest.count); samer@0: steplength.next(alpha); samer@0: samer@0: if (lstest.tiny && (P2.f>=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: // dir.steepest(); samer@0: dir.update(); samer@0: dir.init(); 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 = beta.value; samer@0: beta = nextStep(); samer@0: dir.update(); samer@0: move(); samer@0: perIteration(); samer@0: } samer@0: samer@0: perOptimisation(i); samer@0: dir.hessin.changed(); samer@0: } samer@0: }