package hex.quantile; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import water.Job; import water.TestUtil; import water.fvec.Frame; import water.util.ArrayUtils; import java.util.Arrays; public class QuantileTest extends TestUtil { @BeforeClass() public static void setup() { stall_till_cloudsize(1); } @Test public void testIris() { QuantileModel kmm = null; Frame fr = null; try { long start = System.currentTimeMillis(); System.out.println("Start Parse"); fr = parse_test_file("smalldata/iris/iris_wheader.csv"); //fr = parse_test_file("../../datasets/UCI/UCI-large/covtype/covtype.data"); //fr = parse_test_file("../../datasets/billion_rows.csv.gz"); System.out.println("Done Parse: "+(System.currentTimeMillis()-start)); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; //parms._max_iterations = 10; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testAllNAS() { QuantileModel kmm = null; Frame fr = null; try { fr = ArrayUtils.frame(new double[][]{{Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN}, {Double.NaN} }); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); for (int i=0; i < 11; i++) Assert.assertTrue(Double.isNaN(kmm._output._quantiles[0][i])); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInts() { QuantileModel kmm = null; Frame fr = null; try { fr = ArrayUtils.frame(new double[][]{{0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {2}, {2}, {2}, {2}, {2}, {2}, {2}, {2}, {2}, {2}}); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void test50pct() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1.56386606237}, {0.812834256224}, {3.68417563302}, {3.12702210880}, {5.51277746586}}; fr = ArrayUtils.frame(d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][5] == d[3][0]); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testDirectMatch() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1}, {1}, {1}, {2}}; fr = ArrayUtils.frame(d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._probs = new double[]{0.5}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 1); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolate1() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1}, {1}, {2}, {2}}; fr = ArrayUtils.frame(d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._probs = new double[]{0.5}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 1.5); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolate2() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1}, {1}, {3}, {2}}; fr = ArrayUtils.frame(d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._probs = new double[]{0.5}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 1.5); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateLow() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1}, {2}, {3}}; fr = ArrayUtils.frame(d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._probs = new double[]{0.49}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 1.98); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHigh() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1}, {2}, {3}}; fr = ArrayUtils.frame(d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._probs = new double[]{0.51}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 2.02); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHighWeighted() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1, 0}, {2, 1}, {3, 1}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0.51}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 2.51); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHighWeighted2() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1, 2}, {2, 1}, {3, 1}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0.43}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 1.29); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHighWeighted3() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1, 3}, {2, 2}, {3, 5}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0.31}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 1.79); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHighWeighted4() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1, 1.005}, {2, 1}, {3, 1}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0.71}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue("Got: " + kmm._output._quantiles[0][0], Math.abs(kmm._output._quantiles[0][0] - 2.42355)<1e-10); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHighWeighted5() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1, 5}, {2, 4}, {3, 3}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0.43}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 1.73); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHighWeighted6() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1, 2}, {2, 2}, {3, 2}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0.33}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(kmm._output._quantiles[0][0] == 1.65); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHighWeighted7() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1, 1}, {2, 1}, {3, 1}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0,0.25,0.5,0.75,1}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(Arrays.equals(kmm._output._quantiles[0], new double[]{1,1.5,2,2.5,3})); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateHighWeighted8() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1, 2}, {2, 2}, {3, 2}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0,0.25,0.5,0.75,1}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); Assert.assertTrue(Arrays.equals(kmm._output._quantiles[0], new double[]{1,1.25,2,2.75,3})); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateWideRangeWeighted() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1e-100, 1}, {1e-10, 4}, {1e-4, 2}, {1e-2, 4}, {1e-1, 5}, {1, 3}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; //parms._probs = new double[]{0,0.25,0.5,0.75,1}; parms._probs = new double[]{0.25,0.5,0.75,1}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); //double[] exp = new double[]{1e-100,5e-5,1e-2,1e-1,1}; double[] exp = new double[]{5e-5,1e-2,1e-1,1}; double[] act = kmm._output._quantiles[0]; for (int i=0;i<exp.length; ++i) Assert.assertTrue("Got " + act[i] + " but expected " + exp[i], Math.abs(act[i] - exp[i])/exp[i] < 1e-5); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateWideRange() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1e-100}, {1e-10}, {1e-4}, {1e-2}, {1e-1}, {1}}; fr = ArrayUtils.frame(new String[]{"x"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._probs = new double[]{0,0.25,0.5,0.75,1}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); double[] exp = new double[]{1e-100,2.5e-5,5.05e-3,7.75e-2,1}; double[] act = kmm._output._quantiles[0]; for (int i=0;i<exp.length; ++i) Assert.assertTrue("Got " + act[i] + " but expected " + exp[i], Math.abs(act[i] - exp[i])/exp[i] < 1e-5); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateWideRangeWeighted2() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{1e-100, 10}, {1e-10, 4}, {1e-4, 2}, {1e-2, 4}, {1e-1, 5}, {1, 3}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0,0.25,0.5,0.75,1}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); double[] exp = new double[]{1e-100,1e-100,5.000005e-5,1e-1,1}; double[] act = kmm._output._quantiles[0]; for (int i=0;i<exp.length; ++i) Assert.assertTrue("Got " + act[i] + " but expected " + exp[i], Math.abs(act[i] - exp[i]) / exp[i] < 1e-5); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testInterpolateLargeWeights() { QuantileModel kmm = null; Frame fr = null; try { double[][] d = new double[][]{{0, 10}, {1, 10}}; fr = ArrayUtils.frame(new String[]{"x","weights"}, d); QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr._key; parms._weights_column = "weights"; parms._probs = new double[]{0.475,0.48,0.49}; Job<QuantileModel> job = new Quantile(parms).trainModel(); kmm = job.get(); job.remove(); double[] exp = new double[]{0.025,0.12,0.31}; double[] act = kmm._output._quantiles[0]; for (int i=0;i<exp.length; ++i) Assert.assertTrue("Got " + act[i] + " but expected " + exp[i], Math.abs(act[i] - exp[i]) / exp[i] < 1e-5); } finally { if( fr != null ) fr .remove(); if( kmm != null ) kmm.delete(); } } @Test public void testShuffled() { QuantileModel kmm1; QuantileModel kmm2; Frame fr1 = null; Frame fr2 = null; try { fr1 = parse_test_file("smalldata/junit/no_weights.csv"); fr2 = parse_test_file("smalldata/junit/no_weights_shuffled.csv"); for (QuantileModel.CombineMethod comb : new QuantileModel.CombineMethod[]{ QuantileModel.CombineMethod.AVERAGE, QuantileModel.CombineMethod.LOW, QuantileModel.CombineMethod.HIGH, QuantileModel.CombineMethod.INTERPOLATE }) { { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr1._key; parms._combine_method = comb; Job<QuantileModel> job1 = new Quantile(parms).trainModel(); kmm1 = job1.get(); job1.remove(); } { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr2._key; parms._combine_method = comb; Job<QuantileModel> job2 = new Quantile(parms).trainModel(); kmm2 = job2.get(); job2.remove(); } try { Assert.assertTrue(Arrays.deepEquals(kmm1._output._quantiles, kmm2._output._quantiles)); } finally { if (kmm1 != null) kmm1.delete(); if (kmm2 != null) kmm2.delete(); } } } finally { if( fr1 != null ) fr1.remove(); if( fr2 != null ) fr2.remove(); } } @Test public void testWeights0() { QuantileModel kmm1; QuantileModel kmm2; Frame fr1 = null; Frame fr2 = null; try { fr1 = parse_test_file("smalldata/junit/no_weights.csv"); fr2 = parse_test_file("smalldata/junit/weights_all_ones.csv"); for (QuantileModel.CombineMethod comb : new QuantileModel.CombineMethod[]{ QuantileModel.CombineMethod.AVERAGE, QuantileModel.CombineMethod.LOW, QuantileModel.CombineMethod.HIGH, QuantileModel.CombineMethod.INTERPOLATE }) { { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr1._key; parms._combine_method = comb; parms._weights_column = null; Job<QuantileModel> job1 = new Quantile(parms).trainModel(); kmm1 = job1.get(); job1.remove(); } { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr2._key; parms._combine_method = comb; parms._weights_column = "weight"; Job<QuantileModel> job2 = new Quantile(parms).trainModel(); kmm2 = job2.get(); job2.remove(); } try { Assert.assertTrue(Arrays.deepEquals(kmm1._output._quantiles, kmm2._output._quantiles)); } finally { if (kmm1 != null) kmm1.delete(); if (kmm2 != null) kmm2.delete(); } } } finally { if( fr1 != null ) fr1.remove(); if( fr2 != null ) fr2.remove(); } } @Test public void testWeights1() { QuantileModel kmm1; QuantileModel kmm2; Frame fr1 = null; Frame fr2 = null; try { fr1 = parse_test_file("smalldata/junit/no_weights.csv"); fr2 = parse_test_file("smalldata/junit/weights.csv"); for (QuantileModel.CombineMethod comb : new QuantileModel.CombineMethod[]{ QuantileModel.CombineMethod.AVERAGE, QuantileModel.CombineMethod.LOW, QuantileModel.CombineMethod.HIGH, QuantileModel.CombineMethod.INTERPOLATE }) { { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr1._key; parms._combine_method = comb; parms._weights_column = null; Job<QuantileModel> job1 = new Quantile(parms).trainModel(); kmm1 = job1.get(); job1.remove(); } { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr2._key; parms._combine_method = comb; parms._weights_column = "weight"; Job<QuantileModel> job2 = new Quantile(parms).trainModel(); kmm2 = job2.get(); job2.remove(); } try { Assert.assertTrue(Arrays.deepEquals(kmm1._output._quantiles, kmm2._output._quantiles)); } finally { if (kmm1 != null) kmm1.delete(); if (kmm2 != null) kmm2.delete(); } } } finally { if( fr1 != null ) fr1.remove(); if( fr2 != null ) fr2.remove(); } } @Ignore @Test public void testWeights2() { //same behavior as wtd.quantile in R -> results with all weights=1 and all weights=2 don't agree (unless normwt=TRUE) QuantileModel kmm1; QuantileModel kmm2; Frame fr1 = null; Frame fr2 = null; try { fr1 = parse_test_file("smalldata/junit/weights_all_twos.csv"); fr2 = parse_test_file("smalldata/junit/weights_all_ones.csv"); for (QuantileModel.CombineMethod comb : new QuantileModel.CombineMethod[]{ QuantileModel.CombineMethod.AVERAGE, QuantileModel.CombineMethod.LOW, QuantileModel.CombineMethod.HIGH, QuantileModel.CombineMethod.INTERPOLATE }) { { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr1._key; parms._combine_method = comb; parms._weights_column = "weight"; Job<QuantileModel> job1 = new Quantile(parms).trainModel(); kmm1 = job1.get(); job1.remove(); } { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr2._key; parms._combine_method = comb; parms._weights_column = "weight"; Job<QuantileModel> job2 = new Quantile(parms).trainModel(); kmm2 = job2.get(); job2.remove(); } try { assert(Arrays.deepEquals(kmm1._output._quantiles, kmm2._output._quantiles)); Assert.assertTrue(Arrays.deepEquals(kmm1._output._quantiles, kmm2._output._quantiles)); } finally { if (kmm1 != null) kmm1.delete(); if (kmm2 != null) kmm2.delete(); } } } finally { if( fr1 != null ) fr1.remove(); if( fr2 != null ) fr2.remove(); } } @Ignore @Test public void testWeights3() { //same behavior as wtd.quantile in R -> results with all weights=1 and all weights=epsilon don't agree (unless normwt=TRUE) QuantileModel kmm1; QuantileModel kmm2; Frame fr1 = null; Frame fr2 = null; try { fr1 = parse_test_file("smalldata/junit/weights_all_tiny.csv"); fr2 = parse_test_file("smalldata/junit/weights_all_ones.csv"); for (QuantileModel.CombineMethod comb : new QuantileModel.CombineMethod[]{ QuantileModel.CombineMethod.AVERAGE, QuantileModel.CombineMethod.LOW, QuantileModel.CombineMethod.HIGH, QuantileModel.CombineMethod.INTERPOLATE }) { { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr1._key; parms._combine_method = comb; parms._weights_column = "weight"; Job<QuantileModel> job1 = new Quantile(parms).trainModel(); kmm1 = job1.get(); job1.remove(); } { QuantileModel.QuantileParameters parms = new QuantileModel.QuantileParameters(); parms._train = fr2._key; parms._combine_method = comb; parms._weights_column = "weight"; Job<QuantileModel> job2 = new Quantile(parms).trainModel(); kmm2 = job2.get(); job2.remove(); } try { Assert.assertTrue(Arrays.deepEquals(kmm1._output._quantiles, kmm2._output._quantiles)); } finally { if (kmm1 != null) kmm1.delete(); if (kmm2 != null) kmm2.delete(); } } } finally { if( fr1 != null ) fr1.remove(); if( fr2 != null ) fr2.remove(); } } }