From 4cac043affd63fb4e3b1831a51c1feadb523ae05 Mon Sep 17 00:00:00 2001 From: jlizier Date: Tue, 18 Oct 2016 15:05:15 +1100 Subject: [PATCH] Added unit test for TE continuous getSeparateNumObservations (in Kraskov class) --- .../kraskov/TransferEntropyTester.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/java/unittests/infodynamics/measures/continuous/kraskov/TransferEntropyTester.java b/java/unittests/infodynamics/measures/continuous/kraskov/TransferEntropyTester.java index f227eb8..92bb81c 100755 --- a/java/unittests/infodynamics/measures/continuous/kraskov/TransferEntropyTester.java +++ b/java/unittests/infodynamics/measures/continuous/kraskov/TransferEntropyTester.java @@ -537,4 +537,70 @@ public class TransferEntropyTester assertEquals(teOptimisedSingleThread, teOptimisedWithValidity, 0.00000001); System.out.println("Answer unchanged by setting validity"); } + + public void testGetSeparateNumObservations() throws Exception { + ArrayFileReader afr = new ArrayFileReader("demos/data/SFI-heartRate_breathVol_bloodOx.txt"); + double[][] data = afr.getDouble2DMatrix(); + + TransferEntropyCalculatorKraskov teCalc = new TransferEntropyCalculatorKraskov(); + + teCalc.initialise(); + teCalc.startAddObservations(); + int timeStepsPerCall = 100; + int calls = 10; + for (int i = 0; i < calls; i++) { + // Add more samples + teCalc.addObservations(MatrixUtils.selectColumn(data, 0, i*timeStepsPerCall, timeStepsPerCall), + MatrixUtils.selectColumn(data, 1, i*timeStepsPerCall, timeStepsPerCall)); + } + teCalc.finaliseAddObservations(); + @SuppressWarnings("unused") + double result = teCalc.computeAverageLocalOfObservations(); + + // Now we want to check how many observations were added at each call: + int[] samplesPerCall = teCalc.getSeparateNumObservations(); + assertEquals(calls, samplesPerCall.length); + for (int i = 0; i < calls; i++) { + // For k = l = 1, we should have timeStepsPerCall - 1 samples per addObservations() call: + assertEquals(timeStepsPerCall - 1, samplesPerCall[i]); + } + + // ===================== + // Now run it again with different k and l and embedding lags, etc: + teCalc.initialise(); + teCalc.startAddObservations(); + // auto embed destination only + teCalc.setProperty(TransferEntropyCalculatorKraskov.PROP_AUTO_EMBED_METHOD, + TransferEntropyCalculatorKraskov.AUTO_EMBED_METHOD_RAGWITZ_DEST_ONLY); + teCalc.setProperty(TransferEntropyCalculatorKraskov.PROP_K_SEARCH_MAX, "5"); + teCalc.setProperty(TransferEntropyCalculatorKraskov.PROP_TAU_SEARCH_MAX, "5"); + // Explicitly set the source embedding params + teCalc.setProperty(TransferEntropyCalculatorKraskov.L_PROP_NAME, "1"); + teCalc.setProperty(TransferEntropyCalculatorKraskov.L_TAU_PROP_NAME, "1"); + int[] timeStepsPerCallArray = new int[] {100, 200, 150, 300, 99, 54}; + int startTime = 0; + for (int i = 0; i < timeStepsPerCallArray.length; i++) { + // Add more samples + teCalc.addObservations(MatrixUtils.selectColumn(data, 0, startTime, timeStepsPerCallArray[i]), + MatrixUtils.selectColumn(data, 1, startTime, timeStepsPerCallArray[i])); + startTime += timeStepsPerCallArray[i]; + } + teCalc.finaliseAddObservations(); + result = teCalc.computeAverageLocalOfObservations(); + int optimisedK = Integer.parseInt(teCalc.getProperty(TransferEntropyCalculatorKraskov.K_PROP_NAME)); + int optimisedKTau = Integer.parseInt(teCalc.getProperty(TransferEntropyCalculatorKraskov.K_TAU_PROP_NAME)); + int timeOfFirstObservationPerSet = (optimisedK - 1)*optimisedKTau + 1; + System.out.printf("In testing tracking of observations per addObservations() call" + + " we have auto-embedding dimension %d and lag %d, timeOfFirstObservationPerSet %d\n", + optimisedK, optimisedKTau, timeOfFirstObservationPerSet); + + // Now we want to check how many observations were added at each call: + samplesPerCall = teCalc.getSeparateNumObservations(); + assertEquals(timeStepsPerCallArray.length, samplesPerCall.length); + for (int i = 0; i < timeStepsPerCallArray.length; i++) { + // For timeOfFirstObservationPerSet, we should have timeStepsPerCall - timeOfFirstObservationPerSet + // samples per addObservations() call: + assertEquals(timeStepsPerCallArray[i] - timeOfFirstObservationPerSet, samplesPerCall[i]); + } + } }