1   /* Copyright 2002-2022 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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          // create perfect PV measurements
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          // create model
74          final ModelObserver modelObserver = new ModelObserver() {
75              /** {@inheritDoc} */
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          // Test forward propagation flag to true
95          assertEquals(true, model.isForwardPropagation());
96  
97          // evaluate model on perfect start point
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                 // the value is already a weighted residual
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         // create perfect PV measurements
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         // create model
144         final ModelObserver modelObserver = new ModelObserver() {
145             /** {@inheritDoc} */
146             @Override
147             public void modelCalled(final Orbit[] newOrbits,
148                                     final Map<ObservedMeasurement<?>, EstimatedMeasurement<?>> newEvaluations) {
149                 // Do nothing here 
150             }
151         };
152         final BatchLSModel model = new BatchLSModel(builders, measurements, estimatedMeasurementsParameters, modelObserver);
153         // Test forward propagation flag to false
154         assertEquals(false, model.isForwardPropagation());
155     }
156 
157 }
158 
159 
160