/** * Get the {@code grid} as sample indices. * * @param s Sampling that this {@code grid} subsamples. * @param grid the subsample locations defined in terms of Sampling {@code s}. * @return the {@code grid} as sample indices. * @throws IllegalArgumentException if any of the grid locations are not valid with the given * Sampling {@code s}. */ public static int[] gridCoordsToSamples(Sampling s, float[] grid) { Almost a = new Almost(); float f = (float) s.getFirst(); float l = (float) s.getLast(); int ng = grid.length; int[] t = new int[ng]; // temp sample indices int count = 0; int is = -1; // save last index for (int ig = 0; ig < ng; ig++) { float v = grid[ig]; if (a.ge(v, f) && a.le(v, l)) { int i = s.indexOfNearest(v); if (i != is) { // no duplicate entries t[count] = i; count++; } is = i; } else { print("Error: value " + v + " is out of bounds! First=" + f + ", Last=" + l); } } if (count != ng) { print("Grid values:"); dump(grid); throw new IllegalArgumentException( "Error: Only " + count + " of " + ng + " input grid coordinates are valid " + "with the specified sampling " + s.toString()); } return copy(count, t); }
/** test the hash code algorithm */ public void testHashCode() { Almost a = new Almost(0.001, 0.000001); assert (a.hashCodeOf(0.00000001, 100) == 0); assert (a.hashCodeOf(0.99999999, 100) == 1); assert (a.hashCodeOf(1.00000001, 100) == 1); assert (a.hashCodeOf(123456789L, 100) == 123456789L); assert (a.hashCodeOf(3.1415, 4) == a.hashCodeOf(3.1415926, 4)); assert (a.hashCodeOf(3.1415, 5) != a.hashCodeOf(3.1415926, 5)); assert (a.hashCodeOf(-3.1415, 4) == a.hashCodeOf(-3.1415926, 4)); assert (a.hashCodeOf(-3.1415, 5) != a.hashCodeOf(-3.1415926, 5)); assert (a.hashCodeOf(314.15, 4) == a.hashCodeOf(314.15926, 4)); assert (a.hashCodeOf(314.15, 5) != a.hashCodeOf(314.15926, 5)); assert (a.hashCodeOf(-314.15, 4) == a.hashCodeOf(-314.15926, 4)); assert (a.hashCodeOf(-314.15, 5) != a.hashCodeOf(-314.15926, 5)); assert (a.hashCodeOf(0.0031415, 4) == a.hashCodeOf(0.0031415926, 4)); assert (a.hashCodeOf(0.0031415, 5) != a.hashCodeOf(0.0031415926, 5)); // specify precision differently a = new Almost(0.0001); assert (a.equal(0.0031415, 0.0031415926)); assert (a.hashCodeOf(0.0031415) == a.hashCodeOf(0.0031415926)); a = new Almost(0.00001); assert (!a.equal(0.0031415, 0.0031415926)); assert (a.hashCodeOf(0.0031415) != a.hashCodeOf(0.0031415926)); a = new Almost(4); assert (a.equal(0.0031415, 0.0031415926)); assert (a.hashCodeOf(0.0031415) == a.hashCodeOf(0.0031415926)); a = new Almost(5); assert (!a.equal(0.0031415, 0.0031415926)); assert (a.hashCodeOf(0.0031415) != a.hashCodeOf(0.0031415926)); }
/** Run some test code. Any "public void test*()" method starting with "test" will be used */ public void testEverything() { Almost a = new Almost(); // should obviously succeed. No precision involved assert (a.between(1., 0., 2.)); assert (a.between(-1., 0., -2.)); assert (a.between(-1., -0.5, -2.)); assert (a.outside(1., 0., 2.) == 0); assert (a.outside(1., 0.5, 2.) == 0); assert (a.outside(-1., 0., -2.) == 0); assert (a.outside(-1., -0.5, -2.) == 0); assert (a.cmp(1., 0.) > 0); assert (a.cmp(0., 1.) < 0); assert (a.cmp(1., 1.) == 0); assert (a.cmp(0., 0.) == 0); assert (a.equal(3., 3.)); assert (a.equal(0., 0.)); assert (a.zero(0.)); // Succeed if precision handled correctly assert (a.zero(a.getMinValue() / 2.)); assert (!a.zero(a.getMinValue() * 2.)); assert (1. != 1. + a.getEpsilon()); assert (1. != 1. - a.getEpsilon()); assert (0. != a.getMinValue()); assert (a.equal(1., 1. + a.getEpsilon() / 2.)); assert (!a.equal(1., 1. + a.getEpsilon() * 2.1)); assert (a.equal(1., 1.000000000001)); assert (a.getMinValue() / 2. > 0.); assert (a.equal(0., a.getMinValue() / 2.)); assert (a.between(1., 1.000000000001, 2.)); assert (a.between(-1., -1.000000000001, -2.)); assert (a.outside(1., 1.000000000001, 2.) == 0); assert (a.cmp(1., 1.000000000001) == 0); }
/** test Object methods */ public void testAlmostObjectMethod() { Almost af1 = new Almost(10 * MathPlus.FLT_EPSILON, 100 * Float.MIN_VALUE); Almost af2 = new Almost(10 * MathPlus.FLT_EPSILON); Almost af3 = new Almost(); Almost ad = new Almost(10 * MathPlus.DBL_EPSILON, 100 * Double.MIN_VALUE); assert af1.equals(af2) : af1 + " " + af2; assert af1.equals(af3) : af1 + " " + af3; assert af2.equals(af3) : af2 + " " + af3; assert af1.hashCode() == af2.hashCode() : af1 + " " + af2; assert af1.hashCode() == af3.hashCode() : af1 + " " + af3; assert af2.hashCode() == af3.hashCode() : af2 + " " + af3; assert af1.toString().equals(af2.toString()) : af1.toString() + " " + af2.toString(); assert af1.toString().equals(af3.toString()) : af1.toString() + " " + af3.toString(); assert af2.toString().equals(af3.toString()) : af2.toString() + " " + af3.toString(); for (Almost af : new Almost[] {af1, af2, af3}) { assert !af.equals(ad); assert af.hashCode() != ad.hashCode(); assert !af.toString().equals(ad.toString()); } }