src/fourier.rs

Thu, 26 Feb 2026 13:05:07 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Thu, 26 Feb 2026 13:05:07 -0500
branch
dev
changeset 66
fe47ad484deb
parent 61
4f468d35fa29
permissions
-rw-r--r--

Allow fitness merge when forward_pdps and sliding_pdps are used as forward-backward with aux variable.

/*!
Fourier transform traits
*/

use alg_tools::bisection_tree::Weighted;
use alg_tools::loc::Loc;
use alg_tools::mapping::{Mapping, RealMapping, Space};
use alg_tools::types::{Float, Num};

/// 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: Space;
    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<N, F>> + RealMapping<N, F>,
{
    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