use nalgebra::{Vector2, U2};
use num_traits::Pow;
use rand::{Rng, RngCore};
use bayes_estimate::estimators::sir;
use bayes_estimate::estimators::sir::SampleStateDraw;
use bayes_estimate::models::Estimator;
use sir::SampleState;
fn main() {
let mut rng = rand::rng();
type N = f64;
let range1000 = rand_distr::Uniform::new(0., 1000.).unwrap();
let mut samples: sir::Samples<N, U2> = vec![];
for _i in 0..10000 {
samples.push(Vector2::new(rng.sample(range1000), rng.sample(range1000)))
}
let mut estimate = SampleState::equal_likelihood_samples(samples);
let in_circle = |state: &Vector2<N>| {
let dist2: N = (state[0] - 100.).pow(2) + (state[1] - 100.).pow(2);
if dist2.sqrt() <= 50. {
1.
} else {
0.
}
};
estimate.observe(in_circle);
let mut roughener = |s: &mut sir::Samples<N, U2>, rng: &mut dyn RngCore| sir::roughen_minmax(s, 1., rng);
let mut draw = SampleStateDraw { state: estimate, rng: &mut rng };
draw
.update_resample(&mut sir::standard_resampler, &mut roughener)
.unwrap();
println!("{}", draw.state.state().unwrap());
let range20 = rand_distr::Uniform::new(-10., 10.).unwrap();
draw.predict_sampled(|s: &Vector2<N>, rng: &mut dyn RngCore| {
s + Vector2::new(100. + rng.sample(range20), 50. + rng.sample(range20))
});
println!("{}", draw.state.state().unwrap());
}