use crate::core::Sampler;
use crate::types::DataMatrix;
use rand::SeedableRng;
use rand::distr::Distribution;
use rand::distr::weighted::WeightedIndex;
pub struct ImportanceSampler {
dist: WeightedIndex<f64>,
rng: rand::rngs::StdRng,
}
impl ImportanceSampler {
pub fn from_probabilities_with_seed(probabilities: &[f64], seed: u64) -> Self {
let dist =
WeightedIndex::new(probabilities).expect("ImportanceSampler: invalid weight vector");
let rng = rand::rngs::StdRng::seed_from_u64(seed);
Self { dist, rng }
}
pub fn from_probabilities(probabilities: &[f64]) -> Self {
let dist =
WeightedIndex::new(probabilities).expect("ImportanceSampler: invalid weight vector");
let mut entropy_rng = rand::rng();
let rng = rand::rngs::StdRng::from_rng(&mut entropy_rng);
Self { dist, rng }
}
}
impl Sampler for ImportanceSampler {
fn sample(&mut self, data: &DataMatrix, sample_size: usize, out_indices: &mut [usize]) -> bool {
let n = data.nrows();
if sample_size == 0 || n == 0 || out_indices.len() < sample_size {
return false;
}
for dst in &mut out_indices[..sample_size] {
let idx = self.dist.sample(&mut self.rng);
*dst = idx;
}
true
}
fn update(
&mut self,
_sample: &[usize],
_sample_size: usize,
_iteration: usize,
_score_hint: f64,
) {
}
}