use wasm_bindgen::prelude::*; use rand::Rng; use rand::thread_rng; use kernel_density::kde; use serde::Serialize; use crate::distribution::bandwidth::{nrd0, nrd}; // TODO: impl a constructor such that xs.len() == ys.len(). #[wasm_bindgen] #[derive(Serialize)] pub struct PdfCurve { xs: Vec, ys: Vec, } pub fn samples_to_continuous_pdf(samples: Vec, bandwidth: f64) -> JsValue { let samples_to_map = samples.clone(); let pdf = kde::normal(&samples, bandwidth); let pdf_curve = PdfCurve { xs: samples, ys: samples_to_map.iter().map(|x| pdf.density(*x)).collect(), }; JsValue::from_serde::(&pdf_curve).unwrap() } // pub fn get_curve(samples: Vec, n: u64) -> Vec { // let bandwidth = nrd(&samples); // let curve = samples_to_continuous_pdf(samples, bandwidth); // return curve.ys; // } pub fn sample_n(xs: Vec, n: i32) -> Vec { let m = xs.len(); let mut output = vec![]; for _ in 0..n { output.push(xs[thread_rng().gen_range(0..m)]) } return output; }