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: samer@0: public class ConjGrad samer@0: { samer@0: double[] dg; samer@0: double gg, dgg; samer@0: double invhess; samer@0: State S; samer@0: samer@0: public ConjGrad(State s) samer@0: { samer@0: S = s; samer@0: dg = new double[S.n]; samer@0: invhess = 1; samer@0: } samer@0: samer@0: public void init() { samer@0: Mathx.negate(S.P1.g,S.h); samer@0: Mathx.mul(S.h,invhess); samer@0: S.normh=Util.maxabs(S.h); samer@0: } samer@0: samer@0: public void update() samer@0: { samer@0: Mathx.sub(dg,S.P2.g,S.P1.g); samer@0: gg = Mathx.norm2(S.P1.g); samer@0: dgg = Mathx.dot(dg,S.P2.g); samer@0: samer@0: Mathx.mul(S.h,dgg/gg); samer@0: Mathx.sub(S.h,S.P2.g); samer@0: Mathx.mul(S.h,invhess); samer@0: S.normh=Util.maxabs(S.h); samer@0: samer@0: double s2=Mathx.dot(S.P2.g,S.h); samer@0: if (s2>0) { samer@0: // Shell.trace("steepest descent"); samer@0: Mathx.negate(S.P2.g,S.h); samer@0: S.normh=Util.maxabs(S.h); samer@0: s2=Mathx.dot(S.P2.g,S.h); samer@0: } samer@0: S.P2.s=s2; samer@0: } samer@0: }