package water.fvec; import static org.junit.Assert.*; import org.junit.*; import java.util.Random; import water.Futures; import water.TestUtil; import water.Key; public class VecStatsTest extends TestUtil { @BeforeClass public static void setup() { stall_till_cloudsize(1); } @Test public void test() { Frame frame = null; try { Futures fs = new Futures(); Random random = new Random(); Vec[] vecs = new Vec[1]; AppendableVec vec = new AppendableVec(Vec.newKey(), Vec.T_NUM); for( int i = 0; i < 2; i++ ) { NewChunk chunk = new NewChunk(vec, i); for( int r = 0; r < 1000; r++ ) chunk.addNum(random.nextInt(1000)); chunk.close(i, fs); } vecs[0] = vec.layout_and_close(fs); fs.blockForPending(); frame = new Frame(Key.<Frame>make(), null, vecs); // Make sure we test the multi-chunk case vecs = frame.vecs(); assert vecs[0].nChunks() > 1; long rows = frame.numRows(); Vec v = vecs[0]; double min = Double.POSITIVE_INFINITY, max = Double.NEGATIVE_INFINITY, mean = 0, sigma = 0; for( int r = 0; r < rows; r++ ) { double d = v.at(r); if( d < min ) min = d; if( d > max ) max = d; mean += d; } mean /= rows; for( int r = 0; r < rows; r++ ) { double d = v.at(r); sigma += (d - mean) * (d - mean); } sigma = Math.sqrt(sigma / (rows - 1)); double epsilon = 1e-9; assertEquals(max, v.max(), epsilon); assertEquals(min, v.min(), epsilon); assertEquals(mean, v.mean(), epsilon); assertEquals(sigma, v.sigma(), epsilon); } finally { if( frame != null ) frame.delete(); } } @Test public void testPCTiles() { // Simplified version of tests in runit_quantile_1_golden.R. There we test probs=seq(0,1,by=0.01) Vec vec = vec(5 , 8 , 9 , 12 , 13 , 16 , 18 , 23 , 27 , 28 , 30 , 31 , 33 , 34 , 43, 45, 48, 161); double[] pctiles = vec.pctiles(); //System.out.println(java.util.Arrays.toString(pctiles)); Assert.assertEquals(13.75,pctiles[4],1e-5); vec.remove(); vec = vec(5 , 8 , 9 , 9 , 9 , 16 , 18 , 23 , 27 , 28 , 30 , 31 , 31 , 34 , 43, 43, 43, 161); pctiles = vec.pctiles(); //System.out.println(java.util.Arrays.toString(pctiles)); Assert.assertEquals(10.75,pctiles[4],1e-5); vec.remove(); } }