1   /* Copyright 2002-2025 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.sequential;
18  
19  import org.hipparchus.linear.MatrixDecomposer;
20  import org.hipparchus.linear.QRDecomposer;
21  import org.orekit.errors.OrekitException;
22  import org.orekit.errors.OrekitMessages;
23  import org.orekit.propagation.conversion.DSSTPropagatorBuilder;
24  import org.orekit.utils.ParameterDriversList;
25  
26  /** Builder for a Semi-analytical Kalman Filter.
27   * @author Julie Bayard
28   * @author Bryan Cazabonne
29   * @author Maxime Journot
30   * @since 11.1
31   */
32  public class SemiAnalyticalKalmanEstimatorBuilder {
33  
34      /** Decomposer to use for the correction phase. */
35      private MatrixDecomposer decomposer;
36  
37      /** Builder for propagator. */
38      private DSSTPropagatorBuilder dsstPropagatorBuilder;
39  
40      /** Process noise matrix provider. */
41      private CovarianceMatrixProvider processNoiseMatrixProvider;
42  
43      /** Estimated measurements parameters. */
44      private ParameterDriversList estimatedMeasurementsParameters;
45  
46      /** Process noise matrix provider for measurement parameters. */
47      private CovarianceMatrixProvider measurementProcessNoiseMatrix;
48  
49      /** Default constructor.
50       *  Set an Extended Semi-analytical Kalman Filter.
51       */
52      public SemiAnalyticalKalmanEstimatorBuilder() {
53          this.decomposer                      = new QRDecomposer(1.0e-15);
54          this.dsstPropagatorBuilder           = null;
55          this.processNoiseMatrixProvider      = null;
56          this.estimatedMeasurementsParameters = new ParameterDriversList();
57          this.measurementProcessNoiseMatrix   = null;
58      }
59  
60      /** Construct a {@link KalmanEstimator} from the data in this builder.
61       * <p>
62       * Before this method is called, {@link #addPropagationConfiguration(DSSTPropagatorBuilder,
63       * CovarianceMatrixProvider) addPropagationConfiguration()} must have been called
64       * at least once, otherwise configuration is incomplete and an exception will be raised.
65       * </p>
66       * @return a new {@link KalmanEstimator}.
67       */
68      public SemiAnalyticalKalmanEstimator build() {
69          if (dsstPropagatorBuilder == null) {
70              throw new OrekitException(OrekitMessages.NO_PROPAGATOR_CONFIGURED);
71          }
72          return new SemiAnalyticalKalmanEstimator(decomposer, dsstPropagatorBuilder, processNoiseMatrixProvider,
73                                                   estimatedMeasurementsParameters, measurementProcessNoiseMatrix);
74      }
75  
76      /** Configure the matrix decomposer.
77       * @param matrixDecomposer decomposer to use for the correction phase
78       * @return this object.
79       */
80      public SemiAnalyticalKalmanEstimatorBuilder decomposer(final MatrixDecomposer matrixDecomposer) {
81          decomposer = matrixDecomposer;
82          return this;
83      }
84  
85      /** Add a propagation configuration.
86       * <p>
87       * This method must be called once initialize the propagator builder
88       * used by the Kalman Filter.
89       * </p>
90       * @param builder The propagator builder to use in the Kalman filter.
91       * @param provider The process noise matrices provider to use, consistent with the builder.
92       * @return this object.
93       */
94      public SemiAnalyticalKalmanEstimatorBuilder addPropagationConfiguration(final DSSTPropagatorBuilder builder,
95                                                                              final CovarianceMatrixProvider provider) {
96          dsstPropagatorBuilder      = builder;
97          processNoiseMatrixProvider = provider;
98          return this;
99      }
100 
101     /** Configure the estimated measurement parameters.
102      * <p>
103      * If this method is not called, no measurement parameters will be estimated.
104      * </p>
105      * @param estimatedMeasurementsParams The estimated measurements' parameters list.
106      * @param provider covariance matrix provider for the estimated measurement parameters
107      * @return this object.
108      */
109     public SemiAnalyticalKalmanEstimatorBuilder estimatedMeasurementsParameters(final ParameterDriversList estimatedMeasurementsParams,
110                                                                                 final CovarianceMatrixProvider provider) {
111         estimatedMeasurementsParameters = estimatedMeasurementsParams;
112         measurementProcessNoiseMatrix   = provider;
113         return this;
114     }
115 
116 }