package org.jgrasstools.gears;
import static java.lang.Math.abs;
import static java.lang.Math.random;
import static org.jgrasstools.gears.utils.math.NumericsUtilities.dEq;
import static org.jgrasstools.gears.utils.math.NumericsUtilities.fEq;
import static org.jgrasstools.gears.utils.math.NumericsUtilities.isBetween;
import java.util.Arrays;
import java.util.List;
import org.jgrasstools.gears.utils.HMTestCase;
import org.jgrasstools.gears.utils.math.NumericsUtilities;
/**
* Test numerics.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class TestNumericUtilities extends HMTestCase {
public void testNumericUtilities() throws Exception {
double a = 1.000000001;
double b = 1.0;
assertTrue(!dEq(a, b));
assertTrue(dEq(a, b, 1E-8));
float af = 1.000000001f;
float bf = 1.0f;
assertTrue(dEq(af, bf));
assertTrue(dEq(af, bf, 1E-8f));
a = Double.NaN;
b = 1.0;
assertFalse(dEq(a, b));
b = Double.NaN;
assertTrue(dEq(a, b));
af = Float.NaN;
bf = 1.0f;
assertFalse(fEq(af, bf));
bf = Float.NaN;
assertTrue(fEq(af, bf));
a = Double.POSITIVE_INFINITY;
b = Double.POSITIVE_INFINITY;
assertTrue(dEq(a, b));
a = Double.POSITIVE_INFINITY;
b = Double.NEGATIVE_INFINITY;
assertTrue(dEq(a, abs(b)));
af = Float.POSITIVE_INFINITY;
bf = Float.POSITIVE_INFINITY;
assertTrue(fEq(af, bf));
af = Float.POSITIVE_INFINITY;
bf = Float.NEGATIVE_INFINITY;
assertTrue(fEq(af, abs(bf)));
a = 0.3 - 0.2 - 0.1;
b = 0.0;
assertTrue(dEq(a, b));
a = 1.0;
double[] ranges = {0.0, 1.0, -3.5, 6.7};
assertTrue(isBetween(a, ranges));
ranges = new double[]{0.0, 1.0, -3.5, 6.7, 1.2, 2.0};
assertFalse(isBetween(a, ranges));
}
public void testRanges() throws Exception {
double[] x = {1, 2, -1, -4, 6, 2, 2, 3, -1, -2, -4};
List<int[]> negativeRanges = NumericsUtilities.getNegativeRanges(x);
int[] i1 = negativeRanges.get(0);
assertEquals(i1[0], 2);
assertEquals(i1[1], 3);
int[] i2 = negativeRanges.get(1);
assertEquals(i2[0], 8);
assertEquals(i2[1], 10);
}
public void testRangeToBin() throws Exception {
double[] range2Bins = NumericsUtilities.range2Bins(-6, 12, 6);
double[][] expected = {{-6.0, -3.0, 0.0, 3.0, 6.0, 9.0, 12.0}};
double[][] got = {range2Bins};
checkMatrixEqual(got, expected, DELTA);
// use steps
range2Bins = NumericsUtilities.range2Bins(-6, 12, 3.0, false);
expected = new double[][]{{-6.0, -3.0, 0.0, 3.0, 6.0, 9.0, 12.0}};
got = new double[][]{range2Bins};
checkMatrixEqual(got, expected, DELTA);
range2Bins = NumericsUtilities.range2Bins(-6, 12, 3.0, true);
expected = new double[][]{{-6.0, -3.0, 0.0, 3.0, 6.0, 9.0, 12.0}};
got = new double[][]{range2Bins};
checkMatrixEqual(got, expected, DELTA);
range2Bins = NumericsUtilities.range2Bins(-6, 12, 1.5, false);
expected = new double[][]{{-6.0, -4.5, -3.0, -1.5, 0.0, 1.5, 3.0, 4.5, 6.0, 7.5, 9.0, 10.5, 12.0}};
got = new double[][]{range2Bins};
checkMatrixEqual(got, expected, DELTA);
range2Bins = NumericsUtilities.range2Bins(-6, 12, 5.0, false);
expected = new double[][]{{-6.0, -1.0, 4.0, 9.0, 12.0}};
got = new double[][]{range2Bins};
checkMatrixEqual(got, expected, DELTA);
range2Bins = NumericsUtilities.range2Bins(-6, 12, 5.0, true);
expected = new double[][]{{-6.0, -1.0, 4.0, 9.0, 14.0}};
got = new double[][]{range2Bins};
checkMatrixEqual(got, expected, DELTA);
range2Bins = NumericsUtilities.range2Bins(-6, 12, 7.5, false);
expected = new double[][]{{-6.0, 1.5, 9.0, 12.0}};
got = new double[][]{range2Bins};
checkMatrixEqual(got, expected, DELTA);
range2Bins = NumericsUtilities.range2Bins(-6, 12, 7.5, true);
expected = new double[][]{{-6.0, 1.5, 9.0, 16.5}};
got = new double[][]{range2Bins};
checkMatrixEqual(got, expected, DELTA);
}
}