This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 8b63089122c4957c7a4851a15de1330ebbaac869 Author: Martin Desruisseaux <[email protected]> AuthorDate: Tue Apr 16 14:48:31 2019 +0200 Store localization grids using single precision instead of double precision for reducing memory consumption. We presume that single precision is sufficient because the values stored in the `offsets` array are differences, not absolute coordinates. The absolute coordinates will be computed by adding `double` values to those offsets. --- .../operation/builder/LocalizationGridBuilder.java | 16 ++++++++++------ .../sis/referencing/operation/builder/ResidualGrid.java | 8 +++++--- .../operation/builder/LocalizationGridBuilderTest.java | 6 ++++-- .../referencing/operation/builder/ResidualGridTest.java | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java index aca8b7e..206273e 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilder.java @@ -131,7 +131,7 @@ public class LocalizationGridBuilder extends TransformBuilder { * precision has been specified. The {@code sourceToGrid} transform shall not be applied on this value. * This default precision may change in any future SIS version. */ - static final double DEFAULT_PRECISION = 1E-7; + private static final double DEFAULT_PRECISION = 1E-7; /** * The transform created by {@link #create(MathTransformFactory)}. @@ -627,7 +627,7 @@ public class LocalizationGridBuilder extends TransformBuilder { } else { final int width = linear.gridSize(0); final int height = linear.gridSize(1); - final double[] residual = new double[SOURCE_DIMENSION * linear.gridLength]; + final float[] residual = new float [SOURCE_DIMENSION * linear.gridLength]; final double[] grid = new double[SOURCE_DIMENSION * width]; double gridPrecision = precision; try { @@ -659,10 +659,14 @@ public class LocalizationGridBuilder extends TransformBuilder { tmp[0] = 0; tmp[1] = y; linear.getControlRow(tmp, grid); // Expected positions. - coordToGrid.transform(grid, 0, residual, k, width); // As grid coordinate. - for (int x=0; x<width; x++) { - isLinear &= (residual[k++] -= x) <= gridPrecision; - isLinear &= (residual[k++] -= y) <= gridPrecision; + coordToGrid.transform(grid, 0, grid, 0, width); // As grid coordinate. + for (int i=0,x=0; x<width; x++) { + final double dx = grid[i++] - x; + final double dy = grid[i++] - y; + isLinear &= (dx <= gridPrecision); + isLinear &= (dy <= gridPrecision); + residual[k++] = (float) dx; + residual[k++] = (float) dy; } } } catch (TransformException e) { diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java index 4cf8672..46565c3 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/builder/ResidualGrid.java @@ -50,7 +50,7 @@ final class ResidualGrid extends DatumShiftGrid<Dimensionless,Dimensionless> { /** * For cross-version compatibility. */ - private static final long serialVersionUID = -713276314000661839L; + private static final long serialVersionUID = 5207799661806374259L; /** * Number of source dimensions of the residual grid. @@ -111,8 +111,10 @@ final class ResidualGrid extends DatumShiftGrid<Dimensionless,Dimensionless> { /** * The residual data, as translations to apply on the result of affine transform. * In this flat array, index of target dimension varies fastest, then column index, then row index. + * Single precision instead of double is presumed sufficient because this array contains only differences, + * not absolute positions. Absolute positions will be computed by adding {@code double} values to those offsets. */ - private final double[] offsets; + private final float[] offsets; /** * Conversion from translated coordinates (after the datum shift has been applied) to "real world" coordinates. @@ -139,7 +141,7 @@ final class ResidualGrid extends DatumShiftGrid<Dimensionless,Dimensionless> { * @param precision desired precision of inverse transformations in unit of grid cells. */ ResidualGrid(final LinearTransform sourceToGrid, final LinearTransform gridToTarget, - final int nx, final int ny, final double[] residuals, final double precision) + final int nx, final int ny, final float[] residuals, final double precision) { super(Units.UNITY, sourceToGrid, new int[] {nx, ny}, true, Units.UNITY); this.gridToTarget = gridToTarget; diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilderTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilderTest.java index 158d283..803cefa 100644 --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilderTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/LocalizationGridBuilderTest.java @@ -84,15 +84,17 @@ public final strictfp class LocalizationGridBuilderTest extends TransformTestCas public void testQuadratic() throws FactoryException, TransformException { final AffineTransform reference = new AffineTransform(20, -30, 5, -4, -20, 8); final LocalizationGridBuilder builder = builder(reference, 5, 4); + builder.setDesiredPrecision(1E-6); transform = builder.create(null); - tolerance = 1E-13; + tolerance = 2E-7; isInverseTransformSupported = false; verifyQuadratic(); /* * The tolerance value specified here should be approximately equal to ResidualGrid.accuracy. + * That value was specified in the call to builder.setDesiredPrecision(1E-6). */ - tolerance = LocalizationGridBuilder.DEFAULT_PRECISION; + tolerance = 1E-6; isInverseTransformSupported = true; verifyQuadratic(); } diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/ResidualGridTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/ResidualGridTest.java index a5ba367..189348d 100644 --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/ResidualGridTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/builder/ResidualGridTest.java @@ -47,7 +47,7 @@ public final strictfp class ResidualGridTest extends TestCase { * The grid has no "source to grid" or "grid to CRS" transformations. */ public ResidualGridTest() { - grid = new ResidualGrid(MathTransforms.identity(2), MathTransforms.identity(2), 3, 4, new double[] { + grid = new ResidualGrid(MathTransforms.identity(2), MathTransforms.identity(2), 3, 4, new float[] { 0,2 , 1,2 , 2,1, 1,3 , 2,2 , 1,1, 0,4 , 2,3 , 3,2,
