src/domain.rs

changeset 89
8d1c959432c8
child 93
8f1e57821d76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/domain.rs	Tue Aug 04 14:12:18 2026 -0500
@@ -0,0 +1,46 @@
+/*!
+Definition of an admissible domain.
+*/
+
+use alg_tools::instance::{Instance, Space};
+use alg_tools::loc::Loc;
+use alg_tools::sets::{Cube, Set};
+use alg_tools::types::Num;
+use rand::distr::Uniform;
+use rand::prelude::{Rng, StdRng};
+
+/// Admissible domain
+pub trait AdmissibleDomain<Point: Space>: Set<Point> {
+    // Generate a random point in the domain
+    fn random_point(&mut self) -> Option<Point> {
+        None
+    }
+}
+
+impl<F: Num + PartialOrd + Sized, const N: usize> AdmissibleDomain<Loc<N, F>> for Cube<N, F> {}
+
+///
+pub struct FullSpace;
+
+impl<A: Space> Set<A> for FullSpace {
+    fn contains<I: Instance<A>>(&self, _: I) -> bool {
+        true
+    }
+}
+
+impl<F: Num + PartialOrd + Sized, const N: usize> AdmissibleDomain<Loc<N, F>> for FullSpace {}
+
+pub struct UniformRandom<S, R: Rng = StdRng>(pub S, pub R);
+
+impl<A: Space, S: Set<A>, R: Rng> Set<A> for UniformRandom<S, R> {
+    fn contains<I: Instance<A>>(&self, item: I) -> bool {
+        self.0.contains(item)
+    }
+}
+
+impl<const N: usize, R: Rng> AdmissibleDomain<Loc<N, f64>> for UniformRandom<Cube<N, f64>, R> {
+    fn random_point(&mut self) -> Option<Loc<N, f64>> {
+        let UniformRandom(ref cube, ref mut rng) = *self;
+        Some(Loc(cube.map(|a, b| rng.sample(Uniform::new(a, b).unwrap()))))
+    }
+}

mercurial