Adding univariate calls for cross CMI

This commit is contained in:
Joseph Lizier 2025-04-01 22:33:02 +11:00
parent fa21f7343a
commit c08aeb1783
2 changed files with 60 additions and 0 deletions

View File

@ -623,6 +623,38 @@ public interface ConditionalMutualInfoCalculatorMultiVariate
public double[] computeLocalUsingPreviousObservations(double states1[][], double states2[][], double[][] condStates) public double[] computeLocalUsingPreviousObservations(double states1[][], double states2[][], double[][] condStates)
throws Exception; throws Exception;
/**
* <p>As per {@link #computeLocalUsingPreviousObservations(double[][], double[][], double[][])}
* but can only be used where dimensions of
* states1 and states2 have been set to 1.</p>
*
* @param states1 series of univariate observations for variable 1
* @param states2 series of univariate observations for variable 2
* Length must match <code>states1</code>, and their indices must correspond.
* @param condStates series of multivariate observations for the conditional
* (first index is time or observation index, second is variable number).
* Length must match <code>states1</code>, and their indices must correspond.
* @return the series of local conditional MI values.
* @throws Exception
*/
public double[] computeLocalUsingPreviousObservations(double states1[], double states2[], double[][] condStates)
throws Exception;
/**
* <p>As per {@link #computeLocalUsingPreviousObservations(double[][], double[][], double[][])}
* but can only be used all dimensions have been set to 1.</p>
*
* @param states1 series of univariate observations for variable 1
* @param states2 series of univariate observations for variable 2.
* Length must match <code>states1</code>, and their indices must correspond.
* @param condStates series of univariate observations for the conditional.
* Length must match <code>states1</code>, and their indices must correspond.
* @return the series of local conditional MI values.
* @throws Exception
*/
public double[] computeLocalUsingPreviousObservations(double states1[], double states2[], double[] condStates)
throws Exception;
/** /**
* @throws Exception if the implementing class computes MI without * @throws Exception if the implementing class computes MI without
* explicit observations (e.g. see * explicit observations (e.g. see

View File

@ -934,6 +934,34 @@ public abstract class ConditionalMutualInfoMultiVariateCommon implements
// Compute the MI // Compute the MI
return miSurrogateCalculator.computeAverageLocalOfObservations(); return miSurrogateCalculator.computeAverageLocalOfObservations();
} }
@Override
public double[] computeLocalUsingPreviousObservations(double[] states1, double[] states2, double[][] condStates)
throws Exception {
if ((dimensionsVar1 != 1) || (dimensionsVar2 != 1)) {
throw new Exception("The number of source and dest dimensions (having been initialised to " +
dimensionsVar1 + " and " + dimensionsVar2 + ") can only be 1 when " +
"the univariate computeLocalUsingPreviousObservations(double[],double[],double[][]) " +
"method is called");
}
return computeLocalUsingPreviousObservations(MatrixUtils.reshape(states1, states1.length, 1),
MatrixUtils.reshape(states2, states2.length, 1),
condStates);
}
@Override
public double[] computeLocalUsingPreviousObservations(double[] states1, double[] states2, double[] condStates)
throws Exception {
if ((dimensionsVar1 != 1) || (dimensionsVar2 != 1) || (dimensionsCond != 1)) {
throw new Exception("The number of source, dest and conditional dimensions (having been initialised to " +
dimensionsVar1 + ", " + dimensionsVar2 + " and " + dimensionsCond + ") can only be 1 when " +
"the univariate computeLocalUsingPreviousObservations(double[],double[],double[]) " +
"method is called");
}
return computeLocalUsingPreviousObservations(MatrixUtils.reshape(states1, states1.length, 1),
MatrixUtils.reshape(states2, states2.length, 1),
MatrixUtils.reshape(condStates, condStates.length, 1));
}
@Override @Override
public void setDebug(boolean debug) { public void setDebug(boolean debug) {