use crate::{ api::{CnvPVecAlloc, CnvPVecBytesOf, Convolution}, layouts::{ Backend, CnvPVecL, CnvPVecLToMut, CnvPVecLToRef, CnvPVecR, CnvPVecRToMut, CnvPVecRToRef, Module, Scratch, VecZnxBigToMut, VecZnxDftToMut, VecZnxToRef, ZnxInfos, ZnxViewMut, }, oep::{CnvPVecBytesOfImpl, CnvPVecLAllocImpl, ConvolutionImpl}, }; impl CnvPVecAlloc for Module where BE: CnvPVecLAllocImpl, { fn cnv_pvec_left_alloc(&self, cols: usize, size: usize) -> CnvPVecL, BE> { BE::cnv_pvec_left_alloc_impl(self.n(), cols, size) } fn cnv_pvec_right_alloc(&self, cols: usize, size: usize) -> CnvPVecR, BE> { BE::cnv_pvec_right_alloc_impl(self.n(), cols, size) } } impl CnvPVecBytesOf for Module where BE: CnvPVecBytesOfImpl, { fn bytes_of_cnv_pvec_left(&self, cols: usize, size: usize) -> usize { BE::bytes_of_cnv_pvec_left_impl(self.n(), cols, size) } fn bytes_of_cnv_pvec_right(&self, cols: usize, size: usize) -> usize { BE::bytes_of_cnv_pvec_right_impl(self.n(), cols, size) } } impl Convolution for Module where BE: ConvolutionImpl, { fn cnv_prepare_left_tmp_bytes(&self, res_size: usize, a_size: usize) -> usize { BE::cnv_prepare_left_tmp_bytes_impl(self, res_size, a_size) } fn cnv_prepare_left(&self, res: &mut R, a: &A, scratch: &mut Scratch) where R: CnvPVecLToMut + ZnxInfos + ZnxViewMut, A: VecZnxToRef + ZnxInfos, { BE::cnv_prepare_left_impl(self, res, a, scratch); } fn cnv_prepare_right_tmp_bytes(&self, res_size: usize, a_size: usize) -> usize { BE::cnv_prepare_right_tmp_bytes_impl(self, res_size, a_size) } fn cnv_prepare_right(&self, res: &mut R, a: &A, scratch: &mut Scratch) where R: CnvPVecRToMut + ZnxInfos + ZnxViewMut, A: VecZnxToRef + ZnxInfos, { BE::cnv_prepare_right_impl(self, res, a, scratch); } fn cnv_apply_dft_tmp_bytes(&self, res_size: usize, res_offset: usize, a_size: usize, b_size: usize) -> usize { BE::cnv_apply_dft_tmp_bytes_impl(self, res_size, res_offset, a_size, b_size) } fn cnv_by_const_apply_tmp_bytes(&self, res_size: usize, res_offset: usize, a_size: usize, b_size: usize) -> usize { BE::cnv_by_const_apply_tmp_bytes_impl(self, res_size, res_offset, a_size, b_size) } fn cnv_by_const_apply( &self, res: &mut R, res_offset: usize, res_col: usize, a: &A, a_col: usize, b: &[i64], scratch: &mut Scratch, ) where R: VecZnxBigToMut, A: VecZnxToRef, { BE::cnv_by_const_apply_impl(self, res, res_offset, res_col, a, a_col, b, scratch); } fn cnv_apply_dft( &self, res: &mut R, res_offset: usize, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize, scratch: &mut Scratch, ) where R: VecZnxDftToMut, A: CnvPVecLToRef, B: CnvPVecRToRef, { BE::cnv_apply_dft_impl(self, res, res_offset, res_col, a, a_col, b, b_col, scratch); } fn cnv_pairwise_apply_dft_tmp_bytes(&self, res_size: usize, res_offset: usize, a_size: usize, b_size: usize) -> usize { BE::cnv_pairwise_apply_dft_tmp_bytes(self, res_size, res_offset, a_size, b_size) } fn cnv_pairwise_apply_dft( &self, res: &mut R, res_offset: usize, res_col: usize, a: &A, b: &B, i: usize, j: usize, scratch: &mut Scratch, ) where R: VecZnxDftToMut, A: CnvPVecLToRef, B: CnvPVecRToRef, { BE::cnv_pairwise_apply_dft_impl(self, res, res_offset, res_col, a, b, i, j, scratch); } }