use super::quadrature::gauss_hermite;
use crate::rho::RhoFunction;
pub fn expect_psi_squared(rho: &dyn RhoFunction, quad_points: usize) -> f64 {
let (nodes, weights) = gauss_hermite(quad_points);
nodes
.iter()
.zip(&weights)
.map(|(&x, &w)| {
let psi = rho.psi(x);
w * psi * psi
})
.sum()
}
pub fn expect_psi_prime(rho: &dyn RhoFunction, quad_points: usize) -> f64 {
let (nodes, weights) = gauss_hermite(quad_points);
nodes
.iter()
.zip(&weights)
.map(|(&x, &w)| w * x * rho.psi(x))
.sum()
}
pub fn asymptotic_variance(rho: &dyn RhoFunction, quad_points: usize) -> f64 {
let (nodes, weights) = gauss_hermite(quad_points);
let mut e_psi2 = 0.0;
let mut e_psip = 0.0; for (&x, &w) in nodes.iter().zip(&weights) {
let psi = rho.psi(x);
e_psi2 += w * psi * psi;
e_psip += w * x * psi;
}
e_psi2 / (e_psip * e_psip)
}