package com.datascience.utils.transformations; import com.datascience.core.base.AssignedLabel; import com.datascience.core.base.ContValue; import com.datascience.core.base.LObject; import com.datascience.core.base.Worker; import com.datascience.core.results.*; import com.datascience.datastoring.transforms.ICoreTransformsFactory; import com.datascience.utils.ITransformation; import com.google.common.collect.Lists; import org.junit.Assert; import org.junit.Test; import java.util.*; import static junit.framework.TestCase.assertTrue; /** * User: artur * Date: 5/16/13 */ public abstract class BaseTransformationTest { protected abstract ICoreTransformsFactory getCreator(); private abstract static class LabelCreator<T>{ abstract T create(int k); } private static class StringLabelCreator extends LabelCreator<String> { String create (int k){ return "label" + k; } } private static class ContValueLabelCreator extends LabelCreator<ContValue>{ ContValue create(int k){ return new ContValue(k*1., k*1.); } } private <T> Collection<AssignedLabel<T>> createAssignedLabels(int k, LabelCreator<T> labelCreator){ Collection<AssignedLabel<T>> labels = new LinkedList<AssignedLabel<T>>(); for (int i = 0; i< k; i++){ labels.add(new AssignedLabel<T>(new Worker("worker"+i), new LObject<T>("object"+i), labelCreator.create(i))); } return labels; } private <T> Collection<LObject<T>> createLObjects(int k, LabelCreator<T> labelCreator, boolean gold, boolean evaluation){ Collection<LObject<T>> objects = new LinkedList<LObject<T>>(); for (int i =0; i<k; i++){ LObject<T> obj = new LObject<T>("object"+i); if (gold) obj.setGoldLabel(labelCreator.create(i)); if (evaluation) obj.setEvaluationLabel(labelCreator.create(i)); objects.add(obj); } return objects; } private Collection<Worker> createWorkers(int k){ Collection<Worker> workers = new LinkedList<Worker>(); for (int i =0; i<k; i++){ workers.add(new Worker("worker"+i)); } return workers; } private <T> void testAssignsTransformation(LabelCreator<T> creator, ITransformation<Collection<AssignedLabel<T>>, String> transformation){ Collection<AssignedLabel<T>> labels = this.<T>createAssignedLabels(5, creator); ArrayList<AssignedLabel<T>> transformedLabels = new ArrayList<AssignedLabel<T>>(transformation.inverse(transformation.transform(labels))); Assert.assertEquals(transformedLabels.size(), labels.size()); int i = 0; for (AssignedLabel<T> al : labels){ AssignedLabel<T> al2 = transformedLabels.get(i); Assert.assertEquals(al, al2); Assert.assertEquals(al.getLobject(), al2.getLobject()); Assert.assertEquals(al.getWorker(), al2.getWorker()); i++; } } @Test public void testStringAssignsTransformation(){ testAssignsTransformation(new StringLabelCreator(), getCreator().createNominalAssignsTransformation()); } @Test public void testContValueAssignsTransformation(){ testAssignsTransformation(new ContValueLabelCreator(), getCreator().createContAssignsTransformation()); } private <T> void testObjectsTransformation(LabelCreator<T> creator, ITransformation<Collection<LObject<T>>, String> transformation){ for (boolean gold : new boolean[]{true, false}){ for (boolean eval : new boolean[]{true, false}){ Collection<LObject<T>> objects = this.<T>createLObjects(5, creator, gold, eval); ArrayList<LObject<T>> transformedObjects = new ArrayList<LObject<T>>(transformation.inverse(transformation.transform(objects))); Assert.assertEquals(transformedObjects.size(), objects.size()); int i = 0; for (LObject<T> obj : objects){ LObject<T> obj2 = transformedObjects.get(i); Assert.assertEquals(obj, obj2); assertTrue(obj.deepEquals(obj2)); i++; } } } } @Test public void testStringObjectsTransformation(){ testObjectsTransformation(new StringLabelCreator(), getCreator().createNominalObjectsTransformation()); } @Test public void testContValueObjectsTransformation(){ testObjectsTransformation(new ContValueLabelCreator(), getCreator().createContObjectsTransformation()); } @Test public void testWorkersTransformation(){ Collection<Worker> workers = createWorkers(5); ITransformation<Collection<Worker>, String> transformation = getCreator().createWorkersTransformation(); ArrayList<Worker> transformedWorkers = new ArrayList<Worker>(transformation.inverse(transformation.transform(workers))); Assert.assertEquals(workers.size(), transformedWorkers.size()); int i =0; for (Worker w : workers){ Worker w2 = transformedWorkers.get(i); Assert.assertEquals(w, w2); i++; } } @Test public void testWorkersResultsTransformation(){ ResultsFactory.WorkerResultNominalFactory creator = new ResultsFactory.WorkerResultNominalFactory(); creator.setCategories(Lists.newArrayList(new String[]{"Cat1", "Cat2"})); WorkerResult wr = creator.create(); ITransformation<WorkerResult, String> transformation = getCreator().createWorkerStringResultsTransformation(creator); WorkerResult transformedWR = transformation.inverse(transformation.transform(wr)); Assert.assertEquals(wr, transformedWR); } @Test public void testWorkersContResultsTransformation(){ ResultsFactory.WorkerContResultFactory creator = new ResultsFactory.WorkerContResultFactory(); WorkerContResults wr = creator.create(); wr.setEst_sigma(0.0); wr.setEst_mu(0.1); wr.setEst_rho(0.2); wr.setTrueSigma(0.3); wr.setTrueMu(0.4); wr.setTrueRho(0.5); wr.setZetaValue(createAssignedLabels(3, new ContValueLabelCreator())); ITransformation<WorkerContResults, String> transformation = getCreator().createWorkerContResultsTransformation(); WorkerContResults transformedWR = transformation.inverse(transformation.transform(wr)); Assert.assertEquals(wr, transformedWR); } @Test public void testDatumResultTransformation(){ ResultsFactory.DatumResultFactory creator = new ResultsFactory.DatumResultFactory(); DatumResult dr = creator.create(); Map<String, Double> cp = new HashMap<String, Double>(); cp.put("Cat1", 0.4); cp.put("Cat2", 0.6); dr.setCategoryProbabilites(cp); ITransformation<DatumResult, String> transformation = getCreator().createDatumStringResultsTransformation(); DatumResult transformedDR = transformation.inverse(transformation.transform(dr)); Assert.assertEquals(dr.getCategoryProbabilites(), transformedDR.getCategoryProbabilites()); } @Test public void testDatumContResultTransformation(){ ResultsFactory.DatumContResultFactory creator = new ResultsFactory.DatumContResultFactory(); DatumContResults dr = creator.create(); ITransformation<DatumContResults, String> transformation = getCreator().createDatumContResultsTransformation(); DatumContResults transformedDR = transformation.inverse(transformation.transform(dr)); Assert.assertEquals(dr, transformedDR); } }