1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.math.optimization.general;
19
20 import org.apache.commons.math.FunctionEvaluationException;
21 import org.apache.commons.math.MaxEvaluationsExceededException;
22 import org.apache.commons.math.MaxIterationsExceededException;
23 import org.apache.commons.math.analysis.DifferentiableMultivariateRealFunction;
24 import org.apache.commons.math.analysis.MultivariateVectorialFunction;
25 import org.apache.commons.math.optimization.GoalType;
26 import org.apache.commons.math.optimization.OptimizationException;
27 import org.apache.commons.math.optimization.RealConvergenceChecker;
28 import org.apache.commons.math.optimization.DifferentiableMultivariateRealOptimizer;
29 import org.apache.commons.math.optimization.RealPointValuePair;
30 import org.apache.commons.math.optimization.SimpleScalarValueChecker;
31
32
33
34
35
36
37
38
39 public abstract class AbstractScalarDifferentiableOptimizer
40 implements DifferentiableMultivariateRealOptimizer {
41
42
43 public static final int DEFAULT_MAX_ITERATIONS = 100;
44
45
46 private int maxIterations;
47
48
49 private int iterations;
50
51
52 private int maxEvaluations;
53
54
55 private int evaluations;
56
57
58 private int gradientEvaluations;
59
60
61 protected RealConvergenceChecker checker;
62
63
64 private DifferentiableMultivariateRealFunction f;
65
66
67 private MultivariateVectorialFunction gradient;
68
69
70 protected GoalType goalType;
71
72
73 protected double[] point;
74
75
76
77
78
79 protected AbstractScalarDifferentiableOptimizer() {
80 setConvergenceChecker(new SimpleScalarValueChecker());
81 setMaxIterations(DEFAULT_MAX_ITERATIONS);
82 setMaxEvaluations(Integer.MAX_VALUE);
83 }
84
85
86 public void setMaxIterations(int maxIterations) {
87 this.maxIterations = maxIterations;
88 }
89
90
91 public int getMaxIterations() {
92 return maxIterations;
93 }
94
95
96 public int getIterations() {
97 return iterations;
98 }
99
100
101 public void setMaxEvaluations(int maxEvaluations) {
102 this.maxEvaluations = maxEvaluations;
103 }
104
105
106 public int getMaxEvaluations() {
107 return maxEvaluations;
108 }
109
110
111 public int getEvaluations() {
112 return evaluations;
113 }
114
115
116 public int getGradientEvaluations() {
117 return gradientEvaluations;
118 }
119
120
121 public void setConvergenceChecker(RealConvergenceChecker checker) {
122 this.checker = checker;
123 }
124
125
126 public RealConvergenceChecker getConvergenceChecker() {
127 return checker;
128 }
129
130
131
132
133
134 protected void incrementIterationsCounter()
135 throws OptimizationException {
136 if (++iterations > maxIterations) {
137 throw new OptimizationException(new MaxIterationsExceededException(maxIterations));
138 }
139 }
140
141
142
143
144
145
146
147 protected double[] computeObjectiveGradient(final double[] point)
148 throws FunctionEvaluationException {
149 ++gradientEvaluations;
150 return gradient.value(point);
151 }
152
153
154
155
156
157
158
159
160
161 protected double computeObjectiveValue(final double[] point)
162 throws FunctionEvaluationException {
163 if (++evaluations > maxEvaluations) {
164 throw new FunctionEvaluationException(new MaxEvaluationsExceededException(maxEvaluations),
165 point);
166 }
167 return f.value(point);
168 }
169
170
171 public RealPointValuePair optimize(final DifferentiableMultivariateRealFunction f,
172 final GoalType goalType,
173 final double[] startPoint)
174 throws FunctionEvaluationException, OptimizationException, IllegalArgumentException {
175
176
177 iterations = 0;
178 evaluations = 0;
179 gradientEvaluations = 0;
180
181
182 this.f = f;
183 gradient = f.gradient();
184 this.goalType = goalType;
185 point = startPoint.clone();
186
187 return doOptimize();
188
189 }
190
191
192
193
194
195
196
197
198 abstract protected RealPointValuePair doOptimize()
199 throws FunctionEvaluationException, OptimizationException, IllegalArgumentException;
200
201 }