diff --git a/java/source/infodynamics/measures/continuous/kernel/KernelEstimatorTransferEntropyMultiVariate.java b/java/source/infodynamics/measures/continuous/kernel/KernelEstimatorTransferEntropyMultiVariate.java index cc96bd3..3225b75 100755 --- a/java/source/infodynamics/measures/continuous/kernel/KernelEstimatorTransferEntropyMultiVariate.java +++ b/java/source/infodynamics/measures/continuous/kernel/KernelEstimatorTransferEntropyMultiVariate.java @@ -96,7 +96,9 @@ public class KernelEstimatorTransferEntropyMultiVariate extends KernelEstimatorM // epsilonInUse has been computed for the destination. // TODO We could compute and set it directly here so // we don't have a mismatch between any of the vector - // variables. + // variables. Don't do this - it allows destPastVectors to hold + // slightly different variables, e.g. in the case of + // TEMultiVariateSingleObservationsKernel if (normalise) { for (int d = 0; d < sourceDimensions; d++) { diff --git a/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorMultiVariateKernel.java b/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorMultiVariateKernel.java index cebc729..6c0abff 100755 --- a/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorMultiVariateKernel.java +++ b/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorMultiVariateKernel.java @@ -602,6 +602,8 @@ public class TransferEntropyCalculatorMultiVariateKernel * * @param newOrderings first index is permutation number, i.e. newOrderings[i] * is an array of 1 permutation of 0..n-1, where there were n observations. + * Note that n observations is generally less than the time series length + * if the TE was estimated from a single time series. * @return * @throws Exception */ @@ -615,6 +617,15 @@ public class TransferEntropyCalculatorMultiVariateKernel // Space for the source observations: double[][] oldSourceValues = sourceVectors; + // Check that the largest value in the newOrderings is within range: + int maxNewIndex = MatrixUtils.max(newOrderings); + if (maxNewIndex >= sourceVectors.length) { + throw new Exception("Cannot prescribe a new ordering index of " + maxNewIndex + + " since this is outside the range 0..n-1, where n=" + + sourceVectors.length + " is the number of observations that " + + "have been supplied to the calculator."); + } + int countWhereTeIsMoreSignificantThanOriginal = 0; EmpiricalMeasurementDistribution measDistribution = new EmpiricalMeasurementDistribution(numPermutationsToCheck); for (int p = 0; p < numPermutationsToCheck; p++) { diff --git a/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorMultiVariateSingleObservationsKernel.java b/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorMultiVariateSingleObservationsKernel.java index 34d53d2..79ea2c7 100755 --- a/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorMultiVariateSingleObservationsKernel.java +++ b/java/source/infodynamics/measures/continuous/kernel/TransferEntropyCalculatorMultiVariateSingleObservationsKernel.java @@ -85,7 +85,15 @@ public class TransferEntropyCalculatorMultiVariateSingleObservationsKernel // dimensions if we're not careful) addedMoreThanOneObservationSet = false; k = 1; - initialise(); + // Mimic super.initialise() (it would use k * destDimenions in the kernel estimator + // for destPast instead of destPastDimensions if we're not careful) + teKernelEstimator.initialise(destPastDimensions, + sourceDimensions, epsilon, epsilon); + nextStateKernelEstimator.initialise(destDimensions, epsilon); + destPastVectors = null; + destNextVectors = null; + sourceVectors = null; + localProbNextCondPast = null; } /** diff --git a/java/source/infodynamics/measures/continuous/kraskov/MutualInfoCalculatorMultiVariateKraskov.java b/java/source/infodynamics/measures/continuous/kraskov/MutualInfoCalculatorMultiVariateKraskov.java index 2fbd91b..eb629a0 100755 --- a/java/source/infodynamics/measures/continuous/kraskov/MutualInfoCalculatorMultiVariateKraskov.java +++ b/java/source/infodynamics/measures/continuous/kraskov/MutualInfoCalculatorMultiVariateKraskov.java @@ -58,6 +58,19 @@ public abstract class MutualInfoCalculatorMultiVariateKraskov implements // No need to keep the dimenions here } + /** + * Sets properties for the calculator. + * Valid properties include: + * + * + * @param propertyName + * @param propertyValue + */ public void setProperty(String propertyName, String propertyValue) { if (propertyName.equalsIgnoreCase(PROP_K)) { k = Integer.parseInt(propertyValue); diff --git a/java/source/infodynamics/measures/continuous/kraskov/TransferEntropyCalculatorKraskovByMulti.java b/java/source/infodynamics/measures/continuous/kraskov/TransferEntropyCalculatorKraskovByMulti.java index 5ab36c2..7e7306d 100755 --- a/java/source/infodynamics/measures/continuous/kraskov/TransferEntropyCalculatorKraskovByMulti.java +++ b/java/source/infodynamics/measures/continuous/kraskov/TransferEntropyCalculatorKraskovByMulti.java @@ -149,12 +149,12 @@ public class TransferEntropyCalculatorKraskovByMulti * Sets properties for the calculator. * Valid properties include: * - * One should set MutualInfoCalculatorMultiVariateKraskov.PROP_K here, the number + * One should set {@link MutualInfoCalculatorMultiVariateKraskov#PROP_K} here, the number * of neighbouring points one should count up to in determining the joint kernel size. * * @param propertyName