use rand::RngCore; use crate::{ api::{ ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxBigAlloc, VecZnxBigNormalize, VecZnxBigNormalizeTmpBytes, VecZnxDftAdd, VecZnxDftAddInplace, VecZnxDftAlloc, VecZnxDftApply, VecZnxDftCopy, VecZnxDftSub, VecZnxDftSubABInplace, VecZnxDftSubBAInplace, VecZnxIdftApply, VecZnxIdftApplyConsume, VecZnxIdftApplyTmpA, VecZnxIdftApplyTmpBytes, }, layouts::{Backend, DataViewMut, DigestU64, FillUniform, Module, ScratchOwned, VecZnx, VecZnxBig, VecZnxDft}, source::Source, }; pub fn test_vec_znx_dft_add(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftAdd
+ VecZnxDftAlloc
+ VecZnxDftApply
+ VecZnxIdftApplyConsume
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxDftAdd + VecZnxDftAlloc + VecZnxDftApply + VecZnxIdftApplyConsume + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest = a.digest_u64(); let mut a_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut a_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut a_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(1, 0, &mut a_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let a_dft_ref_digest: u64 = a_dft_ref.digest_u64(); let a_dft_test_digest: u64 = a_dft_test.digest_u64(); for b_size in [1, 2, 3, 4] { let mut b: VecZnx> = VecZnx::alloc(n, cols, b_size); b.fill_uniform(basek, &mut source); let b_digest: u64 = b.digest_u64(); let mut b_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, b_size); let mut b_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, b_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut b_dft_ref, j, &b, j); module_test.vec_znx_dft_apply(1, 0, &mut b_dft_test, j, &b, j); } assert_eq!(b.digest_u64(), b_digest); let b_dft_ref_digest: u64 = b_dft_ref.digest_u64(); let b_dft_test_digest: u64 = b_dft_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, res_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, res_size); // Set d to garbage source.fill_bytes(res_dft_ref.data_mut()); source.fill_bytes(res_dft_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_dft_add(&mut res_dft_ref, i, &a_dft_ref, i, &b_dft_ref, i); module_test.vec_znx_dft_add(&mut res_dft_test, i, &a_dft_test, i, &b_dft_test, i); } assert_eq!(a_dft_ref.digest_u64(), a_dft_ref_digest); assert_eq!(a_dft_test.digest_u64(), a_dft_test_digest); assert_eq!(b_dft_ref.digest_u64(), b_dft_ref_digest); assert_eq!(b_dft_test.digest_u64(), b_dft_test_digest); let res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_idft_apply_consume(res_dft_ref); let res_big_test: VecZnxBig, BT> = module_test.vec_znx_idft_apply_consume(res_dft_test); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_dft_add_inplace(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftAddInplace
+ VecZnxDftAlloc
+ VecZnxDftApply
+ VecZnxIdftApplyConsume
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxDftAddInplace + VecZnxDftAlloc + VecZnxDftApply + VecZnxIdftApplyConsume + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest = a.digest_u64(); let mut a_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut a_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut a_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(1, 0, &mut a_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let a_dft_ref_digest: u64 = a_dft_ref.digest_u64(); let a_dft_test_digest: u64 = a_dft_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, a_size); res.fill_uniform(basek, &mut source); let res_digest: u64 = res.digest_u64(); let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, res_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut res_dft_ref, j, &res, j); module_test.vec_znx_dft_apply(1, 0, &mut res_dft_test, j, &res, j); } assert_eq!(res.digest_u64(), res_digest); // Reference for i in 0..cols { module_ref.vec_znx_dft_add_inplace(&mut res_dft_ref, i, &a_dft_ref, i); module_test.vec_znx_dft_add_inplace(&mut res_dft_test, i, &a_dft_test, i); } assert_eq!(a_dft_ref.digest_u64(), a_dft_ref_digest); assert_eq!(a_dft_test.digest_u64(), a_dft_test_digest); let res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_idft_apply_consume(res_dft_ref); let res_big_test: VecZnxBig, BT> = module_test.vec_znx_idft_apply_consume(res_dft_test); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_copy(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftCopy
+ VecZnxDftAlloc
+ VecZnxDftApply
+ VecZnxIdftApplyConsume
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxDftCopy + VecZnxDftAlloc + VecZnxDftApply + VecZnxIdftApplyConsume + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 6, 11] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest = a.digest_u64(); let mut a_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut a_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut a_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(1, 0, &mut a_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let a_dft_ref_digest: u64 = a_dft_ref.digest_u64(); let a_dft_test_digest: u64 = a_dft_test.digest_u64(); for res_size in [1, 2, 6, 11] { for params in [[1, 0], [1, 1], [1, 2], [2, 2]] { let steps: usize = params[0]; let offset: usize = params[1]; let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, res_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, res_size); // Set d to garbage source.fill_bytes(res_dft_ref.data_mut()); source.fill_bytes(res_dft_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_dft_copy(steps, offset, &mut res_dft_ref, i, &a_dft_ref, i); module_test.vec_znx_dft_copy(steps, offset, &mut res_dft_test, i, &a_dft_test, i); } assert_eq!(a_dft_ref.digest_u64(), a_dft_ref_digest); assert_eq!(a_dft_test.digest_u64(), a_dft_test_digest); let res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_idft_apply_consume(res_dft_ref); let res_big_test: VecZnxBig, BT> = module_test.vec_znx_idft_apply_consume(res_dft_test); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_idft_apply(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftApply
+ VecZnxDftAlloc
+ VecZnxBigAlloc
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes + VecZnxIdftApply
, Module: VecZnxDftApply + VecZnxDftAlloc + VecZnxBigAlloc + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes + VecZnxIdftApply, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest: u64 = a.digest_u64(); for res_size in [1, 2, 3, 4] { for params in [[1, 0], [1, 1], [1, 2], [2, 2]] { let steps: usize = params[0]; let offset: usize = params[1]; let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(steps, offset, &mut res_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(steps, offset, &mut res_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let res_dft_ref_digest: u64 = res_dft_ref.digest_u64(); let rest_dft_test_digest: u64 = res_dft_test.digest_u64(); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_idft_apply(&mut res_big_ref, j, &res_dft_ref, j, scratch_ref.borrow()); module_test.vec_znx_idft_apply( &mut res_big_test, j, &res_dft_test, j, scratch_test.borrow(), ); } assert_eq!(res_dft_ref.digest_u64(), res_dft_ref_digest); assert_eq!(res_dft_test.digest_u64(), rest_dft_test_digest); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_idft_apply_tmpa(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftApply
+ VecZnxDftAlloc
+ VecZnxBigAlloc
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes + VecZnxIdftApplyTmpA
, Module: VecZnxDftApply + VecZnxDftAlloc + VecZnxBigAlloc + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes + VecZnxIdftApplyTmpA, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest: u64 = a.digest_u64(); for res_size in [1, 2, 3, 4] { for params in [[1, 0], [1, 1], [1, 2], [2, 2]] { let steps: usize = params[0]; let offset: usize = params[1]; let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(steps, offset, &mut res_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(steps, offset, &mut res_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let mut res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_big_alloc(cols, res_size); let mut res_big_test: VecZnxBig, BT> = module_test.vec_znx_big_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_idft_apply_tmpa(&mut res_big_ref, j, &mut res_dft_ref, j); module_test.vec_znx_idft_apply_tmpa(&mut res_big_test, j, &mut res_dft_test, j); } let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_idft_apply_consume(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftApply
+ VecZnxIdftApplyTmpBytes + VecZnxDftAlloc
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes + VecZnxIdftApplyConsume
, Module: VecZnxDftApply + VecZnxIdftApplyTmpBytes + VecZnxDftAlloc + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes + VecZnxIdftApplyConsume, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes() | module_ref.vec_znx_idft_apply_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes() | module_test.vec_znx_idft_apply_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest: u64 = a.digest_u64(); for res_size in [1, 2, 3, 4] { for params in [[1, 0], [1, 1], [1, 2], [2, 2]] { let steps: usize = params[0]; let offset: usize = params[1]; let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(steps, offset, &mut res_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(steps, offset, &mut res_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_idft_apply_consume(res_dft_ref); let res_big_test: VecZnxBig, BT> = module_test.vec_znx_idft_apply_consume(res_dft_test); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_dft_sub(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftSub
+ VecZnxDftAlloc
+ VecZnxDftApply
+ VecZnxIdftApplyConsume
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxDftSub + VecZnxDftAlloc + VecZnxDftApply + VecZnxIdftApplyConsume + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest = a.digest_u64(); let mut a_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut a_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut a_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(1, 0, &mut a_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let a_dft_ref_digest: u64 = a_dft_ref.digest_u64(); let a_dft_test_digest: u64 = a_dft_test.digest_u64(); for b_size in [1, 2, 3, 4] { let mut b: VecZnx> = VecZnx::alloc(n, cols, b_size); b.fill_uniform(basek, &mut source); let b_digest: u64 = b.digest_u64(); let mut b_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, b_size); let mut b_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, b_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut b_dft_ref, j, &b, j); module_test.vec_znx_dft_apply(1, 0, &mut b_dft_test, j, &b, j); } assert_eq!(b.digest_u64(), b_digest); let b_dft_ref_digest: u64 = b_dft_ref.digest_u64(); let b_dft_test_digest: u64 = b_dft_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, res_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, res_size); // Set d to garbage source.fill_bytes(res_dft_ref.data_mut()); source.fill_bytes(res_dft_test.data_mut()); // Reference for i in 0..cols { module_ref.vec_znx_dft_sub(&mut res_dft_ref, i, &a_dft_ref, i, &b_dft_ref, i); module_test.vec_znx_dft_sub(&mut res_dft_test, i, &a_dft_test, i, &b_dft_test, i); } assert_eq!(a_dft_ref.digest_u64(), a_dft_ref_digest); assert_eq!(a_dft_test.digest_u64(), a_dft_test_digest); assert_eq!(b_dft_ref.digest_u64(), b_dft_ref_digest); assert_eq!(b_dft_test.digest_u64(), b_dft_test_digest); let res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_idft_apply_consume(res_dft_ref); let res_big_test: VecZnxBig, BT> = module_test.vec_znx_idft_apply_consume(res_dft_test); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } } pub fn test_vec_znx_dft_sub_ab_inplace(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftSubABInplace
+ VecZnxDftAlloc
+ VecZnxDftApply
+ VecZnxIdftApplyConsume
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxDftSubABInplace + VecZnxDftAlloc + VecZnxDftApply + VecZnxIdftApplyConsume + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest = a.digest_u64(); let mut a_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut a_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut a_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(1, 0, &mut a_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let a_dft_ref_digest: u64 = a_dft_ref.digest_u64(); let a_dft_test_digest: u64 = a_dft_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, a_size); res.fill_uniform(basek, &mut source); let res_digest: u64 = res.digest_u64(); let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, res_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut res_dft_ref, j, &res, j); module_test.vec_znx_dft_apply(1, 0, &mut res_dft_test, j, &res, j); } assert_eq!(res.digest_u64(), res_digest); // Reference for i in 0..cols { module_ref.vec_znx_dft_sub_ab_inplace(&mut res_dft_ref, i, &a_dft_ref, i); module_test.vec_znx_dft_sub_ab_inplace(&mut res_dft_test, i, &a_dft_test, i); } assert_eq!(a_dft_ref.digest_u64(), a_dft_ref_digest); assert_eq!(a_dft_test.digest_u64(), a_dft_test_digest); let res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_idft_apply_consume(res_dft_ref); let res_big_test: VecZnxBig, BT> = module_test.vec_znx_idft_apply_consume(res_dft_test); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } } pub fn test_vec_znx_dft_sub_ba_inplace(basek: usize, module_ref: &Module
, module_test: &Module) where Module
: VecZnxDftSubBAInplace
+ VecZnxDftAlloc
+ VecZnxDftApply
+ VecZnxIdftApplyConsume
+ VecZnxBigNormalize
+ VecZnxBigNormalizeTmpBytes, Module: VecZnxDftSubBAInplace + VecZnxDftAlloc + VecZnxDftApply + VecZnxIdftApplyConsume + VecZnxBigNormalize + VecZnxBigNormalizeTmpBytes, ScratchOwned
: ScratchOwnedAlloc
+ ScratchOwnedBorrow
, ScratchOwned: ScratchOwnedAlloc + ScratchOwnedBorrow, { assert_eq!(module_ref.n(), module_test.n()); let n: usize = module_ref.n(); let mut source: Source = Source::new([0u8; 32]); let cols: usize = 2; let mut scratch_ref: ScratchOwned
= ScratchOwned::alloc(module_ref.vec_znx_big_normalize_tmp_bytes()); let mut scratch_test: ScratchOwned = ScratchOwned::alloc(module_test.vec_znx_big_normalize_tmp_bytes()); for a_size in [1, 2, 3, 4] { let mut a: VecZnx> = VecZnx::alloc(n, cols, a_size); a.fill_uniform(basek, &mut source); let a_digest = a.digest_u64(); let mut a_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, a_size); let mut a_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, a_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut a_dft_ref, j, &a, j); module_test.vec_znx_dft_apply(1, 0, &mut a_dft_test, j, &a, j); } assert_eq!(a.digest_u64(), a_digest); let a_dft_ref_digest: u64 = a_dft_ref.digest_u64(); let a_dft_test_digest: u64 = a_dft_test.digest_u64(); for res_size in [1, 2, 3, 4] { let mut res: VecZnx> = VecZnx::alloc(n, cols, a_size); res.fill_uniform(basek, &mut source); let res_digest: u64 = res.digest_u64(); let mut res_dft_ref: VecZnxDft, BR> = module_ref.vec_znx_dft_alloc(cols, res_size); let mut res_dft_test: VecZnxDft, BT> = module_test.vec_znx_dft_alloc(cols, res_size); for j in 0..cols { module_ref.vec_znx_dft_apply(1, 0, &mut res_dft_ref, j, &res, j); module_test.vec_znx_dft_apply(1, 0, &mut res_dft_test, j, &res, j); } assert_eq!(res.digest_u64(), res_digest); // Reference for i in 0..cols { module_ref.vec_znx_dft_sub_ba_inplace(&mut res_dft_ref, i, &a_dft_ref, i); module_test.vec_znx_dft_sub_ba_inplace(&mut res_dft_test, i, &a_dft_test, i); } assert_eq!(a_dft_ref.digest_u64(), a_dft_ref_digest); assert_eq!(a_dft_test.digest_u64(), a_dft_test_digest); let res_big_ref: VecZnxBig, BR> = module_ref.vec_znx_idft_apply_consume(res_dft_ref); let res_big_test: VecZnxBig, BT> = module_test.vec_znx_idft_apply_consume(res_dft_test); let mut res_small_ref: VecZnx> = VecZnx::alloc(n, cols, res_size); let mut res_small_test: VecZnx> = VecZnx::alloc(n, cols, res_size); let res_ref_digest: u64 = res_big_ref.digest_u64(); let res_test_digest: u64 = res_big_test.digest_u64(); for j in 0..cols { module_ref.vec_znx_big_normalize( basek, &mut res_small_ref, j, &res_big_ref, j, scratch_ref.borrow(), ); module_test.vec_znx_big_normalize( basek, &mut res_small_test, j, &res_big_test, j, scratch_test.borrow(), ); } assert_eq!(res_big_ref.digest_u64(), res_ref_digest); assert_eq!(res_big_test.digest_u64(), res_test_digest); assert_eq!(res_small_ref, res_small_test); } } }