qudit_inst/numerical/initializers/
uniform.rs

1use super::super::InitialGuessGenerator;
2use qudit_core::RealScalar;
3use rand::Rng;
4use rand::distr::Uniform as RandUniform;
5
6#[derive(Clone)]
7pub struct Uniform<R: RealScalar> {
8    lower_bound: R,
9    upper_bound: R,
10    _phantom: std::marker::PhantomData<R>,
11}
12
13impl<R: RealScalar> Uniform<R> {
14    pub fn new(lower_bound: R, upper_bound: R) -> Self {
15        if lower_bound > upper_bound {
16            panic!("Lower bound cannot be larger than upper bound.");
17        }
18        Self {
19            lower_bound,
20            upper_bound,
21            _phantom: std::marker::PhantomData,
22        }
23    }
24}
25
26impl<R: RealScalar> Default for Uniform<R> {
27    fn default() -> Self {
28        Self::new(
29            R::from64(-std::f64::consts::PI),
30            R::from64(std::f64::consts::PI),
31        )
32    }
33}
34
35impl<R: RealScalar> InitialGuessGenerator<R> for Uniform<R> {
36    fn generate(&self, num_params: usize) -> Vec<R> {
37        let mut rng = rand::rng();
38        let distribution =
39            RandUniform::new(self.lower_bound.to64(), self.upper_bound.to64()).unwrap();
40
41        (0..num_params)
42            .map(|_| R::from64(rng.sample(distribution)))
43            .collect()
44    }
45}