use crate::{ layouts::{Backend, Scratch, VecZnxBigOwned, VecZnxBigToMut, VecZnxBigToRef, VecZnxToMut, VecZnxToRef}, source::Source, }; pub trait VecZnxBigFromSmall { fn vec_znx_big_from_small(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxToRef; } /// Allocates as [crate::layouts::VecZnxBig]. pub trait VecZnxBigAlloc { fn vec_znx_big_alloc(&self, cols: usize, size: usize) -> VecZnxBigOwned; } /// Returns the size in bytes to allocate a [crate::layouts::VecZnxBig]. pub trait VecZnxBigBytesOf { fn bytes_of_vec_znx_big(&self, cols: usize, size: usize) -> usize; } /// Consume a vector of bytes into a [crate::layouts::VecZnxBig]. /// User must ensure that bytes is memory aligned and that it length is equal to [VecZnxBigAllocBytes]. pub trait VecZnxBigFromBytes { fn vec_znx_big_from_bytes(&self, cols: usize, size: usize, bytes: Vec) -> VecZnxBigOwned; } #[allow(clippy::too_many_arguments)] /// Add a discrete normal distribution on res. /// /// # Arguments /// * `base2k`: base two logarithm of the bivariate representation /// * `res`: receiver. /// * `res_col`: column of the receiver on which the operation is performed/stored. /// * `k`: /// * `source`: random coin source. /// * `sigma`: standard deviation of the discrete normal distribution. /// * `bound`: rejection sampling bound. pub trait VecZnxBigAddNormal { fn vec_znx_big_add_normal>( &self, base2k: usize, res: &mut R, res_col: usize, k: usize, source: &mut Source, sigma: f64, bound: f64, ); } pub trait VecZnxBigAdd { /// Adds `a` to `b` and stores the result on `c`. fn vec_znx_big_add(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef, C: VecZnxBigToRef; } pub trait VecZnxBigAddInplace { /// Adds `a` to `b` and stores the result on `b`. fn vec_znx_big_add_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef; } pub trait VecZnxBigAddSmall { /// Adds `a` to `b` and stores the result on `c`. fn vec_znx_big_add_small(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef, C: VecZnxToRef; } pub trait VecZnxBigAddSmallInplace { /// Adds `a` to `b` and stores the result on `b`. fn vec_znx_big_add_small_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxToRef; } pub trait VecZnxBigSub { /// Subtracts `a` to `b` and stores the result on `c`. fn vec_znx_big_sub(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef, C: VecZnxBigToRef; } pub trait VecZnxBigSubInplace { /// Subtracts `a` from `b` and stores the result on `b`. fn vec_znx_big_sub_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef; } pub trait VecZnxBigSubNegateInplace { /// Subtracts `b` from `a` and stores the result on `b`. fn vec_znx_big_sub_negate_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef; } pub trait VecZnxBigSubSmallA { /// Subtracts `b` from `a` and stores the result on `c`. fn vec_znx_big_sub_small_a(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize) where R: VecZnxBigToMut, A: VecZnxToRef, C: VecZnxBigToRef; } pub trait VecZnxBigSubSmallInplace { /// Subtracts `a` from `res` and stores the result on `res`. fn vec_znx_big_sub_small_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxToRef; } pub trait VecZnxBigSubSmallB { /// Subtracts `b` from `a` and stores the result on `c`. fn vec_znx_big_sub_small_b(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &C, b_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef, C: VecZnxToRef; } pub trait VecZnxBigSubSmallNegateInplace { /// Subtracts `res` from `a` and stores the result on `res`. fn vec_znx_big_sub_small_negate_inplace(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxToRef; } pub trait VecZnxBigNegate { fn vec_znx_big_negate(&self, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef; } pub trait VecZnxBigNegateInplace { fn vec_znx_big_negate_inplace(&self, res: &mut R, res_col: usize) where R: VecZnxBigToMut; } pub trait VecZnxBigNormalizeTmpBytes { fn vec_znx_big_normalize_tmp_bytes(&self) -> usize; } #[allow(clippy::too_many_arguments)] pub trait VecZnxBigNormalize { fn vec_znx_big_normalize( &self, res_base2k: usize, res: &mut R, res_col: usize, a_base2k: usize, a: &A, a_col: usize, scratch: &mut Scratch, ) where R: VecZnxToMut, A: VecZnxBigToRef; } pub trait VecZnxBigAutomorphismInplaceTmpBytes { fn vec_znx_big_automorphism_inplace_tmp_bytes(&self) -> usize; } pub trait VecZnxBigAutomorphism { /// Applies the automorphism X^i -> X^ik on `a` and stores the result on `b`. fn vec_znx_big_automorphism(&self, p: i64, res: &mut R, res_col: usize, a: &A, a_col: usize) where R: VecZnxBigToMut, A: VecZnxBigToRef; } pub trait VecZnxBigAutomorphismInplace { /// Applies the automorphism X^i -> X^ik on `a` and stores the result on `a`. fn vec_znx_big_automorphism_inplace(&self, p: i64, res: &mut R, res_col: usize, scratch: &mut Scratch) where R: VecZnxBigToMut; }