haar_lib/algebra/act/
affine_sum.rs1use crate::algebra::affine::Composition;
3use crate::algebra::dual::Dual;
4use crate::algebra::semiring::Semiring;
5pub use crate::algebra::{act::Act, traits::*};
6use crate::math::linear::Linear;
7
8#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
10pub struct AffineSum<S: Semiring>(pub Dual<Composition<S>>);
11
12impl<T, S, M> Act<M> for AffineSum<S>
13where
14 M: Monoid<Element = T> + Additive,
15 S: Semiring<Element = T>,
16 Dual<Composition<S>>: Monoid<Element = Linear<T>>,
17{
18 type Monoid = Dual<Composition<S>>;
19 type Element = Linear<T>;
20
21 fn monoid(&self) -> &Self::Monoid {
22 &self.0
23 }
24 fn act(&self, m: &M, val: M::Element, a: Self::Element, len: usize) -> M::Element {
25 let Self(Dual(Composition(ref s))) = &self;
26 let Linear { a, b } = a;
27 s.add(s.mul(a, val), Additive::times(m, b, len as u64))
28 }
29}