algebra/module/homomorphism/
generic_zero_homomorphism.rs

1use std::sync::Arc;
2
3use fp::vector::FpSliceMut;
4
5use crate::module::{
6    Module,
7    homomorphism::{ModuleHomomorphism, ZeroHomomorphism},
8};
9
10pub struct GenericZeroHomomorphism<S: Module, T: Module<Algebra = S::Algebra>> {
11    source: Arc<S>,
12    target: Arc<T>,
13    degree_shift: i32,
14}
15
16impl<S: Module, T: Module<Algebra = S::Algebra>> GenericZeroHomomorphism<S, T> {
17    pub fn new(source: Arc<S>, target: Arc<T>, degree_shift: i32) -> Self {
18        Self {
19            source,
20            target,
21            degree_shift,
22        }
23    }
24}
25
26impl<S: Module, T: Module<Algebra = S::Algebra>> ModuleHomomorphism
27    for GenericZeroHomomorphism<S, T>
28{
29    type Source = S;
30    type Target = T;
31
32    fn source(&self) -> Arc<Self::Source> {
33        Arc::clone(&self.source)
34    }
35
36    fn target(&self) -> Arc<Self::Target> {
37        Arc::clone(&self.target)
38    }
39
40    fn degree_shift(&self) -> i32 {
41        self.degree_shift
42    }
43
44    fn apply_to_basis_element(&self, _: FpSliceMut, _: u32, _: i32, _: usize) {}
45}
46
47impl<S: Module, T: Module<Algebra = S::Algebra>> ZeroHomomorphism<S, T>
48    for GenericZeroHomomorphism<S, T>
49{
50    fn zero_homomorphism(source: Arc<S>, target: Arc<T>, degree_shift: i32) -> Self {
51        Self::new(source, target, degree_shift)
52    }
53}