# HG changeset patch # User Tuomo Valkonen # Date 1731203672 18000 # Node ID 3f3e00e817552e9b7c28481ea2c7b279370104b7 # Parent a0db98c16ab58e1e1da2fe5451a970ec5a90dff1 Some Differential GATs diff -r a0db98c16ab5 -r 3f3e00e81755 src/mapping.rs --- a/src/mapping.rs Sat Nov 09 20:36:23 2024 -0500 +++ b/src/mapping.rs Sat Nov 09 20:54:32 2024 -0500 @@ -3,7 +3,7 @@ */ use std::marker::PhantomData; -use crate::types::{Float}; +use crate::types::Float; use serde::Serialize; use crate::loc::Loc; @@ -52,10 +52,10 @@ /// Automatically implemented shorthand for referring to differentiable [`Mapping`]s from /// [`Loc`] to `F`. pub trait DifferentiableRealMapping -: DifferentiableMapping, Codomain = F, Differential=Loc> {} +: DifferentiableMapping, Codomain = F, DerivativeDomain=Loc> {} impl DifferentiableRealMapping for T -where T : DifferentiableMapping, Codomain = F, Differential=Loc> {} +where T : DifferentiableMapping, Codomain = F, DerivativeDomain=Loc> {} /// A helper trait alias for referring to [`Mapping`]s from [`Loc`] to [`Loc`]. @@ -80,29 +80,38 @@ /// This is automatically implemented when the relevant [`Differentiate`] are implemented. pub trait DifferentiableMapping : Mapping - + Differentiable - + for<'a> Differentiable<&'a Domain, Derivative=Self::Differential> { - type Differential; + + Differentiable + + for<'a> Differentiable<&'a Domain, Derivative=Self::DerivativeDomain> { + type DerivativeDomain; + type Differential : Mapping; + type DifferentialRef<'b> : Mapping where Self : 'b; /// Form the differential mapping of `self`. - fn diff(self) -> Differential { + fn diff(self) -> Self::Differential; + /// Form the differential mapping of `self`. + fn diff_ref(&self) -> Self::DifferentialRef<'_>; +} + + +impl DifferentiableMapping for T +where T : Mapping + + Differentiable + + for<'a> Differentiable<&'a Domain,Derivative=Derivative> { + type DerivativeDomain = Derivative; + type Differential = Differential; + type DifferentialRef<'b> = Differential> where Self : 'b; + + /// Form the differential mapping of `self`. + fn diff(self) -> Self::Differential { Differential{ g : self, _space : PhantomData } } /// Form the differential mapping of `self`. - fn diff_ref(&self) -> Differential> { + fn diff_ref(&self) -> Self::DifferentialRef<'_> { Differential{ g : Ref(self), _space : PhantomData } } } - -impl DifferentiableMapping for T -where T : Mapping - + Differentiable - + for<'a> Differentiable<&'a Domain, Derivative=Differential> { - type Differential = Differential; -} - /// A sum of [`Mapping`]s. #[derive(Serialize, Debug, Clone)] pub struct Sum> { @@ -146,10 +155,10 @@ impl Differentiable for Sum where M : DifferentiableMapping, M :: Codomain : std::iter::Sum, - M :: Differential : std::iter::Sum, + M :: DerivativeDomain : std::iter::Sum, Domain : Copy { - type Derivative = M::Differential; + type Derivative = M::DerivativeDomain; fn differential(&self, x : Domain) -> Self::Derivative { self.components.iter().map(|c| c.differential(x)).sum() @@ -163,19 +172,19 @@ } impl> Apply for Differential { - type Output = G::Differential; + type Output = G::DerivativeDomain; #[inline] - fn apply(&self, x : X) -> G::Differential { + fn apply(&self, x : X) -> Self::Output { self.g.differential(x) } } impl<'a, X, G : DifferentiableMapping> Apply<&'a X> for Differential { - type Output = G::Differential; + type Output = G::DerivativeDomain; #[inline] - fn apply(&self, x : &'a X) -> G::Differential { + fn apply(&self, x : &'a X) -> Self::Output { self.g.differential(x) } }