1   /* Copyright 2002-2024 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.utils;
18  
19  import java.util.List;
20  
21  import org.hipparchus.CalculusFieldElement;
22  import org.hipparchus.Field;
23  import org.hipparchus.util.MathArrays;
24  import org.orekit.errors.UnsupportedParameterException;
25  import org.orekit.time.AbsoluteDate;
26  import org.orekit.time.FieldAbsoluteDate;
27  import org.orekit.utils.TimeSpanMap.Span;
28  
29  /** Provider for {@link ParameterDriver parameters drivers}.
30   * @author Luc Maisonobe
31   * @author Melina Vanel
32   * @author Maxime Journot
33   * @since 11.2
34   */
35  public interface ParameterDriversProvider {
36  
37      /** Get the drivers for parameters.
38       * @return drivers for parameters
39       */
40      List<ParameterDriver> getParametersDrivers();
41  
42      /** Get total number of spans for all the parameters driver.
43       * @return total number of span to be estimated
44       * @since 12.0
45       */
46      default int getNbParametersDriversValue() {
47          int totalSpan = 0;
48          final List<ParameterDriver> allParameters = getParametersDrivers();
49          for (ParameterDriver driver : allParameters) {
50              totalSpan += driver.getNbOfValues();
51          }
52          return totalSpan;
53      }
54  
55      /** Get model parameters.
56       * @return model parameters, will throw an
57       * exception if one PDriver has several values driven. If
58       * it's the case (if at least 1 PDriver of the model has several values
59       * driven) the method {@link #getParameters(AbsoluteDate)} must be used.
60       * @since 12.0
61       */
62      default double[] getParameters() {
63  
64          final List<ParameterDriver> drivers = getParametersDrivers();
65          final double[] parameters = new double[drivers.size()];
66          for (int i = 0; i < drivers.size(); ++i) {
67              parameters[i] = drivers.get(i).getValue();
68          }
69          return parameters;
70      }
71  
72      /** Get model parameters.
73       * @param date date at which the parameters want to be known, can
74       * be new AbsoluteDate() if all the parameters have no validity period
75       * that is to say that they have only 1 estimated value over the all
76       * interval
77       * @return model parameters
78       * @since 12.0
79       */
80      default double[] getParameters(AbsoluteDate date) {
81  
82          final List<ParameterDriver> drivers = getParametersDrivers();
83          final double[] parameters = new double[drivers.size()];
84          for (int i = 0; i < drivers.size(); ++i) {
85              parameters[i] = drivers.get(i).getValue(date);
86          }
87          return parameters;
88      }
89  
90      /** Get model parameters, return a list a all span values
91       * of all parameters.
92       * @return model parameters
93       * @since 12.0
94       */
95      default double[] getParametersAllValues() {
96  
97          final List<ParameterDriver> drivers = getParametersDrivers();
98          final int nbParametersValues = getNbParametersDriversValue();
99          final double[] parameters = new double[nbParametersValues];
100         int paramIndex = 0;
101         for (int i = 0; i < drivers.size(); ++i) {
102             for (Span<Double> span = drivers.get(i).getValueSpanMap().getFirstSpan(); span != null; span = span.next()) {
103                 parameters[paramIndex++] = span.getData();
104             }
105 
106         }
107         return parameters;
108     }
109 
110     /** Get model parameters.
111      * @param field field to which the elements belong
112      * @param <T> type of the elements
113      * @return model parameters
114      * @since 9.0
115      */
116     default <T extends CalculusFieldElement<T>> T[] getParametersAllValues(final Field<T> field) {
117         final List<ParameterDriver> drivers = getParametersDrivers();
118         final int nbParametersValues = getNbParametersDriversValue();
119         final T[] parameters = MathArrays.buildArray(field, nbParametersValues);
120         int paramIndex = 0;
121         for (int i = 0; i < drivers.size(); ++i) {
122             for (Span<Double> span = drivers.get(i).getValueSpanMap().getFirstSpan(); span != null; span = span.next()) {
123                 parameters[paramIndex++] = field.getZero().newInstance(span.getData());
124             }
125         }
126         return parameters;
127     }
128 
129     /** Get model parameters.
130      * @param field field to which the elements belong
131      * @param <T> type of the elements
132      * @return model parameters, will throw an
133      * exception if one PDriver of the has several values driven. If
134      * it's the case (if at least 1 PDriver of the model has several values
135      * driven) the method {@link #getParameters(Field, FieldAbsoluteDate)} must be used.
136      * @since 9.0
137      */
138     default <T extends CalculusFieldElement<T>> T[] getParameters(final Field<T> field) {
139         final List<ParameterDriver> drivers = getParametersDrivers();
140         final T[] parameters = MathArrays.buildArray(field, drivers.size());
141         for (int i = 0; i < drivers.size(); ++i) {
142             parameters[i] = field.getZero().newInstance(drivers.get(i).getValue());
143         }
144         return parameters;
145     }
146 
147     /** Get model parameters.
148      * @param field field to which the elements belong
149      * @param <T> type of the elements
150      * @param date field date at which the parameters want to be known, can
151      * be new AbsoluteDate() if all the parameters have no validity period.
152      * @return model parameters
153      * @since 9.0
154      */
155     default <T extends CalculusFieldElement<T>> T[] getParameters(final Field<T> field, final FieldAbsoluteDate<T> date) {
156         final List<ParameterDriver> drivers = getParametersDrivers();
157         final T[] parameters = MathArrays.buildArray(field, drivers.size());
158         for (int i = 0; i < drivers.size(); ++i) {
159             parameters[i] = field.getZero().newInstance(drivers.get(i).getValue(date.toAbsoluteDate()));
160         }
161         return parameters;
162     }
163 
164     /** Get parameter value from its name.
165      * @param name parameter name
166      * @return parameter value
167      * @since 8.0
168      */
169     default ParameterDriver getParameterDriver(final String name) {
170 
171         for (final ParameterDriver driver : getParametersDrivers()) {
172             if (name.equals(driver.getName())) {
173                 // we have found a parameter with that name
174                 return driver;
175             }
176         }
177         throw new UnsupportedParameterException(name, getParametersDrivers());
178     }
179 
180     /** Check if a parameter is supported.
181      * <p>Supported parameters are those listed by {@link #getParametersDrivers()}.</p>
182      * @param name parameter name to check
183      * @return true if the parameter is supported
184      * @see #getParametersDrivers()
185      * @since 8.0
186      */
187     default boolean isSupported(String name) {
188         for (final ParameterDriver driver : getParametersDrivers()) {
189             if (name.equals(driver.getName())) {
190                 // we have found a parameter with that name
191                 return true;
192             }
193         }
194         // the parameter is not supported
195         return false;
196     }
197 }