From 95b169f587587e65b5975677d2924f4ca4c15947 Mon Sep 17 00:00:00 2001
From: Luc Maisonobe <luc@orekit.org>
Date: Tue, 17 Jun 2014 16:50:31 +0200
Subject: [PATCH] New speed improvement for inverse localization!

I now ned about 56s for 2000x2000 inverse localization for 3 sensors on
my laptop (Intel Core i5-3320M, 2.60GHz, quad-core, linux, 8GB RAM,
mono-thread test). This means more than 210000 pixels/second.

It's fast!
---
 .../main/java/org/orekit/rugged/api/Rugged.java |  2 +-
 .../rugged/utils/SpacecraftToObservedBody.java  | 17 +++++++++--------
 .../java/org/orekit/rugged/api/RuggedTest.java  |  7 +++++--
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/core/src/main/java/org/orekit/rugged/api/Rugged.java b/core/src/main/java/org/orekit/rugged/api/Rugged.java
index b4779345..74663b29 100644
--- a/core/src/main/java/org/orekit/rugged/api/Rugged.java
+++ b/core/src/main/java/org/orekit/rugged/api/Rugged.java
@@ -67,7 +67,7 @@ public class Rugged {
     private static final int MAX_EVAL = 50;
 
     /** Time step for frames transforms interpolations. */
-    private static final double FRAMES_TRANSFORMS_INTERPOLATION_STEP = 0.01;
+    private static final double FRAMES_TRANSFORMS_INTERPOLATION_STEP = 0.001;
 
     /** Reference ellipsoid. */
     private final ExtendedEllipsoid ellipsoid;
diff --git a/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java b/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java
index 70fb4c38..ac18d675 100644
--- a/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java
+++ b/core/src/main/java/org/orekit/rugged/utils/SpacecraftToObservedBody.java
@@ -134,7 +134,7 @@ public class SpacecraftToObservedBody {
      */
     public Transform getScToInertial(final AbsoluteDate date)
         throws OrekitException {
-        return intepolate(date, scToInertial);
+        return interpolate(date, scToInertial);
     }
 
     /** Get transform from inertial frame to observed body frame.
@@ -144,7 +144,7 @@ public class SpacecraftToObservedBody {
      */
     public Transform getInertialToBody(final AbsoluteDate date)
         throws OrekitException {
-        return intepolate(date, inertialToBody);
+        return interpolate(date, inertialToBody);
     }
 
     /** Get transform from observed body frame to inertial frame.
@@ -154,20 +154,21 @@ public class SpacecraftToObservedBody {
      */
     public Transform getBodyToInertial(final AbsoluteDate date)
         throws OrekitException {
-        return intepolate(date, bodyToInertial);
+        return interpolate(date, bodyToInertial);
     }
 
     /** Interpolate transform.
      * @param date date of the transform
      * @param list transforms list to interpolate from
-     * @return interpolated
+     * @return interpolated transform
      * @exception OrekitException if frames cannot be computed at date
      */
-    private Transform intepolate(final AbsoluteDate date, final List<Transform> list)
+    private Transform interpolate(final AbsoluteDate date, final List<Transform> list)
         throws OrekitException {
-        final double s = date.durationFrom(list.get(0).getDate()) / tStep;
-        final int inf  = FastMath.max(0, FastMath.min(list.size() - 2, (int) FastMath.floor(s)));
-        return Transform.interpolate(date, false, false, list.subList(inf, inf + 2));
+        final double    s     = date.durationFrom(list.get(0).getDate()) / tStep;
+        final int       index = FastMath.max(0, FastMath.min(list.size() - 1, (int) FastMath.rint(s)));
+        final Transform close = list.get(index);
+        return close.shiftedBy(date.durationFrom(close.getDate()));
     }
 
 }
diff --git a/core/src/test/java/org/orekit/rugged/api/RuggedTest.java b/core/src/test/java/org/orekit/rugged/api/RuggedTest.java
index 95e43427..f5f7399b 100644
--- a/core/src/test/java/org/orekit/rugged/api/RuggedTest.java
+++ b/core/src/test/java/org/orekit/rugged/api/RuggedTest.java
@@ -525,8 +525,8 @@ public class RuggedTest {
         throws RuggedException, OrekitException, URISyntaxException {
 
         long t0       = System.currentTimeMillis();
-        int dimension = 1000;
-        int nbSensors = 5;
+        int dimension = 2000;
+        int nbSensors = 3;
 
         String path = getClass().getClassLoader().getResource("orekit-data").toURI().getPath();
         DataProvidersManager.getInstance().addProvider(new DirectoryCrawler(new File(path)));
@@ -586,6 +586,9 @@ public class RuggedTest {
             for (final LineSensor lineSensor : sensors) {
                 for (int i = 0; i < dimension; ++i) {
                     double latitude  = lat0 + (i * delta) / dimension;
+                    if (i %100 == 0) {
+                        System.out.println(lineSensor.getName() + " " + i);
+                    }
                     for (int j = 0; j < dimension; ++j) {
                         double longitude = lon0 + (j * delta) / dimension;
                         SensorPixel sp = rugged.inverseLocalization(lineSensor.getName(), latitude, longitude, 0, dimension);
-- 
GitLab