package water;
import static org.junit.Assert.*;
import org.junit.*;
import water.fvec.Chunk;
import water.fvec.Frame;
public class ClientTest extends TestUtil {
@BeforeClass static public void setup() { stall_till_cloudsize(3); }
// ---
// Run some basic tests. Create a key, test that it does not exist, insert a
// value for it, get the value for it, delete it.
@Test public void testBasicCRUD() {
Key k1 = Key.make("key1");
Value v0 = DKV.get(k1);
assertNull(v0);
Value v1 = new Value(k1,"test0 bits for Value");
DKV.put(k1,v1);
assertEquals(v1._key,k1);
Value v2 = DKV.get(k1);
assertEquals(v1,v2);
DKV.remove(k1);
Value v3 = DKV.get(k1);
assertNull(v3);
}
// Speed test: takes my lappy 4msec per iteration over covtype
@Test public void biggerTest() {
// Do not run this test on non-client nodes, it is too slow
if( !H2O.ARGS.client ) return;
// For a client node, start the test & then commit suicide.
// The goal is to check for errors on the server-side
new Thread() {
@Override public void run() {
System.out.println("Client is starting timer");
try { Thread.sleep(2000); } catch(Exception ignore) {}
System.out.println("Client is committing shutting prematurely");
System.exit(0);
}
}.start();
System.out.println("Server is loading file");
Frame fr = RPC.call(H2O.CLOUD.leader(),new DTask() {
Frame _fr; // Output frame
@Override
public void compute2() {
_fr = parse_test_file(Key.make("covtype.hex"),"../../datasets/UCI/UCI-large/covtype/covtype.data");
tryComplete();
}
}).get()._fr;
System.out.println("Server loaded file");
try {
final int iters = 100;
final long start = System.currentTimeMillis();
CalcSumsTask lr1 = null;
for( int i=0; i<iters; i++ ) {
lr1 = new CalcSumsTask().doAll(fr.vecs()[0],fr.vecs()[1]);
}
final long end = System.currentTimeMillis();
final double meanX = lr1._sumX/lr1._nrows;
final double meanY = lr1._sumY/lr1._nrows;
System.out.println("CalcSums iter over covtype: "+(end-start)/iters+"ms, meanX="+meanX+", meanY="+meanY+", nrows="+lr1._nrows);
} finally {
fr.delete();
}
}
public static class CalcSumsTask extends MRTask<CalcSumsTask> {
long _nrows; // Rows used
double _sumX,_sumY,_sumX2; // Sum of X's, Y's, X^2's
@Override public void map( Chunk xs, Chunk ys ) {
for( int i=0; i<xs._len; i++ ) {
double X = xs.atd(i); double Y = ys.atd(i);
if( !Double.isNaN(X) && !Double.isNaN(Y)) {
_sumX += X; _sumY += Y;
_sumX2+= X*X; _nrows++;
}
}
}
@Override public void reduce( CalcSumsTask lr1 ) {
_sumX += lr1._sumX ; _sumY += lr1._sumY ;
_sumX2+= lr1._sumX2; _nrows += lr1._nrows;
}
}
}