diff -r 495448cca603 -r 6aa955ad8122 src/bisection_tree/support.rs --- a/src/bisection_tree/support.rs Thu May 01 08:40:33 2025 -0500 +++ b/src/bisection_tree/support.rs Thu May 01 13:06:58 2025 -0500 @@ -16,14 +16,14 @@ /// A trait for working with the supports of [`Mapping`]s. /// /// `Mapping` is not a super-trait to allow more general use. -pub trait Support: Sized + Sync + Send + 'static { +pub trait Support: Sized + Sync + Send + 'static { /// Return a cube containing the support of the function represented by `self`. /// /// The hint may be larger than the actual support, but must contain it. - fn support_hint(&self) -> Cube; + fn support_hint(&self) -> Cube; /// Indicate whether `x` is in the support of the function represented by `self`. - fn in_support(&self, x: &Loc) -> bool; + fn in_support(&self, x: &Loc) -> bool; // Indicate whether `cube` is fully in the support of the function represented by `self`. //fn fully_in_support(&self, cube : &Cube) -> bool; @@ -39,13 +39,13 @@ /// The default implementation returns `[None; N]`. #[inline] #[allow(unused_variables)] - fn bisection_hint(&self, cube: &Cube) -> [Option; N] { + fn bisection_hint(&self, cube: &Cube) -> [Option; N] { [None; N] } /// Translate `self` by `x`. #[inline] - fn shift(self, x: Loc) -> Shift { + fn shift(self, x: Loc) -> Shift { Shift { shift: x, base_fn: self, @@ -55,46 +55,46 @@ /// Shift of [`Support`] and [`Mapping`]; output of [`Support::shift`]. #[derive(Copy, Clone, Debug, Serialize)] // Serialize! but not implemented by Loc. -pub struct Shift { - shift: Loc, +pub struct Shift { + shift: Loc, base_fn: T, } -impl<'a, T, V: Space, F: Float, const N: usize> Mapping> for Shift +impl<'a, T, V: Space, F: Float, const N: usize> Mapping> for Shift where - T: Mapping, Codomain = V>, + T: Mapping, Codomain = V>, { type Codomain = V; #[inline] - fn apply>>(&self, x: I) -> Self::Codomain { + fn apply>>(&self, x: I) -> Self::Codomain { self.base_fn.apply(x.own() - &self.shift) } } -impl<'a, T, V: Space, F: Float, const N: usize> DifferentiableImpl> for Shift +impl<'a, T, V: Space, F: Float, const N: usize> DifferentiableImpl> for Shift where - T: DifferentiableMapping, DerivativeDomain = V>, + T: DifferentiableMapping, DerivativeDomain = V>, { type Derivative = V; #[inline] - fn differential_impl>>(&self, x: I) -> Self::Derivative { + fn differential_impl>>(&self, x: I) -> Self::Derivative { self.base_fn.differential(x.own() - &self.shift) } } -impl<'a, T, F: Float, const N: usize> Support for Shift +impl<'a, T, F: Float, const N: usize> Support for Shift where - T: Support, + T: Support, { #[inline] - fn support_hint(&self) -> Cube { + fn support_hint(&self) -> Cube { self.base_fn.support_hint().shift(&self.shift) } #[inline] - fn in_support(&self, x: &Loc) -> bool { + fn in_support(&self, x: &Loc) -> bool { self.base_fn.in_support(&(x - &self.shift)) } @@ -104,13 +104,13 @@ // } #[inline] - fn bisection_hint(&self, cube: &Cube) -> [Option; N] { + fn bisection_hint(&self, cube: &Cube) -> [Option; N] { let base_hint = self.base_fn.bisection_hint(cube); map2(base_hint, &self.shift, |h, s| h.map(|z| z + *s)) } } -impl<'a, T, F: Float, const N: usize> GlobalAnalysis> for Shift +impl<'a, T, F: Float, const N: usize> GlobalAnalysis> for Shift where T: LocalAnalysis, N>, { @@ -120,20 +120,20 @@ } } -impl<'a, T, F: Float, const N: usize> LocalAnalysis, N> for Shift +impl<'a, T, F: Float, const N: usize> LocalAnalysis, N> for Shift where T: LocalAnalysis, N>, { #[inline] - fn local_analysis(&self, cube: &Cube) -> Bounds { + fn local_analysis(&self, cube: &Cube) -> Bounds { self.base_fn.local_analysis(&cube.shift(&(-self.shift))) } } macro_rules! impl_shift_norm { ($($norm:ident)*) => { $( - impl<'a, T, F : Float, const N : usize> Norm for Shift - where T : Norm { + impl<'a, T, F : Float, const N : usize> Norm<$norm, F> for Shift + where T : Norm<$norm, F> { #[inline] fn norm(&self, n : $norm) -> F { self.base_fn.norm(n) @@ -144,18 +144,18 @@ impl_shift_norm!(L1 L2 Linfinity); -impl<'a, T, F: Float, C, const N: usize> Support for Weighted +impl<'a, T, F: Float, C, const N: usize> Support for Weighted where - T: Support, + T: Support, C: Constant, { #[inline] - fn support_hint(&self) -> Cube { + fn support_hint(&self) -> Cube { self.base_fn.support_hint() } #[inline] - fn in_support(&self, x: &Loc) -> bool { + fn in_support(&self, x: &Loc) -> bool { self.base_fn.in_support(x) } @@ -164,7 +164,7 @@ // } #[inline] - fn bisection_hint(&self, cube: &Cube) -> [Option; N] { + fn bisection_hint(&self, cube: &Cube) -> [Option; N] { self.base_fn.bisection_hint(cube) } } @@ -191,7 +191,7 @@ C: Constant, { #[inline] - fn local_analysis(&self, cube: &Cube) -> Bounds { + fn local_analysis(&self, cube: &Cube) -> Bounds { let Bounds(lower, upper) = self.base_fn.local_analysis(cube); debug_assert!(lower <= upper); match self.weight.value() { @@ -240,8 +240,8 @@ macro_rules! impl_weighted_norm { ($($norm:ident)*) => { $( - impl<'a, T, F : Float> Norm for Weighted - where T : Norm { + impl<'a, T, F : Float> Norm<$norm, F> for Weighted + where T : Norm<$norm, F> { #[inline] fn norm(&self, n : $norm) -> F { self.base_fn.norm(n) * self.weight.abs() @@ -261,14 +261,14 @@ pub T, ); -impl<'a, T, F: Float, const N: usize> Mapping> for Normalised +impl<'a, T, F: Float, const N: usize> Mapping> for Normalised where - T: Norm + Mapping, Codomain = F>, + T: Norm + Mapping, Codomain = F>, { type Codomain = F; #[inline] - fn apply>>(&self, x: I) -> Self::Codomain { + fn apply>>(&self, x: I) -> Self::Codomain { let w = self.0.norm(L1); if w == F::ZERO { F::ZERO @@ -278,17 +278,17 @@ } } -impl<'a, T, F: Float, const N: usize> Support for Normalised +impl<'a, T, F: Float, const N: usize> Support for Normalised where - T: Norm + Support, + T: Norm + Support, { #[inline] - fn support_hint(&self) -> Cube { + fn support_hint(&self) -> Cube { self.0.support_hint() } #[inline] - fn in_support(&self, x: &Loc) -> bool { + fn in_support(&self, x: &Loc) -> bool { self.0.in_support(x) } @@ -297,14 +297,14 @@ // } #[inline] - fn bisection_hint(&self, cube: &Cube) -> [Option; N] { + fn bisection_hint(&self, cube: &Cube) -> [Option; N] { self.0.bisection_hint(cube) } } impl<'a, T, F: Float> GlobalAnalysis> for Normalised where - T: Norm + GlobalAnalysis>, + T: Norm + GlobalAnalysis>, { #[inline] fn global_analysis(&self) -> Bounds { @@ -318,10 +318,10 @@ impl<'a, T, F: Float, const N: usize> LocalAnalysis, N> for Normalised where - T: Norm + LocalAnalysis, N>, + T: Norm + LocalAnalysis, N>, { #[inline] - fn local_analysis(&self, cube: &Cube) -> Bounds { + fn local_analysis(&self, cube: &Cube) -> Bounds { let Bounds(lower, upper) = self.0.local_analysis(cube); debug_assert!(lower <= upper); let w = self.0.norm(L1); @@ -330,9 +330,9 @@ } } -impl<'a, T, F: Float> Norm for Normalised +impl<'a, T, F: Float> Norm for Normalised where - T: Norm, + T: Norm, { #[inline] fn norm(&self, _: L1) -> F { @@ -347,8 +347,8 @@ macro_rules! impl_normalised_norm { ($($norm:ident)*) => { $( - impl<'a, T, F : Float> Norm for Normalised - where T : Norm + Norm { + impl<'a, T, F : Float> Norm<$norm, F> for Normalised + where T : Norm<$norm, F> + Norm { #[inline] fn norm(&self, n : $norm) -> F { let w = self.0.norm(L1); @@ -361,26 +361,26 @@ impl_normalised_norm!(L2 Linfinity); /* -impl, const N : usize> LocalAnalysis for S { - fn local_analysis(&self, _cube : &Cube) -> NullAggregator { NullAggregator } +impl, const N : usize> LocalAnalysis for S { + fn local_analysis(&self, _cube : &Cube) -> NullAggregator { NullAggregator } } impl, const N : usize> LocalAnalysis, N> for S { #[inline] - fn local_analysis(&self, cube : &Cube) -> Bounds { + fn local_analysis(&self, cube : &Cube) -> Bounds { self.bounds(cube) } }*/ /// Generator of [`Support`]-implementing component functions based on low storage requirement /// [ids][`Self::Id`]. -pub trait SupportGenerator: +pub trait SupportGenerator: MulAssign + DivAssign + Neg + Clone + Sync + Send + 'static { /// The identification type type Id: 'static + Copy; /// The type of the [`Support`] (often also a [`Mapping`]). - type SupportType: 'static + Support; + type SupportType: 'static + Support; /// An iterator over all the [`Support`]s of the generator. type AllDataIter<'a>: Iterator where