Sun, 27 Apr 2025 15:03:20 -0500
Start work on 3.0.0
| 0 | 1 | /*! |
| 2 | Fourier transform traits | |
| 3 | */ | |
| 4 | ||
| 5 | use alg_tools::types::{Num, Float}; | |
| 35 | 6 | use alg_tools::mapping::{RealMapping, Mapping, Space}; |
| 0 | 7 | use alg_tools::bisection_tree::Weighted; |
| 8 | use alg_tools::loc::Loc; | |
| 9 | ||
| 10 | /// Trait for Fourier transforms. When F is a non-complex number, the transform | |
| 11 | /// also has to be non-complex, i.e., the function itself symmetric. | |
| 12 | pub trait Fourier<F : Num> : Mapping<Self::Domain, Codomain=F> { | |
| 35 | 13 | type Domain : Space; |
| 0 | 14 | type Transformed : Mapping<Self::Domain, Codomain=F>; |
| 15 | ||
| 16 | fn fourier(&self) -> Self::Transformed; | |
| 17 | } | |
| 18 | ||
| 19 | impl<F : Float, T, const N : usize> Fourier<F> | |
| 20 | for Weighted<T, F> | |
| 21 | where T : Fourier<F, Domain = Loc<F, N>> + RealMapping<F, N> { | |
| 22 | type Domain = T::Domain; | |
| 23 | type Transformed = Weighted<T::Transformed, F>; | |
| 24 | ||
| 25 | #[inline] | |
| 26 | fn fourier(&self) -> Self::Transformed { | |
| 27 | Weighted { | |
| 28 | base_fn : self.base_fn.fourier(), | |
| 29 | weight : self.weight | |
| 30 | } | |
| 31 | } | |
| 32 | } |