1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math4.legacy.optim;
18
19 import org.apache.commons.math4.legacy.exception.DimensionMismatchException;
20 import org.apache.commons.math4.legacy.exception.NumberIsTooLargeException;
21 import org.apache.commons.math4.legacy.exception.NumberIsTooSmallException;
22
23
24
25
26
27
28
29
30
31
32
33
34 public abstract class BaseMultivariateOptimizer<PAIR>
35 extends BaseOptimizer<PAIR> {
36
37 private double[] start;
38
39 private double[] lowerBound;
40
41 private double[] upperBound;
42
43
44
45
46 protected BaseMultivariateOptimizer(ConvergenceChecker<PAIR> checker) {
47 super(checker);
48 }
49
50
51
52
53
54
55
56
57
58
59
60
61
62 @Override
63 public PAIR optimize(OptimizationData... optData) {
64
65 return super.optimize(optData);
66 }
67
68
69
70
71
72
73
74
75
76
77
78 @Override
79 protected void parseOptimizationData(OptimizationData... optData) {
80
81 super.parseOptimizationData(optData);
82
83
84
85 for (OptimizationData data : optData) {
86 if (data instanceof InitialGuess) {
87 start = ((InitialGuess) data).getInitialGuess();
88 continue;
89 }
90 if (data instanceof SimpleBounds) {
91 final SimpleBounds bounds = (SimpleBounds) data;
92 lowerBound = bounds.getLower();
93 upperBound = bounds.getUpper();
94 continue;
95 }
96 }
97
98
99 checkParameters();
100 }
101
102
103
104
105
106
107 public double[] getStartPoint() {
108 return start == null ? null : start.clone();
109 }
110
111
112
113 public double[] getLowerBound() {
114 return lowerBound == null ? null : lowerBound.clone();
115 }
116
117
118
119 public double[] getUpperBound() {
120 return upperBound == null ? null : upperBound.clone();
121 }
122
123
124
125
126 private void checkParameters() {
127 if (start != null) {
128 final int dim = start.length;
129 if (lowerBound != null) {
130 if (lowerBound.length != dim) {
131 throw new DimensionMismatchException(lowerBound.length, dim);
132 }
133 for (int i = 0; i < dim; i++) {
134 final double v = start[i];
135 final double lo = lowerBound[i];
136 if (v < lo) {
137 throw new NumberIsTooSmallException(v, lo, true);
138 }
139 }
140 }
141 if (upperBound != null) {
142 if (upperBound.length != dim) {
143 throw new DimensionMismatchException(upperBound.length, dim);
144 }
145 for (int i = 0; i < dim; i++) {
146 final double v = start[i];
147 final double hi = upperBound[i];
148 if (v > hi) {
149 throw new NumberIsTooLargeException(v, hi, true);
150 }
151 }
152 }
153 }
154 }
155 }