1use statrs::distribution::{Beta, ContinuousCDF};
2
3use crate::{FibQuantError, Result};
4
5pub fn beta_inv(q: f64, alpha: f64, beta: f64) -> Result<f64> {
7 if !(0.0..=1.0).contains(&q)
8 || !alpha.is_finite()
9 || !beta.is_finite()
10 || alpha <= 0.0
11 || beta <= 0.0
12 {
13 return Err(FibQuantError::NumericalFailure(format!(
14 "invalid beta inverse inputs q={q}, alpha={alpha}, beta={beta}"
15 )));
16 }
17 let dist = Beta::new(alpha, beta)
18 .map_err(|err| FibQuantError::NumericalFailure(format!("beta distribution: {err}")))?;
19 Ok(dist.inverse_cdf(q).clamp(0.0, 1.0))
20}