1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.estimation.leastsquares;
18
19 import static org.junit.Assert.assertEquals;
20
21 import java.util.List;
22 import java.util.Map;
23
24 import org.hipparchus.geometry.euclidean.threed.Vector3D;
25 import org.hipparchus.linear.ArrayRealVector;
26 import org.hipparchus.linear.RealMatrix;
27 import org.hipparchus.linear.RealVector;
28 import org.hipparchus.util.Incrementor;
29 import org.hipparchus.util.Pair;
30 import org.junit.Assert;
31 import org.junit.Test;
32 import org.orekit.estimation.Context;
33 import org.orekit.estimation.EstimationTestUtils;
34 import org.orekit.estimation.measurements.EstimatedMeasurement;
35 import org.orekit.estimation.measurements.ObservedMeasurement;
36 import org.orekit.estimation.measurements.PVMeasurementCreator;
37 import org.orekit.orbits.Orbit;
38 import org.orekit.orbits.OrbitType;
39 import org.orekit.orbits.PositionAngle;
40 import org.orekit.propagation.Propagator;
41 import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
42 import org.orekit.utils.ParameterDriver;
43 import org.orekit.utils.ParameterDriversList;
44
45 public class BatchLSModelTest {
46
47 @Test
48 public void testPerfectValue() {
49
50 final Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
51
52 final NumericalPropagatorBuilder propagatorBuilder =
53 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
54 1.0e-6, 60.0, 0.001);
55 final NumericalPropagatorBuilder[] builders = { propagatorBuilder };
56
57
58 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
59 propagatorBuilder);
60 final List<ObservedMeasurement<?>> measurements =
61 EstimationTestUtils.createMeasurements(propagator,
62 new PVMeasurementCreator(),
63 0.0, 1.0, 300.0);
64 final ParameterDriversList estimatedMeasurementsParameters = new ParameterDriversList();
65 for (ObservedMeasurement<?> measurement : measurements) {
66 for (final ParameterDriver driver : measurement.getParametersDrivers()) {
67 if (driver.isSelected()) {
68 estimatedMeasurementsParameters.add(driver);
69 }
70 }
71 }
72
73
74 final ModelObserver modelObserver = new ModelObserver() {
75
76 @Override
77 public void modelCalled(final Orbit[] newOrbits,
78 final Map<ObservedMeasurement<?>, EstimatedMeasurement<?>> newEvaluations) {
79 Assert.assertEquals(1, newOrbits.length);
80 Assert.assertEquals(0,
81 context.initialOrbit.getDate().durationFrom(newOrbits[0].getDate()),
82 1.0e-15);
83 Assert.assertEquals(0,
84 Vector3D.distance(context.initialOrbit.getPVCoordinates().getPosition(),
85 newOrbits[0].getPVCoordinates().getPosition()),
86 1.0e-15);
87 Assert.assertEquals(measurements.size(), newEvaluations.size());
88 }
89 };
90 final BatchLSModel model = new BatchLSModel(builders, measurements, estimatedMeasurementsParameters, modelObserver);
91 model.setIterationsCounter(new Incrementor(100));
92 model.setEvaluationsCounter(new Incrementor(100));
93
94
95 assertEquals(true, model.isForwardPropagation());
96
97
98 final double[] normalizedProp = propagatorBuilder.getSelectedNormalizedParameters();
99 final double[] normalized = new double[normalizedProp.length + estimatedMeasurementsParameters.getNbParams()];
100 System.arraycopy(normalizedProp, 0, normalized, 0, normalizedProp.length);
101 int i = normalizedProp.length;
102 for (final ParameterDriver driver : estimatedMeasurementsParameters.getDrivers()) {
103 normalized[i++] = driver.getNormalizedValue();
104 }
105 Pair<RealVector, RealMatrix> value = model.value(new ArrayRealVector(normalized));
106 int index = 0;
107 for (ObservedMeasurement<?> measurement : measurements) {
108 for (int k = 0; k < measurement.getDimension(); ++k) {
109
110 Assert.assertEquals(0.0, value.getFirst().getEntry(index++), 1.6e-7);
111 }
112 }
113 Assert.assertEquals(index, value.getFirst().getDimension());
114
115 }
116
117 @Test
118 public void testBackwardPropagation() {
119
120 final Context context = EstimationTestUtils.eccentricContext("regular-data:potential:tides");
121
122 final NumericalPropagatorBuilder propagatorBuilder =
123 context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, true,
124 1.0e-6, 60.0, 0.001);
125 final NumericalPropagatorBuilder[] builders = { propagatorBuilder };
126
127
128 final Propagator propagator = EstimationTestUtils.createPropagator(context.initialOrbit,
129 propagatorBuilder);
130 final List<ObservedMeasurement<?>> measurements =
131 EstimationTestUtils.createMeasurements(propagator,
132 new PVMeasurementCreator(),
133 0.0, -1.0, 300.0);
134 final ParameterDriversList estimatedMeasurementsParameters = new ParameterDriversList();
135 for (ObservedMeasurement<?> measurement : measurements) {
136 for (final ParameterDriver driver : measurement.getParametersDrivers()) {
137 if (driver.isSelected()) {
138 estimatedMeasurementsParameters.add(driver);
139 }
140 }
141 }
142
143
144 final ModelObserver modelObserver = new ModelObserver() {
145
146 @Override
147 public void modelCalled(final Orbit[] newOrbits,
148 final Map<ObservedMeasurement<?>, EstimatedMeasurement<?>> newEvaluations) {
149
150 }
151 };
152 final BatchLSModel model = new BatchLSModel(builders, measurements, estimatedMeasurementsParameters, modelObserver);
153
154 assertEquals(false, model.isForwardPropagation());
155 }
156
157 }
158
159
160