package gov.sandia.cognition.statistics; import gov.sandia.cognition.math.matrix.Vector; import gov.sandia.cognition.math.matrix.VectorFactory; import gov.sandia.cognition.statistics.TransferEntropy.TransferEntropyDistributionObject; import gov.sandia.cognition.statistics.TransferEntropy.TransferEntropyPartialSumObject; import gov.sandia.cognition.statistics.distribution.DefaultDataDistribution; import gov.sandia.cognition.util.Pair; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static org.junit.Assert.*; import org.junit.Test; /** * Unit test for transfer entropy. * * @author trbroun */ public class TransferEntropyTest { /** * Test of computeTE method, of class TransferEntropy. */ @Test public void testComputeTE() { VectorFactory<? extends Vector> vectorFactory = VectorFactory.getDenseDefault(); final double[] value1 = {1,0,0,1,0,0,0,1,0,0}; Vector vector1 = vectorFactory.copyArray(value1); final double[] value2 = {0,1,0,0,1,0,0,0,1,0}; Vector vector2 = vectorFactory.copyArray(value2); final double[] value3 = {1,1,1,1,1,1,1,1,1,1}; Vector vector3 = vectorFactory.copyArray(value3); TransferEntropy te12 = new TransferEntropy(vector1, vector2, 1); TransferEntropy te21 = new TransferEntropy(vector2, vector1, 1); TransferEntropy te13 = new TransferEntropy(vector1, vector3, 1); TransferEntropy te31 = new TransferEntropy(vector3, vector1, 1); assertEquals(0.2121713, te21.compute(), 0.000001); assertEquals(0.4620981, te12.compute(), 0.000001); assertEquals(0., te13.compute(), 0.000001); assertEquals(0., te31.compute(), 0.000001); DefaultDataDistribution<TransferEntropyDistributionObject> oneTermPriorDist = new DefaultDataDistribution<TransferEntropyDistributionObject>(); DefaultDataDistribution<TransferEntropyDistributionObject> oneTermPostDist = new DefaultDataDistribution<TransferEntropyDistributionObject>(); DefaultDataDistribution<TransferEntropyDistributionObject> twoTermPriorDist = new DefaultDataDistribution<TransferEntropyDistributionObject>(); DefaultDataDistribution<TransferEntropyDistributionObject> twoTermPostDist = new DefaultDataDistribution<TransferEntropyDistributionObject>(); for (int ii = 0; ii< 9; ii++) { ArrayList<Double> first = new ArrayList<Double>(1); ArrayList<Double> second = new ArrayList<Double>(1); first.add(value1[ii]); second.add(value2[ii]); double temp = value1[ii+1]; oneTermPriorDist.increment(new TransferEntropyDistributionObject(first)); oneTermPostDist.increment(new TransferEntropyDistributionObject(first, temp)); twoTermPriorDist.increment(new TransferEntropyDistributionObject(first, second)); twoTermPostDist.increment(new TransferEntropyDistributionObject(first, second, temp)); } ArrayList<Double> first = new ArrayList<Double>(1); ArrayList<Double> second = new ArrayList<Double>(1); first.add(value1[9]); second.add(value2[9]); oneTermPriorDist.increment(new TransferEntropyDistributionObject(first)); twoTermPriorDist.increment(new TransferEntropyDistributionObject(first, second)); TransferEntropy te = new TransferEntropy(oneTermPriorDist, oneTermPostDist, twoTermPriorDist, twoTermPostDist); assertEquals(0.2190444, te.compute(), 0.000001); List<Double> list1 = new ArrayList<Double>(10); List<Double> list2 = new ArrayList<Double>(10); List<Double> list3 = new ArrayList<Double>(10); for (int ii = 0; ii < 10; ii++) { list1.add(value1[ii]); list2.add(value2[ii]); list3.add(value3[ii]); } te12 = new TransferEntropy(list1, list2, 1); te21 = new TransferEntropy(list2, list1, 1); te13 = new TransferEntropy(list1, list3, 1); te31 = new TransferEntropy(list3, list1, 1); assertEquals(0.2121713, te21.compute(), 0.000001); assertEquals(0.4620981, te12.compute(), 0.000001); assertEquals(0., te13.compute(), 0.000001); assertEquals(0., te31.compute(), 0.000001); List<Boolean> booleanList1 = new ArrayList<Boolean>(10); List<Boolean> booleanList2 = new ArrayList<Boolean>(10); for (int ii = 0; ii < 10; ii++) { if (value1[ii] != 0.) { booleanList1.add(true); } else { booleanList1.add(false); } if (value2[ii] != 0.) { booleanList2.add(true); } else { booleanList2.add(false); } } te12 = new TransferEntropy(booleanList1, booleanList2, 1); te21 = new TransferEntropy(booleanList2, booleanList1, 1); assertEquals(0.2121713, te21.compute(), 0.000001); assertEquals(0.4620981, te12.compute(), 0.000001); } /** * Test of computeTEWithPartialSums method, of class TransferEntropy. */ @Test public void testComputeTEWithPartialSums() { VectorFactory<? extends Vector> vectorFactory = VectorFactory.getDenseDefault(); double[] value1 = {1,0,0,1,0,0,0,1,0,0}; Vector vector1 = vectorFactory.copyArray(value1); double[] value2 = {0,1,0,0,1,0,0,0,1,0}; Vector vector2 = vectorFactory.copyArray(value2); TransferEntropy te12 = new TransferEntropy(vector1, vector2, 1); Pair<Double, HashMap<TransferEntropyDistributionObject, TransferEntropyPartialSumObject>> answer = te12.computeWithPartialSums(); assertEquals(0.4620981, answer.getFirst(), 0.000001); ArrayList<Integer> first = new ArrayList<Integer>(1); ArrayList<Integer> second = new ArrayList<Integer>(1); first.add(0); second.add(1); TransferEntropyDistributionObject triad0 = new TransferEntropyDistributionObject(first, second, 1); TransferEntropyDistributionObject triad1 = new TransferEntropyDistributionObject(first, second, 0); assertEquals(0.2310490, answer.getSecond().get(triad0).partialSum, 0.000001); assertEquals(triad0, answer.getSecond().get(triad0).state); assertEquals(3.0, answer.getSecond().get(triad0).numberOfAppearances, 0.000001); assertEquals(null, answer.getSecond().get(triad1)); } /** * Test of equals method for TransferEntropyPartialSumObjects */ @Test public void testEqualsForTransferEntropyPartialSumObjects() { ArrayList<Integer> first = new ArrayList<Integer>(1); ArrayList<Integer> second = new ArrayList<Integer>(1); first.add(0); second.add(1); TransferEntropyDistributionObject triad0 = new TransferEntropyDistributionObject(first, second, 1); TransferEntropyDistributionObject triad1 = new TransferEntropyDistributionObject(first, second, 1); TransferEntropyPartialSumObject test0 = new TransferEntropyPartialSumObject(triad0, 0.3, 5.0); TransferEntropyPartialSumObject test1 = new TransferEntropyPartialSumObject(triad1, 0.3, 5.0); assertTrue(test0.equals(test1)); } }