From 914dc171f55f8fa3d4e789accdd02a025192e534 Mon Sep 17 00:00:00 2001 From: Donovan Rynne Date: Sat, 18 May 2024 14:24:22 +1000 Subject: [PATCH] fix bugs where shuffle and rotate strategy where switched Also fixed rotate surrogate selection, list was being rotate continuously rather than rotating the initial index list, which nullified the dyncorrexcl setting. --- .../measures/continuous/MutualInfoMultiVariateCommon.java | 2 +- java/source/infodynamics/utils/RandomGenerator.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/java/source/infodynamics/measures/continuous/MutualInfoMultiVariateCommon.java b/java/source/infodynamics/measures/continuous/MutualInfoMultiVariateCommon.java index fa10249..c726114 100755 --- a/java/source/infodynamics/measures/continuous/MutualInfoMultiVariateCommon.java +++ b/java/source/infodynamics/measures/continuous/MutualInfoMultiVariateCommon.java @@ -684,7 +684,7 @@ public abstract class MutualInfoMultiVariateCommon implements // (Not necessary to check for distinct random perturbations) int[][] newOrderings = new int[numSurrogatesToCheck][sourceObservations.length]; - if (surrogate_type.equalsIgnoreCase(PROP_SHUFFLE)){ + if (surrogate_type.equalsIgnoreCase(PROP_ROTATE)){ newOrderings = rg.generateRotatedSurrogates(sourceObservations.length, numSurrogatesToCheck, dynCorrExclTime); } else { newOrderings = rg.generateRandomPerturbations(sourceObservations.length, numSurrogatesToCheck); diff --git a/java/source/infodynamics/utils/RandomGenerator.java b/java/source/infodynamics/utils/RandomGenerator.java index b18153a..6da6eab 100755 --- a/java/source/infodynamics/utils/RandomGenerator.java +++ b/java/source/infodynamics/utils/RandomGenerator.java @@ -680,12 +680,14 @@ public class RandomGenerator { list.add(i); } for (int s = 0; s < numberOfRotations; s++) { + // Create a copy of the original list of indices + ArrayList rotatedList = new ArrayList(list); // Perform linear time rotations - // Note: the rotations are all equal likelihood, no exclusion window for autocorrelation time + // ignore rotations that are -+ dynCorrExclTime int rotationAmount = random.nextInt(n - 2 * dynCorrExclTime) + dynCorrExclTime; - Collections.rotate(list, rotationAmount); + Collections.rotate(rotatedList, rotationAmount); for (int j = 0; j < n; j++) { - sets[s][j] = list.get(j); + sets[s][j] = rotatedList.get(j); } } return sets;