From f04f27cce0359bdd95eafeb3348b9a1f9d750b72 Mon Sep 17 00:00:00 2001
From: Luc Maisonobe <luc@orekit.org>
Date: Tue, 23 Aug 2016 15:02:14 +0200
Subject: [PATCH] Finalize inverse location derivatives test.

---
 .../org/orekit/rugged/api/RuggedTest.java     | 125 +++++++++++-------
 1 file changed, 75 insertions(+), 50 deletions(-)

diff --git a/src/test/java/org/orekit/rugged/api/RuggedTest.java b/src/test/java/org/orekit/rugged/api/RuggedTest.java
index 12761a26..43771973 100644
--- a/src/test/java/org/orekit/rugged/api/RuggedTest.java
+++ b/src/test/java/org/orekit/rugged/api/RuggedTest.java
@@ -32,6 +32,8 @@ import java.util.Locale;
 import java.util.Map;
 
 import org.hipparchus.analysis.differentiation.DerivativeStructure;
+import org.hipparchus.analysis.differentiation.FiniteDifferencesDifferentiator;
+import org.hipparchus.analysis.differentiation.UnivariateDifferentiableFunction;
 import org.hipparchus.geometry.euclidean.threed.Rotation;
 import org.hipparchus.geometry.euclidean.threed.RotationConvention;
 import org.hipparchus.geometry.euclidean.threed.Vector3D;
@@ -48,6 +50,7 @@ import org.orekit.bodies.GeodeticPoint;
 import org.orekit.data.DataProvidersManager;
 import org.orekit.data.DirectoryCrawler;
 import org.orekit.errors.OrekitException;
+import org.orekit.errors.OrekitExceptionWrapper;
 import org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider;
 import org.orekit.frames.Frame;
 import org.orekit.frames.FramesFactory;
@@ -55,6 +58,7 @@ import org.orekit.orbits.Orbit;
 import org.orekit.propagation.Propagator;
 import org.orekit.rugged.TestUtils;
 import org.orekit.rugged.errors.RuggedException;
+import org.orekit.rugged.errors.RuggedExceptionWrapper;
 import org.orekit.rugged.errors.RuggedMessages;
 import org.orekit.rugged.linesensor.LineDatation;
 import org.orekit.rugged.linesensor.LineSensor;
@@ -168,7 +172,7 @@ public class RuggedTest {
                               "  Orekit initialization and DEM creation   : %5.1fs%n" +
                               "  direct location and %3dM grid writing: %5.1fs (%.1f px/s)%n",
                               lastLine - firstLine, los.getNbPixels(),
-                              1.0e-3 *(t1 - t0), sizeM, 1.0e-3 *(t2 - t1), pixels / (1.0e-3 * (t2 - t1)));
+                              1.0e-3 * (t1 - t0), sizeM, 1.0e-3 * (t2 - t1), pixels / (1.0e-3 * (t2 - t1)));
         } catch (IOException ioe) {
             Assert.fail(ioe.getLocalizedMessage());
         }
@@ -1037,28 +1041,28 @@ public class RuggedTest {
     public void testInverseLocationDerivativesWithoutCorrections()
         throws RuggedException, OrekitException {
         doTestInverseLocationDerivatives(2000, false, false,
-                                         7.0e-9, 4.0e-11, 1.0e-20, 3.0e-5);
+                                         7.0e-9, 4.0e-11, 2.0e-12, 7.0e-8);
     }
 
     @Test
     public void testInverseLocationDerivativesWithLightTimeCorrection()
         throws RuggedException, OrekitException {
         doTestInverseLocationDerivatives(2000, true, false,
-                                         3.0e-9, 9.0e-9, 1.0e-20, 2.0e-6);
+                                         3.0e-9, 9.0e-9, 3.0e-13, 7.0e-8);
     }
 
     @Test
     public void testInverseLocationDerivativesWithAberrationOfLightCorrection()
         throws RuggedException, OrekitException {
         doTestInverseLocationDerivatives(2000, false, true,
-                                         3.0e-10, 3.0e-10, 1.0e-20, 2.0e-6);
+                                         3.0e-10, 3.0e-10, 7.0e-13, 7.0e-8);
     }
 
     @Test
     public void testInverseLocationDerivativesWithAllCorrections()
         throws RuggedException, OrekitException {
         doTestInverseLocationDerivatives(2000, true, true,
-                                         3.0e-10, 5.0e-10, 1.0e-20, 2.0e-6);
+                                         3.0e-10, 5.0e-10, 7.0e-14, 7.0e-8);
     }
 
     private void doTestInverseLocationDerivatives(int dimension,
@@ -1066,8 +1070,8 @@ public class RuggedTest {
                                                   boolean aberrationOfLightCorrection,
                                                   double lineTolerance,
                                                   double pixelTolerance,
-                                                  double lineDerivativeTolerance,
-                                                  double pixelDerivativeTolerance)
+                                                  double lineDerivativeRelativeTolerance,
+                                                  double pixelDerivativeRelativeTolerance)
         throws RuggedException, OrekitException {
         try {
 
@@ -1096,7 +1100,7 @@ public class RuggedTest {
             LineDatation lineDatation = new LinearLineDatation(crossing, dimension / 2, 1.0 / 1.5e-3);
             int firstLine = 0;
             int lastLine  = dimension;
-            LineSensor lineSensor = new LineSensor("line", lineDatation, position, los);
+            final LineSensor lineSensor = new LineSensor("line", lineDatation, position, los);
             AbsoluteDate minDate = lineSensor.getDate(firstLine).shiftedBy(-1.0);
             AbsoluteDate maxDate = lineSensor.getDate(lastLine).shiftedBy(+1.0);
 
@@ -1161,51 +1165,72 @@ public class RuggedTest {
 
             // check the partial derivatives
             double h = 1.0e-6;
+            FiniteDifferencesDifferentiator differentiator = new FiniteDifferencesDifferentiator(8, h);
+
+            UnivariateDifferentiableFunction lineVSroll =
+                            differentiator.differentiate((double roll) -> {
+                                try {
+                                    rollDriver.setValue(roll);
+                                    pitchDriver.setValue(0);
+                                    return rugged.inverseLocation("line", gp[referencePixel], 0, dimension).getLineNumber();
+                                } catch (OrekitException e) {
+                                    throw new OrekitExceptionWrapper(e);
+                                } catch (RuggedException e) {
+                                    throw new RuggedExceptionWrapper(e);
+                                }
+                            });
+            double dLdR = lineVSroll.value(new DerivativeStructure(1, 1, 0, 0.0)).getPartialDerivative(1);
+            Assert.assertEquals(dLdR, result[0].getPartialDerivative(map.get("roll")), dLdR * lineDerivativeRelativeTolerance);
+
+            UnivariateDifferentiableFunction lineVSpitch =
+                            differentiator.differentiate((double pitch) -> {
+                                try {
+                                    rollDriver.setValue(0);
+                                    pitchDriver.setValue(pitch);
+                                    return rugged.inverseLocation("line", gp[referencePixel], 0, dimension).getLineNumber();
+                                } catch (OrekitException e) {
+                                    throw new OrekitExceptionWrapper(e);
+                                } catch (RuggedException e) {
+                                    throw new RuggedExceptionWrapper(e);
+                                }
+                            });
+            double dLdP = lineVSpitch.value(new DerivativeStructure(1, 1, 0, 0.0)).getPartialDerivative(1);
+            Assert.assertEquals(dLdP, result[0].getPartialDerivative(map.get("pitch")), dLdP * lineDerivativeRelativeTolerance);
+
+            UnivariateDifferentiableFunction pixelVSroll =
+                            differentiator.differentiate((double roll) -> {
+                                try {
+                                    rollDriver.setValue(roll);
+                                    pitchDriver.setValue(0);
+                                    return rugged.inverseLocation("line", gp[referencePixel], 0, dimension).getPixelNumber();
+                                } catch (OrekitException e) {
+                                    throw new OrekitExceptionWrapper(e);
+                                } catch (RuggedException e) {
+                                    throw new RuggedExceptionWrapper(e);
+                                }
+                            });
+            double dXdR = pixelVSroll.value(new DerivativeStructure(1, 1, 0, 0.0)).getPartialDerivative(1);
+            Assert.assertEquals(dXdR, result[1].getPartialDerivative(map.get("roll")), dXdR * pixelDerivativeRelativeTolerance);
+
+            UnivariateDifferentiableFunction pixelVSpitch =
+                            differentiator.differentiate((double pitch) -> {
+                                try {
+                                    rollDriver.setValue(0);
+                                    pitchDriver.setValue(pitch);
+                                    return rugged.inverseLocation("line", gp[referencePixel], 0, dimension).getPixelNumber();
+                                } catch (OrekitException e) {
+                                    throw new OrekitExceptionWrapper(e);
+                                } catch (RuggedException e) {
+                                    throw new RuggedExceptionWrapper(e);
+                                }
+                            });
+            double dXdP = pixelVSpitch.value(new DerivativeStructure(1, 1, 0, 0.0)).getPartialDerivative(1);
+            Assert.assertEquals(dXdP, result[1].getPartialDerivative(map.get("pitch")), dXdP * pixelDerivativeRelativeTolerance);
 
-            rollDriver.setValue(-h);
-            pitchDriver.setValue(0);
-            SensorPixel rMp0 = rugged.inverseLocation("line", gp[referencePixel], 0, dimension);
-            rollDriver.setValue(+h);
-            pitchDriver.setValue(0);
-            SensorPixel rPp0 = rugged.inverseLocation("line", gp[referencePixel], 0, dimension);
-
-//            rollDriver.setValue(0);
-//            pitchDriver.setValue(-h);
-//            SensorPixel r0pM = rugged.inverseLocation("line", gp[referencePixel], 0, dimension);
-//            rollDriver.setValue(0);
-//            pitchDriver.setValue(+h);
-            // TODO: the following line leads to a singular matrix
-//            SensorPixel r0pP = rugged.inverseLocation("line", gp[referencePixel], 0, dimension);
-
-            Assert.assertEquals("dLine/dRoll error : " +
-                                ((rPp0.getLineNumber() - rMp0.getLineNumber()) / h -
-                                 result[0].getPartialDerivative(map.get("roll"))),
-                                (rPp0.getLineNumber() - rMp0.getLineNumber()) / h,
-                                result[0].getPartialDerivative(map.get("roll")),
-                                lineDerivativeTolerance);
-            Assert.assertEquals("dPixel/dRoll error : " +
-                                ((rPp0.getPixelNumber() - rMp0.getPixelNumber()) / h -
-                                 result[1].getPartialDerivative(map.get("roll"))),
-                                (rPp0.getPixelNumber() - rMp0.getPixelNumber()) / h,
-                                result[1].getPartialDerivative(map.get("roll")),
-                                pixelDerivativeTolerance);
-//            Assert.assertEquals("dLine/dPitch error : " +
-//                                ((r0pP.getLineNumber() - r0pM.getLineNumber()) / h -
-//                                 result[0].getPartialDerivative(map.get("pitch"))),
-//                                (r0pP.getLineNumber() - r0pM.getLineNumber()) / h,
-//                                result[0].getPartialDerivative(map.get("pitch")),
-//                                lineDerivativeTolerance);
-//            Assert.assertEquals("dPixel/dPitch error : " +
-//                                ((r0pP.getPixelNumber() - r0pM.getPixelNumber()) / h -
-//                                 result[1].getPartialDerivative(map.get("pitch"))),
-//                                (r0pP.getPixelNumber() - r0pM.getPixelNumber()) / h,
-//                                result[1].getPartialDerivative(map.get("picth")),
-//                                pixelDerivativeTolerance);
-            
         } catch (InvocationTargetException | NoSuchMethodException |
                  SecurityException | IllegalAccessException |
-                 IllegalArgumentException | URISyntaxException e) {
-            e.printStackTrace();
+                 IllegalArgumentException | URISyntaxException |
+                 OrekitExceptionWrapper | RuggedExceptionWrapper e) {
             Assert.fail(e.getLocalizedMessage());
         }
     }
-- 
GitLab