use sampling::source::Source; use crate::hal::{ api::{ VecZnxAdd, VecZnxAddDistF64, VecZnxAddInplace, VecZnxAddNormal, VecZnxAddScalarInplace, VecZnxAutomorphism, VecZnxAutomorphismInplace, VecZnxCopy, VecZnxDecodeCoeffsi64, VecZnxDecodeVecFloat, VecZnxDecodeVeci64, VecZnxEncodeCoeffsi64, VecZnxEncodeVeci64, VecZnxFillDistF64, VecZnxFillNormal, VecZnxFillUniform, VecZnxLshInplace, VecZnxMerge, VecZnxMulXpMinusOne, VecZnxMulXpMinusOneInplace, VecZnxNegate, VecZnxNegateInplace, VecZnxNormalize, VecZnxNormalizeInplace, VecZnxNormalizeTmpBytes, VecZnxRotate, VecZnxRotateInplace, VecZnxRshInplace, VecZnxSplit, VecZnxStd, VecZnxSub, VecZnxSubABInplace, VecZnxSubBAInplace, VecZnxSubScalarInplace, VecZnxSwithcDegree, }, layouts::{Backend, Module, ScalarZnxToRef, Scratch, VecZnxToMut, VecZnxToRef}, oep::{ VecZnxAddDistF64Impl, VecZnxAddImpl, VecZnxAddInplaceImpl, VecZnxAddNormalImpl, VecZnxAddScalarInplaceImpl, VecZnxAutomorphismImpl, VecZnxAutomorphismInplaceImpl, VecZnxCopyImpl, VecZnxDecodeCoeffsi64Impl, VecZnxDecodeVecFloatImpl, VecZnxDecodeVeci64Impl, VecZnxEncodeCoeffsi64Impl, VecZnxEncodeVeci64Impl, VecZnxFillDistF64Impl, VecZnxFillNormalImpl, VecZnxFillUniformImpl, VecZnxLshInplaceImpl, VecZnxMergeImpl, VecZnxMulXpMinusOneImpl, VecZnxMulXpMinusOneInplaceImpl, VecZnxNegateImpl, VecZnxNegateInplaceImpl, VecZnxNormalizeImpl, VecZnxNormalizeInplaceImpl, VecZnxNormalizeTmpBytesImpl, VecZnxRotateImpl, VecZnxRotateInplaceImpl, VecZnxRshInplaceImpl, VecZnxSplitImpl, VecZnxStdImpl, VecZnxSubABInplaceImpl, VecZnxSubBAInplaceImpl, VecZnxSubImpl, VecZnxSubScalarInplaceImpl, VecZnxSwithcDegreeImpl, }, }; impl VecZnxNormalizeTmpBytes for Module where B: Backend + VecZnxNormalizeTmpBytesImpl, { fn vec_znx_normalize_tmp_bytes(&self, n: usize) -> usize { B::vec_znx_normalize_tmp_bytes_impl(self, n) } } impl VecZnxNormalize for Module where B: Backend + VecZnxNormalizeImpl, { fn vec_znx_normalize(&self, basek: usize, res: &mut R, res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_normalize_impl(self, basek, res, res_col, a, a_col, scratch) } } impl VecZnxNormalizeInplace for Module where B: Backend + VecZnxNormalizeInplaceImpl, { fn vec_znx_normalize_inplace(&self, basek: usize, a: &mut A, a_col: usize, scratch: &mut Scratch) where A: VecZnxToMut, { B::vec_znx_normalize_inplace_impl(self, basek, a, a_col, scratch) } } impl VecZnxAdd for Module where B: Backend + VecZnxAddImpl, { fn vec_znx_add(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize) where R: VecZnxToMut, A: VecZnxToRef, C: VecZnxToRef, { B::vec_znx_add_impl(self, res, res_col, a, a_col, b, b_col) } } impl VecZnxAddInplace for Module where B: Backend + VecZnxAddInplaceImpl, { fn vec_znx_add_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_add_inplace_impl(self, res, res_col, a, a_col) } } impl VecZnxAddScalarInplace for Module where B: Backend + VecZnxAddScalarInplaceImpl, { fn vec_znx_add_scalar_inplace(&self, res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: ScalarZnxToRef, { B::vec_znx_add_scalar_inplace_impl(self, res, res_col, res_limb, a, a_col) } } impl VecZnxSub for Module where B: Backend + VecZnxSubImpl, { fn vec_znx_sub(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize) where R: VecZnxToMut, A: VecZnxToRef, C: VecZnxToRef, { B::vec_znx_sub_impl(self, res, res_col, a, a_col, b, b_col) } } impl VecZnxSubABInplace for Module where B: Backend + VecZnxSubABInplaceImpl, { fn vec_znx_sub_ab_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_sub_ab_inplace_impl(self, res, res_col, a, a_col) } } impl VecZnxSubBAInplace for Module where B: Backend + VecZnxSubBAInplaceImpl, { fn vec_znx_sub_ba_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_sub_ba_inplace_impl(self, res, res_col, a, a_col) } } impl VecZnxSubScalarInplace for Module where B: Backend + VecZnxSubScalarInplaceImpl, { fn vec_znx_sub_scalar_inplace(&self, res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: ScalarZnxToRef, { B::vec_znx_sub_scalar_inplace_impl(self, res, res_col, res_limb, a, a_col) } } impl VecZnxNegate for Module where B: Backend + VecZnxNegateImpl, { fn vec_znx_negate(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_negate_impl(self, res, res_col, a, a_col) } } impl VecZnxNegateInplace for Module where B: Backend + VecZnxNegateInplaceImpl, { fn vec_znx_negate_inplace(&self, a: &mut A, a_col: usize) where A: VecZnxToMut, { B::vec_znx_negate_inplace_impl(self, a, a_col) } } impl VecZnxLshInplace for Module where B: Backend + VecZnxLshInplaceImpl, { fn vec_znx_lsh_inplace(&self, basek: usize, k: usize, a: &mut A) where A: VecZnxToMut, { B::vec_znx_lsh_inplace_impl(self, basek, k, a) } } impl VecZnxRshInplace for Module where B: Backend + VecZnxRshInplaceImpl, { fn vec_znx_rsh_inplace(&self, basek: usize, k: usize, a: &mut A) where A: VecZnxToMut, { B::vec_znx_rsh_inplace_impl(self, basek, k, a) } } impl VecZnxRotate for Module where B: Backend + VecZnxRotateImpl, { fn vec_znx_rotate(&self, k: i64, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_rotate_impl(self, k, res, res_col, a, a_col) } } impl VecZnxRotateInplace for Module where B: Backend + VecZnxRotateInplaceImpl, { fn vec_znx_rotate_inplace(&self, k: i64, a: &mut A, a_col: usize) where A: VecZnxToMut, { B::vec_znx_rotate_inplace_impl(self, k, a, a_col) } } impl VecZnxAutomorphism for Module where B: Backend + VecZnxAutomorphismImpl, { fn vec_znx_automorphism(&self, k: i64, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_automorphism_impl(self, k, res, res_col, a, a_col) } } impl VecZnxAutomorphismInplace for Module where B: Backend + VecZnxAutomorphismInplaceImpl, { fn vec_znx_automorphism_inplace(&self, k: i64, a: &mut A, a_col: usize) where A: VecZnxToMut, { B::vec_znx_automorphism_inplace_impl(self, k, a, a_col) } } impl VecZnxMulXpMinusOne for Module where B: Backend + VecZnxMulXpMinusOneImpl, { fn vec_znx_mul_xp_minus_one(&self, p: i64, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_mul_xp_minus_one_impl(self, p, res, res_col, a, a_col); } } impl VecZnxMulXpMinusOneInplace for Module where B: Backend + VecZnxMulXpMinusOneInplaceImpl, { fn vec_znx_mul_xp_minus_one_inplace(&self, p: i64, res: &mut R, res_col: usize) where R: VecZnxToMut, { B::vec_znx_mul_xp_minus_one_inplace_impl(self, p, res, res_col); } } impl VecZnxSplit for Module where B: Backend + VecZnxSplitImpl, { fn vec_znx_split(&self, res: &mut Vec, res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_split_impl(self, res, res_col, a, a_col, scratch) } } impl VecZnxMerge for Module where B: Backend + VecZnxMergeImpl, { fn vec_znx_merge(&self, res: &mut R, res_col: usize, a: Vec, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_merge_impl(self, res, res_col, a, a_col) } } impl VecZnxSwithcDegree for Module where B: Backend + VecZnxSwithcDegreeImpl, { fn vec_znx_switch_degree(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_switch_degree_impl(self, res, res_col, a, a_col) } } impl VecZnxCopy for Module where B: Backend + VecZnxCopyImpl, { fn vec_znx_copy(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxToMut, A: VecZnxToRef, { B::vec_znx_copy_impl(self, res, res_col, a, a_col) } } impl VecZnxStd for Module where B: Backend + VecZnxStdImpl, { fn vec_znx_std(&self, basek: usize, a: &A, a_col: usize) -> f64 where A: VecZnxToRef, { B::vec_znx_std_impl(self, basek, a, a_col) } } impl VecZnxFillUniform for Module where B: Backend + VecZnxFillUniformImpl, { fn vec_znx_fill_uniform(&self, basek: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source) where R: VecZnxToMut, { B::vec_znx_fill_uniform_impl(self, basek, res, res_col, k, source); } } impl VecZnxFillDistF64 for Module where B: Backend + VecZnxFillDistF64Impl, { fn vec_znx_fill_dist_f64>( &self, basek: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source, dist: D, bound: f64, ) where R: VecZnxToMut, { B::vec_znx_fill_dist_f64_impl(self, basek, res, res_col, k, source, dist, bound); } } impl VecZnxAddDistF64 for Module where B: Backend + VecZnxAddDistF64Impl, { fn vec_znx_add_dist_f64>( &self, basek: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source, dist: D, bound: f64, ) where R: VecZnxToMut, { B::vec_znx_add_dist_f64_impl(self, basek, res, res_col, k, source, dist, bound); } } impl VecZnxFillNormal for Module where B: Backend + VecZnxFillNormalImpl, { fn vec_znx_fill_normal( &self, basek: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source, sigma: f64, bound: f64, ) where R: VecZnxToMut, { B::vec_znx_fill_normal_impl(self, basek, res, res_col, k, source, sigma, bound); } } impl VecZnxAddNormal for Module where B: Backend + VecZnxAddNormalImpl, { fn vec_znx_add_normal( &self, basek: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source, sigma: f64, bound: f64, ) where R: VecZnxToMut, { B::vec_znx_add_normal_impl(self, basek, res, res_col, k, source, sigma, bound); } } impl VecZnxEncodeVeci64 for Module where B: Backend + VecZnxEncodeVeci64Impl, { fn encode_vec_i64(&self, basek: usize, res: &mut R, res_col: usize, k: usize, data: &[i64], log_max: usize) where R: VecZnxToMut, { B::encode_vec_i64_impl(self, basek, res, res_col, k, data, log_max); } } impl VecZnxEncodeCoeffsi64 for Module where B: Backend + VecZnxEncodeCoeffsi64Impl, { fn encode_coeff_i64(&self, basek: usize, res: &mut R, res_col: usize, k: usize, i: usize, data: i64, log_max: usize) where R: VecZnxToMut, { B::encode_coeff_i64_impl(self, basek, res, res_col, k, i, data, log_max); } } impl VecZnxDecodeVeci64 for Module where B: Backend + VecZnxDecodeVeci64Impl, { fn decode_vec_i64(&self, basek: usize, res: &R, res_col: usize, k: usize, data: &mut [i64]) where R: VecZnxToRef, { B::decode_vec_i64_impl(self, basek, res, res_col, k, data); } } impl VecZnxDecodeCoeffsi64 for Module where B: Backend + VecZnxDecodeCoeffsi64Impl, { fn decode_coeff_i64(&self, basek: usize, res: &R, res_col: usize, k: usize, i: usize) -> i64 where R: VecZnxToRef, { B::decode_coeff_i64_impl(self, basek, res, res_col, k, i) } } impl VecZnxDecodeVecFloat for Module where B: Backend + VecZnxDecodeVecFloatImpl, { fn decode_vec_float(&self, basek: usize, res: &R, col_i: usize, data: &mut [rug::Float]) where R: VecZnxToRef, { B::decode_vec_float_impl(self, basek, res, col_i, data); } }