samer@0
|
1 /*
|
samer@0
|
2 * Copyright (c) 2000, Samer Abdallah, King's College London.
|
samer@0
|
3 * All rights reserved.
|
samer@0
|
4 *
|
samer@0
|
5 * This software is provided AS iS and WITHOUT ANY WARRANTY;
|
samer@0
|
6 * without even the implied warranty of MERCHANTABILITY or
|
samer@0
|
7 * FITNESS FOR A PARTICULAR PURPOSE.
|
samer@0
|
8 */
|
samer@0
|
9
|
samer@0
|
10 package samer.maths.opt;
|
samer@0
|
11 import samer.maths.*;
|
samer@0
|
12 import samer.core.*;
|
samer@0
|
13 import samer.core.types.*;
|
samer@0
|
14 import samer.core.util.heavy.*;
|
samer@0
|
15
|
samer@0
|
16 /**
|
samer@0
|
17 unconstrained minimiser for smooth functions:
|
samer@0
|
18 - ConjugateGradient
|
samer@0
|
19 - OR Quasi-newton (using GillMurray updates)
|
samer@0
|
20
|
samer@0
|
21 - Safeguarded cubic interpolation line search using gradients
|
samer@0
|
22 */
|
samer@0
|
23
|
samer@0
|
24
|
samer@0
|
25 public class UnconstrainedConjGrad extends MinimiserBase
|
samer@0
|
26 {
|
samer@0
|
27 ConjGrad dir;
|
samer@0
|
28 double guess;
|
samer@0
|
29
|
samer@0
|
30 public UnconstrainedConjGrad(Vec v, Functionx f)
|
samer@0
|
31 {
|
samer@0
|
32 super(v,f);
|
samer@0
|
33 dir = new ConjGrad(this);
|
samer@0
|
34 add(new VParameter( "hessian", new DoubleModel() {
|
samer@0
|
35 public void set(double h) { dir.invhess=1/h; }
|
samer@0
|
36 public double get() { return 1/dir.invhess; }
|
samer@0
|
37 } ));
|
samer@0
|
38 }
|
samer@0
|
39
|
samer@0
|
40 public void stopping() {}
|
samer@0
|
41 public void run()
|
samer@0
|
42 {
|
samer@0
|
43 double beta;
|
samer@0
|
44 int i, maxiter=getMaxiter();
|
samer@0
|
45 boolean triedSteepest=false;
|
samer@0
|
46
|
samer@0
|
47 // dir.resetHessian(1);
|
samer@0
|
48 evaluate();
|
samer@0
|
49 dir.init();
|
samer@0
|
50 setSlope();
|
samer@0
|
51 // beta = vs.beta.value;
|
samer@0
|
52 beta = initialStep();
|
samer@0
|
53 sig1.off();
|
samer@0
|
54
|
samer@0
|
55 for (i=0; i<maxiter; i++) {
|
samer@0
|
56
|
samer@0
|
57 step(beta);
|
samer@0
|
58 lstest.init();
|
samer@0
|
59 ls.run(lstest); // line search
|
samer@0
|
60 lsiters.next(lstest.count);
|
samer@0
|
61 steplength.next(alpha);
|
samer@0
|
62
|
samer@0
|
63 if (lstest.tiny && (P2.f>=P1.f)) {
|
samer@0
|
64 // tiny step was no good
|
samer@0
|
65 sig1.on();
|
samer@0
|
66 sig2.off();
|
samer@0
|
67 if (gconv.isSatisfied(P1.g,this)) break;
|
samer@0
|
68 if (triedSteepest=true) break;
|
samer@0
|
69 sig2.on();
|
samer@0
|
70
|
samer@0
|
71 beta = this.beta.value;
|
samer@0
|
72
|
samer@0
|
73
|
samer@0
|
74 dir.init(); // reset to steepest descent
|
samer@0
|
75 setSlope();
|
samer@0
|
76 triedSteepest=true;
|
samer@0
|
77 continue;
|
samer@0
|
78 }
|
samer@0
|
79
|
samer@0
|
80 if (xfconv.isSatisfied(this)) { break; }
|
samer@0
|
81
|
samer@0
|
82 beta = nextStep();
|
samer@0
|
83 // beta = vs.beta.value;
|
samer@0
|
84 dir.update();
|
samer@0
|
85 move();
|
samer@0
|
86 perIteration();
|
samer@0
|
87 }
|
samer@0
|
88
|
samer@0
|
89 perOptimisation(i); // finishing off stuff
|
samer@0
|
90 }
|
samer@0
|
91 }
|