src/fourier.rs

changeset 0
eb3c7813b67a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/fourier.rs	Thu Dec 01 23:07:35 2022 +0200
@@ -0,0 +1,32 @@
+/*!
+Fourier transform traits
+*/
+
+use alg_tools::types::{Num, Float};
+use alg_tools::mapping::{RealMapping, Mapping};
+use alg_tools::bisection_tree::Weighted;
+use alg_tools::loc::Loc;
+
+/// Trait for Fourier transforms. When F is a non-complex number, the transform
+/// also has to be non-complex, i.e., the function itself symmetric.
+pub trait Fourier<F : Num> : Mapping<Self::Domain, Codomain=F> {
+    type Domain;
+    type Transformed : Mapping<Self::Domain, Codomain=F>;
+
+    fn fourier(&self) -> Self::Transformed;
+}
+
+impl<F : Float, T, const N : usize> Fourier<F>
+for Weighted<T, F>
+where T : Fourier<F, Domain = Loc<F, N>> + RealMapping<F, N> {
+    type Domain = T::Domain;
+    type Transformed = Weighted<T::Transformed, F>;
+
+    #[inline]
+    fn fourier(&self) -> Self::Transformed {
+        Weighted {
+            base_fn : self.base_fn.fourier(),
+            weight : self.weight
+        }
+    }
+}

mercurial