#[cfg(feature = "accelerate")]
mod accelerate;
mod core;
#[cfg(feature = "cuda-native")]
mod cuda_native;
#[cfg(feature = "gpu")]
mod gpu;
#[cfg(feature = "metal")]
mod metal;
#[cfg(feature = "python")]
mod python;
pub use core::Fgn;
#[cfg(any(
feature = "gpu",
feature = "cuda-native",
feature = "accelerate",
feature = "metal"
))]
use anyhow::Result;
#[cfg(any(
feature = "gpu",
feature = "cuda-native",
feature = "accelerate",
feature = "metal"
))]
use either::Either;
use ndarray::Array1;
#[cfg(any(
feature = "gpu",
feature = "cuda-native",
feature = "accelerate",
feature = "metal"
))]
use ndarray::Array2;
#[cfg(feature = "python")]
pub use python::PyFgn;
use stochastic_rs_core::simd_rng::SeedExt;
use crate::traits::FloatExt;
use crate::traits::ProcessExt;
impl<T: FloatExt, S: SeedExt> Fgn<T, S> {
pub fn sample_pair(&self) -> (Array1<T>, Array1<T>) {
self.sample_pair_cpu()
}
pub fn sample_pair_with_seed(&self, seed: u64) -> (Array1<T>, Array1<T>) {
self.sample_pair_cpu_with_seed(seed)
}
}
impl<T: FloatExt, S: SeedExt> ProcessExt<T> for Fgn<T, S> {
type Output = Array1<T>;
fn sample(&self) -> Self::Output {
self.sample_cpu()
}
#[cfg(feature = "gpu")]
fn sample_gpu(&self, m: usize) -> Result<Either<Array1<T>, Array2<T>>> {
self.sample_gpu_impl(m)
}
#[cfg(feature = "cuda-native")]
fn sample_cuda_native(&self, m: usize) -> Result<Either<Array1<T>, Array2<T>>> {
self.sample_cuda_native_impl(m)
}
#[cfg(feature = "accelerate")]
fn sample_accelerate(&self, m: usize) -> Result<Either<Array1<T>, Array2<T>>> {
self.sample_accelerate_impl(m)
}
#[cfg(feature = "metal")]
fn sample_metal(&self, m: usize) -> Result<Either<Array1<T>, Array2<T>>> {
self.sample_metal_impl(m)
}
}