#[cfg(feature = "gpu")]
use infomeasure::estimators::LocalValues;
#[cfg(feature = "gpu")]
use infomeasure::estimators::mutual_information::MutualInformation;
#[cfg(feature = "gpu")]
use infomeasure::estimators::transfer_entropy::TransferEntropy;
#[cfg(feature = "gpu")]
use ndarray::Array1;
#[cfg(feature = "gpu")]
use rand::rngs::StdRng;
#[cfg(feature = "gpu")]
use rand::{Rng, SeedableRng};
#[cfg(feature = "gpu")]
use rstest::rstest;
#[rstest]
#[cfg(feature = "gpu")]
fn test_kernel_mi_gpu_parity(#[values("box", "gaussian")] kernel_type: &str) {
let seed = 42;
let mut rng = StdRng::seed_from_u64(seed);
let size = 2500; let bandwidth = 1.0;
let x: Vec<f64> = (0..size).map(|_| rng.gen_range(0.0..10.0)).collect();
let y: Vec<f64> = (0..size).map(|_| rng.gen_range(0.0..10.0)).collect();
let x_arr = Array1::from(x.clone());
let y_arr = Array1::from(y.clone());
let rust_est = MutualInformation::new_kernel_with_type(
&[x_arr.clone(), y_arr.clone()],
kernel_type.to_string(),
bandwidth,
);
let local_gpu = rust_est.local_values();
assert!(local_gpu.iter().all(|&v| !v.is_nan()));
}
#[rstest]
#[cfg(feature = "gpu")]
fn test_kernel_te_gpu_parity(#[values("box", "gaussian")] kernel_type: &str) {
let seed = 44;
let mut rng = StdRng::seed_from_u64(seed);
let size = 2500;
let bandwidth = 1.0;
let src: Vec<f64> = (0..size).map(|_| rng.gen_range(0.0..10.0)).collect();
let dst: Vec<f64> = (0..size).map(|_| rng.gen_range(0.0..10.0)).collect();
let src_arr = Array1::from(src.clone());
let dst_arr = Array1::from(dst.clone());
let rust_est = TransferEntropy::new_kernel_with_type(
&src_arr,
&dst_arr,
1,
1,
1,
kernel_type.to_string(),
bandwidth,
);
let local_gpu = rust_est.local_values();
assert!(local_gpu.iter().all(|&v| !v.is_nan()));
}