--- /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())))) + } +}