haar_lib/algebra/act/
affine_sum.rs

1//! Range Affine Range Sum
2use 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/// Range Affine Range Sum 用のモノイド作用
9#[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}