1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.rugged.adjustment;
19
20 import java.util.ArrayList;
21 import java.util.HashMap;
22 import java.util.HashSet;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Set;
26
27 import org.hipparchus.analysis.differentiation.DSFactory;
28 import org.hipparchus.analysis.differentiation.DerivativeStructure;
29 import org.hipparchus.optim.ConvergenceChecker;
30 import org.hipparchus.optim.nonlinear.vector.leastsquares.LeastSquaresProblem;
31 import org.hipparchus.optim.nonlinear.vector.leastsquares.MultivariateJacobianFunction;
32 import org.hipparchus.optim.nonlinear.vector.leastsquares.ParameterValidator;
33 import org.orekit.rugged.adjustment.measurements.Observables;
34 import org.orekit.rugged.errors.RuggedException;
35 import org.orekit.rugged.errors.RuggedMessages;
36 import org.orekit.rugged.linesensor.LineSensor;
37 import org.orekit.rugged.utils.DSGenerator;
38 import org.orekit.utils.ParameterDriver;
39
40
41
42
43
44
45
46
47
48
49 abstract class OptimizationProblemBuilder {
50
51
52 protected static final int ESTIMATION_LINE_RANGE_MARGIN = 100;
53
54
55 private final DSGenerator generator;
56
57
58 private final List<ParameterDriver> drivers;
59
60
61 private final int nbParams;
62
63
64 private Observables measurements;
65
66
67 private final List<LineSensor> sensors;
68
69
70
71
72
73 OptimizationProblemBuilder(final List<LineSensor> sensors, final Observables measurements) {
74
75 this.generator = this.createGenerator(sensors);
76 this.drivers = this.generator.getSelected();
77 this.nbParams = this.drivers.size();
78 if (this.nbParams == 0) {
79 throw new RuggedException(RuggedMessages.NO_PARAMETERS_SELECTED);
80 }
81 this.measurements = measurements;
82 this.sensors = sensors;
83 }
84
85
86
87
88
89
90
91 public abstract LeastSquaresProblem build(int maxEvaluations, double convergenceThreshold);
92
93
94
95
96
97
98
99
100 final ConvergenceChecker<LeastSquaresProblem.Evaluation>
101 createChecker(final double parametersConvergenceThreshold) {
102
103 final ConvergenceChecker<LeastSquaresProblem.Evaluation> checker = (iteration, previous, current)
104 -> current.getPoint().getLInfDistance(previous.getPoint()) <= parametersConvergenceThreshold;
105
106 return checker;
107 }
108
109
110
111
112 final double[] createStartTab() {
113
114
115 final double[] start = new double[this.nbParams];
116 int iStart = 0;
117 for (final ParameterDriver driver : this.drivers) {
118 start[iStart++] = driver.getNormalizedValue();
119 }
120 return start;
121 }
122
123
124 protected abstract void createTargetAndWeight();
125
126
127
128
129 protected abstract MultivariateJacobianFunction createFunction();
130
131
132 protected abstract void initMapping();
133
134
135
136
137 final ParameterValidator createParameterValidator() {
138
139
140 final ParameterValidator validator = params -> {
141 int i = 0;
142 for (final ParameterDriver driver : this.drivers) {
143
144
145 driver.setNormalizedValue(params.getEntry(i));
146 params.setEntry(i++, driver.getNormalizedValue());
147 }
148 return params;
149 };
150
151 return validator;
152 }
153
154
155
156
157
158 private DSGenerator createGenerator(final List<LineSensor> selectedSensors) {
159
160
161 final Set<String> names = new HashSet<>();
162
163
164 for (final LineSensor sensor : selectedSensors) {
165
166
167 sensor.getParametersDrivers().forEach(driver -> {
168
169
170 if (names.contains(driver.getName()) == false) {
171 names.add(driver.getName());
172 }
173 });
174 }
175
176
177 final List<ParameterDriver> selected = new ArrayList<>();
178 final Map<String, Integer> map = new HashMap<>();
179
180
181 for (final LineSensor sensor : selectedSensors) {
182
183 sensor.getParametersDrivers().filter(driver -> driver.isSelected()).forEach(driver -> {
184 if (map.get(driver.getName()) == null) {
185 map.put(driver.getName(), map.size());
186 selected.add(driver);
187 }
188 });
189 }
190
191 final DSFactory factory = new DSFactory(map.size(), 1);
192
193
194 return new DSGenerator() {
195
196
197 @Override
198 public List<ParameterDriver> getSelected() {
199 return selected;
200 }
201
202
203 @Override
204 public DerivativeStructure constant(final double value) {
205 return factory.constant(value);
206 }
207
208
209 @Override
210 public DerivativeStructure variable(final ParameterDriver driver) {
211
212 final Integer index = map.get(driver.getName());
213 if (index == null) {
214 return constant(driver.getValue());
215 } else {
216 return factory.variable(index.intValue(), driver.getValue());
217 }
218 }
219 };
220 }
221
222
223
224
225 protected List<LineSensor> getSensors() {
226 return sensors;
227 }
228
229
230
231
232 protected final int getNbParams() {
233 return this.nbParams;
234 }
235
236
237
238
239
240 protected final List<ParameterDriver> getDrivers() {
241 return this.drivers;
242 }
243
244
245
246
247
248 protected final DSGenerator getGenerator() {
249 return this.generator;
250 }
251
252
253
254
255 protected Observables getMeasurements() {
256 return measurements;
257 }
258 }