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 }