package water.fvec; import org.junit.*; import water.Scope; import water.TestUtil; import water.util.Log; import water.util.PrettyPrint; import water.util.RandomUtils; import java.util.Random; public class CategoricalWrappedVecTest extends TestUtil { @BeforeClass static public void setup() { stall_till_cloudsize(1); } // Need to move test files over @Test public void testAdaptTo() { Scope.enter(); Frame v1=null, v2=null; try { v1 = parse_test_file("smalldata/junit/mixcat_train.csv"); v2 = parse_test_file("smalldata/junit/mixcat_test.csv"); CategoricalWrappedVec vv = v2.vecs()[0].adaptTo(v1.vecs()[0].domain()); Assert.assertArrayEquals("Mapping differs",new int[]{0,1,3},vv._map); Assert.assertArrayEquals("Mapping differs",new String[]{"A","B","C","D"},vv.domain()); vv.remove(); } finally { if( v1!=null ) v1.delete(); if( v2!=null ) v2.delete(); Scope.exit(); } } /** Verifies that {@link CategoricalWrappedVec#computeMap(String[], String[])} returns * correct values. */ @Test public void testModelMappingCall() { Scope.enter(); testModelMapping(ar("A", "B", "C"), ar("A", "B", "C"), ari(0,1,2)); testModelMapping(ar("A", "B", "C"), ar( "B", "C"), ari( 1,2)); testModelMapping(ar("A", "B", "C"), ar( "B" ), ari( 1 )); testModelMapping(ar("A", "B", "C"), ar("A", "B", "C", "D"), ari(0,1,2,3)); testModelMapping(ar("A", "B", "C"), ar( "B", "C", "D"), ari( 1,2,3)); testModelMapping(ar("A", "B", "C"), ar("B", "D"), ari(1, 3)); Scope.exit(); } @Ignore @Test public void testPerformance() { for (int N : new int[]{9999,100,1000,10000,20000,40000,80000}) { Scope.enter(); String[] fromDomain = new String[N]; String[] toDomain = new String[N]; Random rng = RandomUtils.getRNG(0xDECAF); for (int i = 0; i < N; ++i) { byte[] b = new byte[(int)(Math.log10(N))]; rng.nextBytes(b); fromDomain[i] = new String(b); rng.nextBytes(b); toDomain[i] = new String(b); } long start = System.currentTimeMillis(); CategoricalWrappedVec.computeMap(fromDomain, toDomain); long duration = System.currentTimeMillis() - start; if (N==9999) Log.info("Warming up."); else Log.info("Time for categorical unification of two maps with each " + N + " factors (only partially overlapping): " + PrettyPrint.msecs(duration, true)); Scope.exit(); } } private static void testModelMapping(String[] modelDomain, String[] colDomain, int[] expectedMapping) { int[] mapping = CategoricalWrappedVec.computeMap(colDomain, modelDomain); Assert.assertArrayEquals("Mapping differs", expectedMapping, mapping); } }