src/domain.rs

changeset 89
8d1c959432c8
child 93
8f1e57821d76
equal deleted inserted replaced
88:51dbb2cc25d9 89:8d1c959432c8
1 /*!
2 Definition of an admissible domain.
3 */
4
5 use alg_tools::instance::{Instance, Space};
6 use alg_tools::loc::Loc;
7 use alg_tools::sets::{Cube, Set};
8 use alg_tools::types::Num;
9 use rand::distr::Uniform;
10 use rand::prelude::{Rng, StdRng};
11
12 /// Admissible domain
13 pub trait AdmissibleDomain<Point: Space>: Set<Point> {
14 // Generate a random point in the domain
15 fn random_point(&mut self) -> Option<Point> {
16 None
17 }
18 }
19
20 impl<F: Num + PartialOrd + Sized, const N: usize> AdmissibleDomain<Loc<N, F>> for Cube<N, F> {}
21
22 ///
23 pub struct FullSpace;
24
25 impl<A: Space> Set<A> for FullSpace {
26 fn contains<I: Instance<A>>(&self, _: I) -> bool {
27 true
28 }
29 }
30
31 impl<F: Num + PartialOrd + Sized, const N: usize> AdmissibleDomain<Loc<N, F>> for FullSpace {}
32
33 pub struct UniformRandom<S, R: Rng = StdRng>(pub S, pub R);
34
35 impl<A: Space, S: Set<A>, R: Rng> Set<A> for UniformRandom<S, R> {
36 fn contains<I: Instance<A>>(&self, item: I) -> bool {
37 self.0.contains(item)
38 }
39 }
40
41 impl<const N: usize, R: Rng> AdmissibleDomain<Loc<N, f64>> for UniformRandom<Cube<N, f64>, R> {
42 fn random_point(&mut self) -> Option<Loc<N, f64>> {
43 let UniformRandom(ref cube, ref mut rng) = *self;
44 Some(Loc(cube.map(|a, b| rng.sample(Uniform::new(a, b).unwrap()))))
45 }
46 }

mercurial