qudit_inst/numerical/initializers/
uniform.rs1use 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}