use ndarray::Array1;
pub trait GlobalValue {
fn global_value(&self) -> f64;
}
pub trait LocalValues: GlobalValue {
fn local_values(&self) -> Array1<f64>;
fn global_from_local(&self) -> f64 {
let local_vals = self.local_values();
local_vals
.mean()
.expect("Local values should not be empty.")
}
}
pub trait OptionalLocalValues {
fn supports_local(&self) -> bool;
fn local_values_opt(&self) -> Result<Array1<f64>, &'static str>;
}
pub trait CrossEntropy<Rhs = Self> {
fn cross_entropy(&self, other: &Rhs) -> f64;
}
pub trait JointEntropy {
type Source;
type Params;
fn joint_entropy(series: &[Self::Source], params: Self::Params) -> f64;
}
pub trait MutualInformationTrait {
type Source;
type Params;
fn mutual_information(series: &[Self::Source], params: Self::Params) -> f64;
}
pub trait ConditionalMutualInformationTrait {
type Source;
type Cond;
type Params;
fn cmi(series: &[Self::Source], cond: &Self::Cond, params: Self::Params) -> f64;
}
pub trait MutualInformationEstimator: GlobalValue + OptionalLocalValues {}
pub trait ConditionalMutualInformationEstimator: GlobalValue + OptionalLocalValues {}
pub trait TransferEntropyEstimator: GlobalValue + OptionalLocalValues {}
pub trait ConditionalTransferEntropyEstimator: GlobalValue + OptionalLocalValues {}