use crate::estimators::approaches::discrete::ansb::AnsbEntropy;
use crate::estimators::approaches::discrete::bayes::{AlphaParam, BayesEntropy};
use crate::estimators::approaches::discrete::bonachela::BonachelaEntropy;
use crate::estimators::approaches::discrete::chao_shen::ChaoShenEntropy;
use crate::estimators::approaches::discrete::chao_wang_jost::ChaoWangJostEntropy;
use crate::estimators::approaches::discrete::grassberger::GrassbergerEntropy;
use crate::estimators::approaches::discrete::miller_madow::MillerMadowEntropy;
use crate::estimators::approaches::discrete::mle::DiscreteEntropy;
use crate::estimators::approaches::discrete::nsb::NsbEntropy;
use crate::estimators::approaches::discrete::shrink::ShrinkEntropy;
use crate::estimators::approaches::discrete::zhang::ZhangEntropy;
use crate::estimators::approaches::discrete::{
DiscreteConditionalMutualInformation, DiscreteMutualInformation,
};
use ndarray::{Array1, Array2, Axis};
use crate::estimators::approaches::kernel::{
KernelConditionalMutualInformation, KernelMutualInformation2, KernelMutualInformation3,
KernelMutualInformation4,
};
use crate::estimators::approaches::expfam::kozachenko_leonenko::{
KozachenkoLeonenkoConditionalMutualInformation, KozachenkoLeonenkoMutualInformation2,
};
use crate::estimators::approaches::expfam::ksg::{
KsgConditionalMutualInformation, KsgMutualInformation2,
};
use crate::estimators::approaches::expfam::renyi::{
RenyiConditionalMutualInformation, RenyiMutualInformation2,
};
use crate::estimators::approaches::expfam::tsallis::{
TsallisConditionalMutualInformation, TsallisMutualInformation2,
};
use crate::estimators::approaches::ordinal::ordinal_estimator::{
OrdinalConditionalMutualInformation, OrdinalMutualInformation,
};
#[macro_export]
macro_rules! new_kernel_mi {
($series:expr, $kernel:expr, $bw:expr, $d1:expr, $d2:expr) => {{
const D_JOINT: usize = $d1 + $d2;
$crate::estimators::approaches::kernel::KernelMutualInformation2::<D_JOINT, $d1, $d2>::new($series, $kernel, $bw)
}};
($series:expr, $kernel:expr, $bw:expr, $d1:expr, $d2:expr, $d3:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3;
$crate::estimators::approaches::kernel::KernelMutualInformation3::<D_JOINT, $d1, $d2, $d3>::new($series, $kernel, $bw)
}};
($series:expr, $kernel:expr, $bw:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4;
$crate::estimators::approaches::kernel::KernelMutualInformation4::<D_JOINT, $d1, $d2, $d3, $d4>::new($series, $kernel, $bw)
}};
($series:expr, $kernel:expr, $bw:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5;
$crate::estimators::approaches::kernel::KernelMutualInformation5::<D_JOINT, $d1, $d2, $d3, $d4, $d5>::new($series, $kernel, $bw)
}};
($series:expr, $kernel:expr, $bw:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr, $d6:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5 + $d6;
$crate::estimators::approaches::kernel::KernelMutualInformation6::<D_JOINT, $d1, $d2, $d3, $d4, $d5, $d6>::new($series, $kernel, $bw)
}};
}
#[macro_export]
macro_rules! new_kernel_cmi {
($series:expr, $cond:expr, $kernel:expr, $bw:expr, $d1:expr, $d2:expr, $d_cond:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d_cond;
const D1_COND: usize = $d1 + $d_cond;
const D2_COND: usize = $d2 + $d_cond;
$crate::estimators::approaches::kernel::KernelConditionalMutualInformation::<
$d1,
$d2,
$d_cond,
D_JOINT,
D1_COND,
D2_COND,
>::new($series, $cond, $kernel, $bw)
}};
}
#[macro_export]
macro_rules! new_ksg_mi {
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr) => {{
const D_JOINT: usize = $d1 + $d2;
$crate::estimators::approaches::expfam::ksg::KsgMutualInformation2::<D_JOINT, $d1, $d2>::new($series, $k, $noise)
}};
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3;
$crate::estimators::approaches::expfam::ksg::KsgMutualInformation3::<D_JOINT, $d1, $d2, $d3>::new($series, $k, $noise)
}};
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4;
$crate::estimators::approaches::expfam::ksg::KsgMutualInformation4::<D_JOINT, $d1, $d2, $d3, $d4>::new($series, $k, $noise)
}};
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5;
$crate::estimators::approaches::expfam::ksg::KsgMutualInformation5::<D_JOINT, $d1, $d2, $d3, $d4, $d5>::new($series, $k, $noise)
}};
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr, $d6:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5 + $d6;
$crate::estimators::approaches::expfam::ksg::KsgMutualInformation6::<D_JOINT, $d1, $d2, $d3, $d4, $d5, $d6>::new($series, $k, $noise)
}};
}
#[macro_export]
macro_rules! new_ksg_cmi {
($series:expr, $cond:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d_cond:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d_cond;
const D1_COND: usize = $d1 + $d_cond;
const D2_COND: usize = $d2 + $d_cond;
$crate::estimators::approaches::expfam::ksg::KsgConditionalMutualInformation::<
$d1,
$d2,
$d_cond,
D_JOINT,
D1_COND,
D2_COND,
>::new($series, $cond, $k, $noise)
}};
}
#[macro_export]
macro_rules! new_renyi_mi {
($series:expr, $k:expr, $alpha:expr, $noise:expr, $d1:expr, $d2:expr) => {{
const D_JOINT: usize = $d1 + $d2;
$crate::estimators::approaches::expfam::renyi::RenyiMutualInformation2::<D_JOINT, $d1, $d2>::new($series, $k, $alpha, $noise)
}};
($series:expr, $k:expr, $alpha:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3;
$crate::estimators::approaches::expfam::renyi::RenyiMutualInformation3::<D_JOINT, $d1, $d2, $d3>::new($series, $k, $alpha, $noise)
}};
($series:expr, $k:expr, $alpha:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4;
$crate::estimators::approaches::expfam::renyi::RenyiMutualInformation4::<D_JOINT, $d1, $d2, $d3, $d4>::new($series, $k, $alpha, $noise)
}};
($series:expr, $k:expr, $alpha:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5;
$crate::estimators::approaches::expfam::renyi::RenyiMutualInformation5::<D_JOINT, $d1, $d2, $d3, $d4, $d5>::new($series, $k, $alpha, $noise)
}};
($series:expr, $k:expr, $alpha:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr, $d6:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5 + $d6;
$crate::estimators::approaches::expfam::renyi::RenyiMutualInformation6::<D_JOINT, $d1, $d2, $d3, $d4, $d5, $d6>::new($series, $k, $alpha, $noise)
}};
}
#[macro_export]
macro_rules! new_renyi_cmi {
($series:expr, $cond:expr, $k:expr, $alpha:expr, $noise:expr, $d1:expr, $d2:expr, $d_cond:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d_cond;
const D1_COND: usize = $d1 + $d_cond;
const D2_COND: usize = $d2 + $d_cond;
$crate::estimators::approaches::expfam::renyi::RenyiConditionalMutualInformation::<
$d1,
$d2,
$d_cond,
D_JOINT,
D1_COND,
D2_COND,
>::new($series, $cond, $k, $alpha, $noise)
}};
}
#[macro_export]
macro_rules! new_tsallis_mi {
($series:expr, $k:expr, $q:expr, $noise:expr, $d1:expr, $d2:expr) => {{
const D_JOINT: usize = $d1 + $d2;
$crate::estimators::approaches::expfam::tsallis::TsallisMutualInformation2::<
D_JOINT,
$d1,
$d2,
>::new($series, $k, $q, $noise)
}};
($series:expr, $k:expr, $q:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3;
$crate::estimators::approaches::expfam::tsallis::TsallisMutualInformation3::<
D_JOINT,
$d1,
$d2,
$d3,
>::new($series, $k, $q, $noise)
}};
($series:expr, $k:expr, $q:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4;
$crate::estimators::approaches::expfam::tsallis::TsallisMutualInformation4::<
D_JOINT,
$d1,
$d2,
$d3,
$d4,
>::new($series, $k, $q, $noise)
}};
($series:expr, $k:expr, $q:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5;
$crate::estimators::approaches::expfam::tsallis::TsallisMutualInformation5::<
D_JOINT,
$d1,
$d2,
$d3,
$d4,
$d5,
>::new($series, $k, $q, $noise)
}};
($series:expr, $k:expr, $q:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr, $d6:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5 + $d6;
$crate::estimators::approaches::expfam::tsallis::TsallisMutualInformation6::<
D_JOINT,
$d1,
$d2,
$d3,
$d4,
$d5,
$d6,
>::new($series, $k, $q, $noise)
}};
}
#[macro_export]
macro_rules! new_tsallis_cmi {
($series:expr, $cond:expr, $k:expr, $q:expr, $noise:expr, $d1:expr, $d2:expr, $d_cond:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d_cond;
const D1_COND: usize = $d1 + $d_cond;
const D2_COND: usize = $d2 + $d_cond;
$crate::estimators::approaches::expfam::tsallis::TsallisConditionalMutualInformation::<
$d1,
$d2,
$d_cond,
D_JOINT,
D1_COND,
D2_COND,
>::new($series, $cond, $k, $q, $noise)
}};
}
#[macro_export]
macro_rules! new_kl_mi {
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr) => {{
const D_JOINT: usize = $d1 + $d2;
$crate::estimators::approaches::expfam::kozachenko_leonenko::KozachenkoLeonenkoMutualInformation2::<D_JOINT, $d1, $d2>::new($series, $k, $noise)
}};
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3;
$crate::estimators::approaches::expfam::kozachenko_leonenko::KozachenkoLeonenkoMutualInformation3::<D_JOINT, $d1, $d2, $d3>::new($series, $k, $noise)
}};
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4;
$crate::estimators::approaches::expfam::kozachenko_leonenko::KozachenkoLeonenkoMutualInformation4::<D_JOINT, $d1, $d2, $d3, $d4>::new($series, $k, $noise)
}};
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5;
$crate::estimators::approaches::expfam::kozachenko_leonenko::KozachenkoLeonenkoMutualInformation5::<D_JOINT, $d1, $d2, $d3, $d4, $d5>::new($series, $k, $noise)
}};
($series:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d3:expr, $d4:expr, $d5:expr, $d6:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d3 + $d4 + $d5 + $d6;
$crate::estimators::approaches::expfam::kozachenko_leonenko::KozachenkoLeonenkoMutualInformation6::<D_JOINT, $d1, $d2, $d3, $d4, $d5, $d6>::new($series, $k, $noise)
}};
}
#[macro_export]
macro_rules! new_kl_cmi {
($series:expr, $cond:expr, $k:expr, $noise:expr, $d1:expr, $d2:expr, $d_cond:expr) => {{
const D_JOINT: usize = $d1 + $d2 + $d_cond;
const D1_COND: usize = $d1 + $d_cond;
const D2_COND: usize = $d2 + $d_cond;
$crate::estimators::approaches::expfam::kozachenko_leonenko::KozachenkoLeonenkoConditionalMutualInformation::<
$d1,
$d2,
$d_cond,
D_JOINT,
D1_COND,
D2_COND,
>::new($series, $cond, $k, $noise)
}};
}
#[doc = doc_snippets!(facade_overview "MI/CMI", "Facade for creating mutual information (MI) and conditional mutual information (CMI) estimators.")]
#[doc = doc_snippets!(const_generic_limitation)]
#[doc = doc_snippets!(macro_simplification_mi)]
pub struct MutualInformation;
impl MutualInformation {
pub fn new_discrete_mle(series: &[Array1<i32>]) -> DiscreteMutualInformation<DiscreteEntropy> {
DiscreteMutualInformation::new(series, DiscreteEntropy::new)
}
pub fn new_kernel(series: &[Array1<f64>], bandwidth: f64) -> KernelMutualInformation2<2, 1, 1> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
KernelMutualInformation2::new(&series_2d, "box".to_string(), bandwidth)
}
pub fn new_kernel_with_type(
series: &[Array1<f64>],
kernel_type: String,
bandwidth: f64,
) -> KernelMutualInformation2<2, 1, 1> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
KernelMutualInformation2::new(&series_2d, kernel_type, bandwidth)
}
pub fn nd_kernel<const D_JOINT: usize, const D1: usize, const D2: usize>(
series: &[Array2<f64>],
bandwidth: f64,
) -> KernelMutualInformation2<D_JOINT, D1, D2> {
KernelMutualInformation2::new(series, "box".to_string(), bandwidth)
}
pub fn nd_kernel_with_type<const D_JOINT: usize, const D1: usize, const D2: usize>(
series: &[Array2<f64>],
kernel_type: String,
bandwidth: f64,
) -> KernelMutualInformation2<D_JOINT, D1, D2> {
KernelMutualInformation2::new(series, kernel_type, bandwidth)
}
pub fn new_discrete_miller_madow(
series: &[Array1<i32>],
) -> DiscreteMutualInformation<MillerMadowEntropy> {
DiscreteMutualInformation::new(series, MillerMadowEntropy::new)
}
pub fn new_discrete_shrink(series: &[Array1<i32>]) -> DiscreteMutualInformation<ShrinkEntropy> {
DiscreteMutualInformation::new(series, ShrinkEntropy::new)
}
pub fn new_cmi_discrete_mle(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<DiscreteEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, DiscreteEntropy::new)
}
pub fn new_cmi_discrete_miller_madow(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<MillerMadowEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, MillerMadowEntropy::new)
}
pub fn new_cmi_discrete_shrink(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<ShrinkEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, ShrinkEntropy::new)
}
pub fn new_ordinal(
series: &[Array1<f64>],
order: usize,
step_size: usize,
stable: bool,
) -> OrdinalMutualInformation {
OrdinalMutualInformation::new(series, order, step_size, stable)
}
pub fn new_cmi_ordinal(
series: &[Array1<f64>],
cond: &Array1<f64>,
order: usize,
step_size: usize,
stable: bool,
) -> OrdinalConditionalMutualInformation {
OrdinalConditionalMutualInformation::new(series, cond, order, step_size, stable)
}
pub fn new_cmi_kernel(
series: &[Array1<f64>],
cond: &Array1<f64>,
bandwidth: f64,
) -> KernelConditionalMutualInformation<1, 1, 1, 3, 2, 2> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
let cond_2d = cond.clone().insert_axis(Axis(1));
KernelConditionalMutualInformation::new(&series_2d, &cond_2d, "box".to_string(), bandwidth)
}
pub fn new_cmi_kernel_with_type(
series: &[Array1<f64>],
cond: &Array1<f64>,
kernel_type: String,
bandwidth: f64,
) -> KernelConditionalMutualInformation<1, 1, 1, 3, 2, 2> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
let cond_2d = cond.clone().insert_axis(Axis(1));
KernelConditionalMutualInformation::new(&series_2d, &cond_2d, kernel_type, bandwidth)
}
pub fn nd_cmi_kernel<
const D1: usize,
const D2: usize,
const D_COND: usize,
const D_JOINT: usize,
const D1_COND: usize,
const D2_COND: usize,
>(
series: &[Array2<f64>],
cond: &Array2<f64>,
bandwidth: f64,
) -> KernelConditionalMutualInformation<D1, D2, D_COND, D_JOINT, D1_COND, D2_COND> {
KernelConditionalMutualInformation::new(series, cond, "box".to_string(), bandwidth)
}
pub fn nd_cmi_kernel_with_type<
const D1: usize,
const D2: usize,
const D_COND: usize,
const D_JOINT: usize,
const D1_COND: usize,
const D2_COND: usize,
>(
series: &[Array2<f64>],
cond: &Array2<f64>,
kernel_type: String,
bandwidth: f64,
) -> KernelConditionalMutualInformation<D1, D2, D_COND, D_JOINT, D1_COND, D2_COND> {
KernelConditionalMutualInformation::new(series, cond, kernel_type, bandwidth)
}
pub fn new_discrete_chao_shen(
series: &[Array1<i32>],
) -> DiscreteMutualInformation<ChaoShenEntropy> {
DiscreteMutualInformation::new(series, ChaoShenEntropy::new)
}
pub fn new_cmi_discrete_chao_shen(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<ChaoShenEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, ChaoShenEntropy::new)
}
pub fn new_discrete_chao_wang_jost(
series: &[Array1<i32>],
) -> DiscreteMutualInformation<ChaoWangJostEntropy> {
DiscreteMutualInformation::new(series, ChaoWangJostEntropy::new)
}
pub fn new_cmi_discrete_chao_wang_jost(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<ChaoWangJostEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, ChaoWangJostEntropy::new)
}
pub fn new_discrete_nsb(series: &[Array1<i32>]) -> DiscreteMutualInformation<NsbEntropy> {
DiscreteMutualInformation::new(series, |data| NsbEntropy::new(data, None))
}
pub fn new_cmi_discrete_nsb(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<NsbEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, |data| NsbEntropy::new(data, None))
}
pub fn new_discrete_ansb(series: &[Array1<i32>]) -> DiscreteMutualInformation<AnsbEntropy> {
DiscreteMutualInformation::new(series, |data| AnsbEntropy::new(data, None, 0.0))
}
pub fn new_cmi_discrete_ansb(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<AnsbEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, |data| {
AnsbEntropy::new(data, None, 0.0)
})
}
pub fn new_discrete_bonachela(
series: &[Array1<i32>],
) -> DiscreteMutualInformation<BonachelaEntropy> {
DiscreteMutualInformation::new(series, BonachelaEntropy::new)
}
pub fn new_cmi_discrete_bonachela(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<BonachelaEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, BonachelaEntropy::new)
}
pub fn new_discrete_grassberger(
series: &[Array1<i32>],
) -> DiscreteMutualInformation<GrassbergerEntropy> {
DiscreteMutualInformation::new(series, GrassbergerEntropy::new)
}
pub fn new_cmi_discrete_grassberger(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<GrassbergerEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, GrassbergerEntropy::new)
}
pub fn new_discrete_zhang(series: &[Array1<i32>]) -> DiscreteMutualInformation<ZhangEntropy> {
DiscreteMutualInformation::new(series, ZhangEntropy::new)
}
pub fn new_cmi_discrete_zhang(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<ZhangEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, ZhangEntropy::new)
}
pub fn new_discrete_bayes(series: &[Array1<i32>]) -> DiscreteMutualInformation<BayesEntropy> {
DiscreteMutualInformation::new(series, |data| {
BayesEntropy::new(data, AlphaParam::Jeffrey, None)
})
}
pub fn new_cmi_discrete_bayes(
series: &[Array1<i32>],
cond: &Array1<i32>,
) -> DiscreteConditionalMutualInformation<BayesEntropy> {
DiscreteConditionalMutualInformation::new(series, cond, |data| {
BayesEntropy::new(data, AlphaParam::Jeffrey, None)
})
}
pub fn nd_kernel3<const D_JOINT: usize, const D1: usize, const D2: usize, const D3: usize>(
series: &[Array2<f64>],
bandwidth: f64,
) -> KernelMutualInformation3<D_JOINT, D1, D2, D3> {
KernelMutualInformation3::new(series, "box".to_string(), bandwidth)
}
pub fn nd_kernel3_with_type<
const D_JOINT: usize,
const D1: usize,
const D2: usize,
const D3: usize,
>(
series: &[Array2<f64>],
kernel_type: String,
bandwidth: f64,
) -> KernelMutualInformation3<D_JOINT, D1, D2, D3> {
KernelMutualInformation3::new(series, kernel_type, bandwidth)
}
pub fn nd_kernel4<
const D_JOINT: usize,
const D1: usize,
const D2: usize,
const D3: usize,
const D4: usize,
>(
series: &[Array2<f64>],
bandwidth: f64,
) -> KernelMutualInformation4<D_JOINT, D1, D2, D3, D4> {
KernelMutualInformation4::new(series, "box".to_string(), bandwidth)
}
pub fn new_ksg(
series: &[Array1<f64>],
k: usize,
noise_level: f64,
) -> KsgMutualInformation2<2, 1, 1> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
KsgMutualInformation2::new(&series_2d, k, noise_level)
}
pub fn nd_ksg<const D_JOINT: usize, const D1: usize, const D2: usize>(
series: &[Array2<f64>],
k: usize,
noise_level: f64,
) -> KsgMutualInformation2<D_JOINT, D1, D2> {
KsgMutualInformation2::new(series, k, noise_level)
}
pub fn new_cmi_ksg(
series: &[Array1<f64>],
cond: &Array1<f64>,
k: usize,
noise_level: f64,
) -> KsgConditionalMutualInformation<1, 1, 1, 3, 2, 2> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
let cond_2d = cond.clone().insert_axis(Axis(1));
KsgConditionalMutualInformation::new(&series_2d, &cond_2d, k, noise_level)
}
pub fn nd_cmi_ksg<
const D1: usize,
const D2: usize,
const D_COND: usize,
const D_JOINT: usize,
const D1_COND: usize,
const D2_COND: usize,
>(
series: &[Array2<f64>],
cond: &Array2<f64>,
k: usize,
noise_level: f64,
) -> KsgConditionalMutualInformation<D1, D2, D_COND, D_JOINT, D1_COND, D2_COND> {
KsgConditionalMutualInformation::new(series, cond, k, noise_level)
}
pub fn new_renyi(
series: &[Array1<f64>],
k: usize,
alpha: f64,
noise_level: f64,
) -> RenyiMutualInformation2<2, 1, 1> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
RenyiMutualInformation2::new(&series_2d, k, alpha, noise_level)
}
pub fn nd_renyi<const D_JOINT: usize, const D1: usize, const D2: usize>(
series: &[Array2<f64>],
k: usize,
alpha: f64,
noise_level: f64,
) -> RenyiMutualInformation2<D_JOINT, D1, D2> {
RenyiMutualInformation2::new(series, k, alpha, noise_level)
}
pub fn new_cmi_renyi(
series: &[Array1<f64>],
cond: &Array1<f64>,
k: usize,
alpha: f64,
noise_level: f64,
) -> RenyiConditionalMutualInformation<1, 1, 1, 3, 2, 2> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
let cond_2d = cond.clone().insert_axis(Axis(1));
RenyiConditionalMutualInformation::new(&series_2d, &cond_2d, k, alpha, noise_level)
}
pub fn nd_cmi_renyi<
const D1: usize,
const D2: usize,
const DZ: usize,
const D_JOINT: usize,
const D1Z: usize,
const D2Z: usize,
>(
series: &[Array2<f64>],
cond: &Array2<f64>,
k: usize,
alpha: f64,
noise_level: f64,
) -> RenyiConditionalMutualInformation<D1, D2, DZ, D_JOINT, D1Z, D2Z> {
RenyiConditionalMutualInformation::new(series, cond, k, alpha, noise_level)
}
pub fn new_tsallis(
series: &[Array1<f64>],
k: usize,
q: f64,
noise_level: f64,
) -> TsallisMutualInformation2<2, 1, 1> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
TsallisMutualInformation2::new(&series_2d, k, q, noise_level)
}
pub fn nd_tsallis<const D_JOINT: usize, const D1: usize, const D2: usize>(
series: &[Array2<f64>],
k: usize,
q: f64,
noise_level: f64,
) -> TsallisMutualInformation2<D_JOINT, D1, D2> {
TsallisMutualInformation2::new(series, k, q, noise_level)
}
pub fn new_cmi_tsallis(
series: &[Array1<f64>],
cond: &Array1<f64>,
k: usize,
q: f64,
noise_level: f64,
) -> TsallisConditionalMutualInformation<1, 1, 1, 3, 2, 2> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
let cond_2d = cond.clone().insert_axis(Axis(1));
TsallisConditionalMutualInformation::new(&series_2d, &cond_2d, k, q, noise_level)
}
pub fn nd_cmi_tsallis<
const D1: usize,
const D2: usize,
const DZ: usize,
const D_JOINT: usize,
const D1Z: usize,
const D2Z: usize,
>(
series: &[Array2<f64>],
cond: &Array2<f64>,
k: usize,
q: f64,
noise_level: f64,
) -> TsallisConditionalMutualInformation<D1, D2, DZ, D_JOINT, D1Z, D2Z> {
TsallisConditionalMutualInformation::new(series, cond, k, q, noise_level)
}
pub fn new_kl(
series: &[Array1<f64>],
k: usize,
noise_level: f64,
) -> KozachenkoLeonenkoMutualInformation2<2, 1, 1> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
KozachenkoLeonenkoMutualInformation2::new(&series_2d, k, noise_level)
}
pub fn nd_kl<const D_JOINT: usize, const D1: usize, const D2: usize>(
series: &[Array2<f64>],
k: usize,
noise_level: f64,
) -> KozachenkoLeonenkoMutualInformation2<D_JOINT, D1, D2> {
KozachenkoLeonenkoMutualInformation2::new(series, k, noise_level)
}
pub fn new_cmi_kl(
series: &[Array1<f64>],
cond: &Array1<f64>,
k: usize,
noise_level: f64,
) -> KozachenkoLeonenkoConditionalMutualInformation<1, 1, 1, 3, 2, 2> {
let series_2d: Vec<Array2<f64>> = series
.iter()
.map(|s| s.clone().insert_axis(Axis(1)))
.collect();
let cond_2d = cond.clone().insert_axis(Axis(1));
KozachenkoLeonenkoConditionalMutualInformation::new(&series_2d, &cond_2d, k, noise_level)
}
pub fn nd_cmi_kl<
const D1: usize,
const D2: usize,
const DZ: usize,
const D_JOINT: usize,
const D1Z: usize,
const D2Z: usize,
>(
series: &[Array2<f64>],
cond: &Array2<f64>,
k: usize,
noise_level: f64,
) -> KozachenkoLeonenkoConditionalMutualInformation<D1, D2, DZ, D_JOINT, D1Z, D2Z> {
KozachenkoLeonenkoConditionalMutualInformation::new(series, cond, k, noise_level)
}
}