use rand::Rng;
pub trait MultiDistribution<T> {
fn sample_len(&self) -> usize;
fn sample_to_slice<R: Rng + ?Sized>(&self, rng: &mut R, output: &mut [T]);
}
pub trait ConstMultiDistribution<T>: MultiDistribution<T> {
const SAMPLE_LEN: usize;
}
macro_rules! distribution_impl {
($scalar:ident) => {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Vec<$scalar> {
use crate::multi::MultiDistribution;
let mut buf = vec![Default::default(); self.sample_len()];
self.sample_to_slice(rng, &mut buf);
buf
}
};
}
#[allow(unused)]
macro_rules! const_distribution_impl {
($scalar:ident) => {
fn sample<R: Rng + ?Sized>(
&self,
rng: &mut R,
) -> [$scalar; <Self as crate::multi::MultiDistribution>::SAMPLE_LEN] {
use crate::multi::MultiDistribution;
let mut buf =
[Default::default(); <Self as crate::multi::MultiDistribution>::SAMPLE_LEN];
self.sample_to_slice(rng, &mut buf);
buf
}
};
}
pub use dirichlet::Dirichlet;
mod dirichlet;