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
The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
new 789880f Relax tolerance threshold if InterpolatedTransform does not converge.
789880f is described below
commit 789880f27ed69df4ebfd47f6f452dd06c686e891
Author: Martin Desruisseaux
AuthorDate: Mon Mar 11 12:07:58 2019 +0100
Relax tolerance threshold if InterpolatedTransform does not converge.
---
.../operation/transform/InterpolatedTransform.java | 26 +++++++++++++---------
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedTransform.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedTransform.java
index 1821b51..3738512 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedTransform.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/InterpolatedTransform.java
@@ -443,7 +443,7 @@ public class InterpolatedTransform extends DatumShiftTransform {
*
* @see #tryAgain(int, double, double)
*/
- private static final int MAXIMUM_ITERATIONS = Formulas.MAXIMUM_ITERATIONS * 2;
+ private static final int MAXIMUM_ITERATIONS = Formulas.MAXIMUM_ITERATIONS * 4;
/**
* The enclosing transform.
@@ -609,26 +609,30 @@ nextPoint: while (--numPts >= 0) {
/**
* If iteration did not converge, tells whether we should perform another try with a more permissive threshold.
- * We allow relaxed tolerance threshold only for extrapolations; if the point was inside the grid and the grid
- * is well-formed, we assume that iteration should have converged. But during extrapolations since there is no
- * authoritative results, we consider that a more approximate result is okay. In particular it does not make
- * sense to require a 1E-7 accuracy (relative to cell size) if we don't really know what the answer should be.
- * We nevertheless aim for an accuracy of 0.5 of cell size in order to keep some consistency with forward transform.
+ * We start relaxing threshold only in last resort, and nevertheless aim for an accuracy of 0.5 of cell size in
+ * order to keep some consistency with forward transform. We may relax more in case of extrapolations.
*
* @param it the iteration counter. Should be negative since we exhausted the normal number of iterations.
* @param xi best `x` estimation so far.
* @param yi best `y` estimation so far.
- * @return the new tolerance threshold, or 0 if no more try should be allowed.
+ * @return the new tolerance threshold, or {@link Double#NaN} if no more try should be allowed.
*
* @see #MAXIMUM_ITERATIONS
*/
private double tryAgain(final int it, final double xi, final double yi) {
- if (!forward.grid.isCellInGrid(xi, yi)) {
- if (it >= -3) { // Arbitrary limit.
- return Math.scalb(0.5, ~it); // Progressive relax from 0.5 to 2 for each additional iteration.
+ double tol = Math.scalb(tolerance, -it);
+ if (tol >= 0.5) {
+ /*
+ * If the point was inside the grid and the grid is well-formed, we assume that iteration should have converged.
+ * But during extrapolations since there is no authoritative results, we consider that a more approximate result
+ * is okay. In particular it does not make sense to require a 1E-7 accuracy (relative to cell size) if we don't
+ * really know what the answer should be.
+ */
+ if (forward.grid.isCellInGrid(xi, yi) || tol > 2) {
+ return Double.NaN; // No more iteration - caller will throw an exception.
}
}
- return 0; // No more iteration - caller will throw an exception.
+ return tol;
}
}
}