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 ConstrainedConjGrad extends ConjGrad samer@0: { samer@0: Constraints C; samer@0: samer@0: public ConstrainedConjGrad(State s, Constraints c) { samer@0: super(s); C=c; samer@0: } samer@0: samer@0: public void init() { samer@0: C.negate(S.P1.g,S.h); samer@0: C.zeroInactive(S.h); samer@0: S.normh=Util.maxabs(S.h); samer@0: } samer@0: samer@0: public void update() samer@0: { samer@0: C.sub(dg,S.P2.g,S.P1.g); samer@0: gg = C.dot(S.P1.g,S.P1.g); samer@0: dgg = C.dot(dg,S.P2.g); samer@0: samer@0: C.mul(S.h,dgg/gg); samer@0: C.sub(S.h,S.P2.g); samer@0: S.normh=Util.maxabs(S.h); samer@0: samer@0: double s2=C.dot(S.P2.g,S.h); samer@0: if (s2>0) { samer@0: // Shell.trace("steepest descent"); samer@0: C.negate(S.P2.g,S.h); samer@0: C.zeroInactive(S.h); samer@0: S.normh=Util.maxabs(S.h); samer@0: s2=C.dot(S.P2.g,S.h); samer@0: } samer@0: S.P2.s=s2; samer@0: } samer@0: }