src/domain.rs

Tue, 04 Aug 2026 14:12:18 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 04 Aug 2026 14:12:18 -0500
changeset 89
8d1c959432c8
child 93
8f1e57821d76
permissions
-rw-r--r--

Add AdmissibleDomain

/*!
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