arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-hal/src/oep/convolution.rs
poulpy-hal/src/oep/convolution.rsRaw
  1use crate::layouts::{
  2    Backend, CnvPVecL, CnvPVecLToMut, CnvPVecLToRef, CnvPVecR, CnvPVecRToMut, CnvPVecRToRef, Module, Scratch, VecZnxBigToMut,
  3    VecZnxDftToMut, VecZnxToRef, ZnxInfos,
  4};
  5
  6/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
  7/// * See the TODO reference implementation.
  8/// * See [crate::api::CnvPVecLAlloc] for corresponding public API.
  9/// # Safety [crate::doc::backend_safety] for safety contract.
 10pub unsafe trait CnvPVecLAllocImpl<BE: Backend> {
 11    fn cnv_pvec_left_alloc_impl(n: usize, cols: usize, size: usize) -> CnvPVecL<Vec<u8>, BE>;
 12    fn cnv_pvec_right_alloc_impl(n: usize, cols: usize, size: usize) -> CnvPVecR<Vec<u8>, BE>;
 13}
 14
 15/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 16/// * See the TODO reference implementation.
 17/// * See [crate::api::CnvPVecLBytesOf] for corresponding public API.
 18/// # Safety [crate::doc::backend_safety] for safety contract.
 19pub unsafe trait CnvPVecBytesOfImpl {
 20    fn bytes_of_cnv_pvec_left_impl(n: usize, cols: usize, size: usize) -> usize;
 21    fn bytes_of_cnv_pvec_right_impl(n: usize, cols: usize, size: usize) -> usize;
 22}
 23
 24/// # THIS TRAIT IS AN OPEN EXTENSION POINT (unsafe)
 25/// * See the TODO reference implementation.
 26/// * See [crate::api::Convolution] for corresponding public API.
 27/// # Safety [crate::doc::backend_safety] for safety contract.
 28pub unsafe trait ConvolutionImpl<BE: Backend> {
 29    fn cnv_prepare_left_tmp_bytes_impl(module: &Module<BE>, res_size: usize, a_size: usize) -> usize;
 30    fn cnv_prepare_left_impl<R, A>(module: &Module<BE>, res: &mut R, a: &A, scratch: &mut Scratch<BE>)
 31    where
 32        R: CnvPVecLToMut<BE>,
 33        A: VecZnxToRef;
 34    fn cnv_prepare_right_tmp_bytes_impl(module: &Module<BE>, res_size: usize, a_size: usize) -> usize;
 35    fn cnv_prepare_right_impl<R, A>(module: &Module<BE>, res: &mut R, a: &A, scratch: &mut Scratch<BE>)
 36    where
 37        R: CnvPVecRToMut<BE>,
 38        A: VecZnxToRef + ZnxInfos;
 39    fn cnv_apply_dft_tmp_bytes_impl(
 40        module: &Module<BE>,
 41        res_size: usize,
 42        res_offset: usize,
 43        a_size: usize,
 44        b_size: usize,
 45    ) -> usize;
 46
 47    fn cnv_by_const_apply_tmp_bytes_impl(
 48        module: &Module<BE>,
 49        res_size: usize,
 50        res_offset: usize,
 51        a_size: usize,
 52        b_size: usize,
 53    ) -> usize;
 54
 55    #[allow(clippy::too_many_arguments)]
 56    fn cnv_by_const_apply_impl<R, A>(
 57        module: &Module<BE>,
 58        res: &mut R,
 59        res_offset: usize,
 60        res_col: usize,
 61        a: &A,
 62        a_col: usize,
 63        b: &[i64],
 64        scratch: &mut Scratch<BE>,
 65    ) where
 66        R: VecZnxBigToMut<BE>,
 67        A: VecZnxToRef;
 68
 69    #[allow(clippy::too_many_arguments)]
 70    fn cnv_apply_dft_impl<R, A, B>(
 71        module: &Module<BE>,
 72        res: &mut R,
 73        res_offset: usize,
 74        res_col: usize,
 75        a: &A,
 76        a_col: usize,
 77        b: &B,
 78        b_col: usize,
 79        scratch: &mut Scratch<BE>,
 80    ) where
 81        R: VecZnxDftToMut<BE>,
 82        A: CnvPVecLToRef<BE>,
 83        B: CnvPVecRToRef<BE>;
 84    fn cnv_pairwise_apply_dft_tmp_bytes(
 85        module: &Module<BE>,
 86        res_size: usize,
 87        res_offset: usize,
 88        a_size: usize,
 89        b_size: usize,
 90    ) -> usize;
 91    #[allow(clippy::too_many_arguments)]
 92    fn cnv_pairwise_apply_dft_impl<R, A, B>(
 93        module: &Module<BE>,
 94        res: &mut R,
 95        res_offset: usize,
 96        res_col: usize,
 97        a: &A,
 98        b: &B,
 99        i: usize,
100        j: usize,
101        scratch: &mut Scratch<BE>,
102    ) where
103        R: VecZnxDftToMut<BE>,
104        A: CnvPVecLToRef<BE>,
105        B: CnvPVecRToRef<BE>;
106}