1   package org.orekit.control.indirect.shooting.propagation;
2   
3   import org.hipparchus.util.Binary64;
4   import org.hipparchus.util.Binary64Field;
5   import org.junit.jupiter.api.Assertions;
6   import org.junit.jupiter.api.Test;
7   import org.junit.jupiter.params.ParameterizedTest;
8   import org.junit.jupiter.params.provider.ValueSource;
9   import org.mockito.Mockito;
10  import org.orekit.control.indirect.adjoint.cost.BoundedCartesianEnergy;
11  import org.orekit.control.indirect.adjoint.cost.CartesianCost;
12  import org.orekit.control.indirect.adjoint.cost.CartesianFlightDurationCost;
13  import org.orekit.control.indirect.adjoint.cost.CartesianFuelCost;
14  import org.orekit.control.indirect.adjoint.cost.FieldBoundedCartesianEnergy;
15  import org.orekit.control.indirect.adjoint.cost.FieldCartesianCost;
16  import org.orekit.control.indirect.adjoint.cost.FieldCartesianFlightDurationCost;
17  import org.orekit.control.indirect.adjoint.cost.FieldCartesianFuelCost;
18  import org.orekit.control.indirect.adjoint.cost.FieldLogarithmicBarrierCartesianFuel;
19  import org.orekit.control.indirect.adjoint.cost.FieldQuadraticPenaltyCartesianFuel;
20  import org.orekit.control.indirect.adjoint.cost.FieldUnboundedCartesianEnergy;
21  import org.orekit.control.indirect.adjoint.cost.FieldUnboundedCartesianEnergyNeglectingMass;
22  import org.orekit.control.indirect.adjoint.cost.LogarithmicBarrierCartesianFuel;
23  import org.orekit.control.indirect.adjoint.cost.QuadraticPenaltyCartesianFuel;
24  import org.orekit.control.indirect.adjoint.cost.UnboundedCartesianEnergy;
25  import org.orekit.control.indirect.adjoint.cost.UnboundedCartesianEnergyNeglectingMass;
26  import org.orekit.propagation.events.EventDetectionSettings;
27  
28  class CartesianAdjointDynamicsProviderFactoryTest {
29  
30      private static final String ADJOINT_NAME = "adjoint";
31  
32      @Test
33      void testBuildUnboundedEnergyProviderNeglectingMass() {
34          // GIVEN
35  
36          // WHEN
37          final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildUnboundedEnergyProviderNeglectingMass(ADJOINT_NAME);
38          // THEN
39          Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
40          Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
41          Assertions.assertInstanceOf(UnboundedCartesianEnergyNeglectingMass.class,
42                  provider.buildAdditionalDerivativesProvider().getCost());
43          Assertions.assertEquals(0.,
44                  provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
45          final Binary64Field field = Binary64Field.getInstance();
46          Assertions.assertInstanceOf(FieldUnboundedCartesianEnergyNeglectingMass.class,
47                  provider.buildFieldAdditionalDerivativesProvider(field).getCost());
48          Assertions.assertEquals(0.,
49                  provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
50      }
51  
52      @Test
53      void testBuildUnboundedEnergyProvider() {
54          // GIVEN
55          final double massFlowRateFactor = 1.;
56          // WHEN
57          final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildUnboundedEnergyProvider(ADJOINT_NAME,
58                  massFlowRateFactor, EventDetectionSettings.getDefaultEventDetectionSettings());
59          // THEN
60          Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
61          Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
62          Assertions.assertInstanceOf(UnboundedCartesianEnergy.class,
63                  provider.buildAdditionalDerivativesProvider().getCost());
64          Assertions.assertEquals(massFlowRateFactor,
65                  provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
66          final Binary64Field field = Binary64Field.getInstance();
67          Assertions.assertInstanceOf(FieldUnboundedCartesianEnergy.class,
68                  provider.buildFieldAdditionalDerivativesProvider(field).getCost());
69          Assertions.assertEquals(massFlowRateFactor,
70                  provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
71      }
72  
73      @ParameterizedTest
74      @ValueSource(doubles = {0., 1})
75      void testBuildFlightDurationProvider(final double massFlowRateFactor) {
76          // GIVEN
77  
78          // WHEN
79          final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildFlightDurationProvider(ADJOINT_NAME,
80                  massFlowRateFactor, 2.);
81          // THEN
82          Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
83          Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
84          Assertions.assertInstanceOf(CartesianFlightDurationCost.class,
85                  provider.buildAdditionalDerivativesProvider().getCost());
86          Assertions.assertEquals(massFlowRateFactor,
87                  provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
88          final Binary64Field field = Binary64Field.getInstance();
89          Assertions.assertInstanceOf(FieldCartesianFlightDurationCost.class,
90                  provider.buildFieldAdditionalDerivativesProvider(field).getCost());
91          Assertions.assertEquals(massFlowRateFactor,
92                  provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
93      }
94  
95      @ParameterizedTest
96      @ValueSource(doubles = {0., 1})
97      void testBuildBoundedEnergyProvider(final double massFlowRateFactor) {
98          // GIVEN
99          final EventDetectionSettings detectionSettings = Mockito.mock(EventDetectionSettings.class);
100         // WHEN
101         final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildBoundedEnergyProvider(ADJOINT_NAME,
102                 massFlowRateFactor, 2., detectionSettings);
103         // THEN
104         Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
105         Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
106         Assertions.assertInstanceOf(BoundedCartesianEnergy.class,
107                 provider.buildAdditionalDerivativesProvider().getCost());
108         Assertions.assertEquals(massFlowRateFactor,
109                 provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
110         final Binary64Field field = Binary64Field.getInstance();
111         Assertions.assertInstanceOf(FieldBoundedCartesianEnergy.class,
112                 provider.buildFieldAdditionalDerivativesProvider(field).getCost());
113         Assertions.assertEquals(massFlowRateFactor,
114                 provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
115     }
116 
117     @Test
118     void testBuildBoundedFuelCostProvider() {
119         // GIVEN
120         final double massFlowRateFactor = 1.;
121         final EventDetectionSettings detectionSettings = Mockito.mock(EventDetectionSettings.class);
122         // WHEN
123         final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildBoundedFuelCostProvider(ADJOINT_NAME,
124                 massFlowRateFactor, 2., detectionSettings);
125         // THEN
126         Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
127         Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
128         Assertions.assertInstanceOf(CartesianFuelCost.class,
129                 provider.buildAdditionalDerivativesProvider().getCost());
130         Assertions.assertEquals(massFlowRateFactor,
131                 provider.buildAdditionalDerivativesProvider().getCost().getMassFlowRateFactor());
132         final Binary64Field field = Binary64Field.getInstance();
133         Assertions.assertInstanceOf(FieldCartesianFuelCost.class,
134                 provider.buildFieldAdditionalDerivativesProvider(field).getCost());
135         Assertions.assertEquals(massFlowRateFactor,
136                 provider.buildFieldAdditionalDerivativesProvider(field).getCost().getMassFlowRateFactor().getReal());
137     }
138 
139     @Test
140     void testBuildQuadraticPenaltyFuelCostProvider() {
141         // GIVEN
142         final double massFlowRateFactor = 1.;
143         final EventDetectionSettings detectionSettings = Mockito.mock(EventDetectionSettings.class);
144         // WHEN
145         final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildQuadraticPenaltyFuelCostProvider(ADJOINT_NAME,
146                 massFlowRateFactor, 2., 0.5, detectionSettings);
147         // THEN
148         Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
149         Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
150         final CartesianCost cost = provider.buildAdditionalDerivativesProvider().getCost();
151         Assertions.assertInstanceOf(QuadraticPenaltyCartesianFuel.class, cost);
152         Assertions.assertEquals(massFlowRateFactor, cost.getMassFlowRateFactor());
153         final Binary64Field field = Binary64Field.getInstance();
154         final FieldCartesianCost<Binary64> fieldCartesianCost = provider.buildFieldAdditionalDerivativesProvider(field).getCost();
155         Assertions.assertInstanceOf(FieldQuadraticPenaltyCartesianFuel.class, fieldCartesianCost);
156         Assertions.assertEquals(massFlowRateFactor, fieldCartesianCost.getMassFlowRateFactor().getReal());
157         Assertions.assertEquals(((QuadraticPenaltyCartesianFuel) cost).getEpsilon(),
158                 ((FieldQuadraticPenaltyCartesianFuel<Binary64>) fieldCartesianCost).getEpsilon().getReal());
159     }
160 
161     @Test
162     void testBuildLogarithmicBarrierFuelCostProvider() {
163         // GIVEN
164         final double massFlowRateFactor = 1.;
165         // WHEN
166         final CartesianAdjointDynamicsProvider provider = CartesianAdjointDynamicsProviderFactory.buildLogarithmicBarrierFuelCostProvider(ADJOINT_NAME,
167                 massFlowRateFactor, 2., 0.5);
168         // THEN
169         Assertions.assertEquals(provider.getDimension(), provider.buildAdditionalDerivativesProvider().getDimension());
170         Assertions.assertEquals(ADJOINT_NAME, provider.getAdjointName());
171         final CartesianCost cost = provider.buildAdditionalDerivativesProvider().getCost();
172         Assertions.assertInstanceOf(LogarithmicBarrierCartesianFuel.class, cost);
173         Assertions.assertEquals(massFlowRateFactor, cost.getMassFlowRateFactor());
174         final Binary64Field field = Binary64Field.getInstance();
175         final FieldCartesianCost<Binary64> fieldCartesianCost = provider.buildFieldAdditionalDerivativesProvider(field).getCost();
176         Assertions.assertInstanceOf(FieldLogarithmicBarrierCartesianFuel.class, fieldCartesianCost);
177         Assertions.assertEquals(massFlowRateFactor, fieldCartesianCost.getMassFlowRateFactor().getReal());
178         Assertions.assertEquals(((LogarithmicBarrierCartesianFuel) cost).getEpsilon(),
179                 ((FieldLogarithmicBarrierCartesianFuel<Binary64>) fieldCartesianCost).getEpsilon().getReal());
180     }
181 
182 }