poulpy/poulpy-hal/src/reference/vec_znx/add_scalar.rs
poulpy-hal/src/reference/vec_znx/add_scalar.rsRaw
1use crate::{
2 layouts::{ScalarZnx, ScalarZnxToRef, VecZnx, VecZnxToMut, VecZnxToRef, ZnxInfos, ZnxView, ZnxViewMut},
3 reference::znx::{ZnxAdd, ZnxAddInplace, ZnxCopy, ZnxZero},
4};
5
6pub fn vec_znx_add_scalar<R, A, B, ZNXARI>(res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize, b_limb: usize)
7where
8 R: VecZnxToMut,
9 A: ScalarZnxToRef,
10 B: VecZnxToRef,
11 ZNXARI: ZnxAdd + ZnxCopy + ZnxZero,
12{
13 let a: ScalarZnx<&[u8]> = a.to_ref();
14 let b: VecZnx<&[u8]> = b.to_ref();
15 let mut res: VecZnx<&mut [u8]> = res.to_mut();
16
17 let min_size: usize = b.size().min(res.size());
18
19 #[cfg(debug_assertions)]
20 {
21 assert!(b_limb < min_size, "b_limb: {b_limb} > min_size: {min_size}");
22 }
23
24 for j in 0..min_size {
25 if j == b_limb {
26 ZNXARI::znx_add(res.at_mut(res_col, j), a.at(a_col, 0), b.at(b_col, j));
27 } else {
28 ZNXARI::znx_copy(res.at_mut(res_col, j), b.at(b_col, j));
29 }
30 }
31
32 for j in min_size..res.size() {
33 ZNXARI::znx_zero(res.at_mut(res_col, j));
34 }
35}
36
37pub fn vec_znx_add_scalar_inplace<R, A, ZNXARI>(res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize)
38where
39 R: VecZnxToMut,
40 A: ScalarZnxToRef,
41 ZNXARI: ZnxAddInplace,
42{
43 let a: ScalarZnx<&[u8]> = a.to_ref();
44 let mut res: VecZnx<&mut [u8]> = res.to_mut();
45
46 #[cfg(debug_assertions)]
47 {
48 assert!(res_limb < res.size());
49 }
50
51 ZNXARI::znx_add_inplace(res.at_mut(res_col, res_limb), a.at(a_col, 0));
52}