mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 05:06:44 +01:00
Updated packing to clean values correctly
This commit is contained in:
@@ -6,15 +6,22 @@ use poulpy_hal::{
|
||||
};
|
||||
|
||||
use crate::{
|
||||
GLWEAdd, GLWEAutomorphism, GLWECopy, GLWENormalize, GLWERotate, GLWEShift, GLWESub, ScratchTakeCore,
|
||||
GLWEAdd, GLWEAutomorphism, GLWECopy, GLWENormalize, GLWERotate, GLWEShift, GLWESub, GLWETrace, ScratchTakeCore,
|
||||
layouts::{GGLWEInfos, GGLWEPreparedToRef, GLWEAutomorphismKeyHelper, GLWEInfos, GLWEToMut, GLWEToRef, GetGaloisElement},
|
||||
};
|
||||
pub trait GLWEPacking<BE: Backend> {
|
||||
/// Packs [x_0: GLWE(m_0), x_1: GLWE(m_1), ..., x_i: GLWE(m_i)]
|
||||
/// to [0: GLWE(m_0 * X^x_0 + m_1 * X^x_1 + ... + m_i * X^x_i)]
|
||||
fn glwe_pack<R, K, H>(&self, cts: &mut HashMap<usize, &mut R>, log_gap_out: usize, keys: &H, scratch: &mut Scratch<BE>)
|
||||
where
|
||||
R: GLWEToMut + GLWEToRef + GLWEInfos,
|
||||
fn glwe_pack<R, A, K, H>(
|
||||
&self,
|
||||
res: &mut R,
|
||||
a: HashMap<usize, &mut A>,
|
||||
log_gap_out: usize,
|
||||
keys: &H,
|
||||
scratch: &mut Scratch<BE>,
|
||||
) where
|
||||
R: GLWEToMut,
|
||||
A: GLWEToMut + GLWEToRef + GLWEInfos,
|
||||
K: GGLWEPreparedToRef<BE> + GetGaloisElement + GGLWEInfos,
|
||||
H: GLWEAutomorphismKeyHelper<K, BE>;
|
||||
}
|
||||
@@ -29,21 +36,26 @@ where
|
||||
+ GLWEShift<BE>
|
||||
+ GLWEAdd
|
||||
+ GLWENormalize<BE>
|
||||
+ GLWECopy,
|
||||
+ GLWECopy
|
||||
+ GLWETrace<BE>,
|
||||
Scratch<BE>: ScratchTakeCore<BE>,
|
||||
{
|
||||
/// Packs [x_0: GLWE(m_0), x_1: GLWE(m_1), ..., x_i: GLWE(m_i)]
|
||||
/// to [0: GLWE(m_0 * X^x_0 + m_1 * X^x_1 + ... + m_i * X^x_i)]
|
||||
fn glwe_pack<R, K, H>(&self, cts: &mut HashMap<usize, &mut R>, log_gap_out: usize, keys: &H, scratch: &mut Scratch<BE>)
|
||||
where
|
||||
R: GLWEToMut + GLWEToRef + GLWEInfos,
|
||||
fn glwe_pack<R, A, K, H>(
|
||||
&self,
|
||||
res: &mut R,
|
||||
mut a: HashMap<usize, &mut A>,
|
||||
log_gap_out: usize,
|
||||
keys: &H,
|
||||
scratch: &mut Scratch<BE>,
|
||||
) where
|
||||
R: GLWEToMut,
|
||||
A: GLWEToMut + GLWEToRef + GLWEInfos,
|
||||
K: GGLWEPreparedToRef<BE> + GetGaloisElement + GGLWEInfos,
|
||||
H: GLWEAutomorphismKeyHelper<K, BE>,
|
||||
{
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
assert!(*cts.keys().max().unwrap() < self.n())
|
||||
}
|
||||
assert!(*a.keys().max().unwrap() < self.n());
|
||||
|
||||
let log_n: usize = self.log_n();
|
||||
|
||||
@@ -58,18 +70,27 @@ where
|
||||
};
|
||||
|
||||
for j in 0..t {
|
||||
let mut a: Option<&mut R> = cts.remove(&j);
|
||||
let mut b: Option<&mut R> = cts.remove(&(j + t));
|
||||
let mut lo: Option<&mut A> = a.remove(&j);
|
||||
let mut hi: Option<&mut A> = a.remove(&(j + t));
|
||||
|
||||
pack_internal(self, &mut a, &mut b, i, key, scratch);
|
||||
pack_internal(self, &mut lo, &mut hi, i, key, scratch);
|
||||
|
||||
if let Some(a) = a {
|
||||
cts.insert(j, a);
|
||||
} else if let Some(b) = b {
|
||||
cts.insert(j, b);
|
||||
if let Some(lo) = lo {
|
||||
a.insert(j, lo);
|
||||
} else if let Some(hi) = hi {
|
||||
a.insert(j, hi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.glwe_trace(
|
||||
res,
|
||||
log_n - log_gap_out,
|
||||
log_n,
|
||||
*a.get(&0).unwrap(),
|
||||
keys,
|
||||
scratch,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ glwe_external_product => crate::tests::test_suite::external_product::test_glwe_e
|
||||
glwe_external_product_inplace => crate::tests::test_suite::external_product::test_glwe_external_product_inplace,
|
||||
// GLWE Trace
|
||||
glwe_trace_inplace => crate::tests::test_suite::test_glwe_trace_inplace,
|
||||
glwe_packing => crate::tests::test_suite::test_glwe_packing,
|
||||
glwe_packing => crate::tests::test_suite::test_glwe_packer,
|
||||
// GGLWE Encryption
|
||||
gglwe_switching_key_encrypt_sk => crate::tests::test_suite::encryption::test_gglwe_switching_key_encrypt_sk,
|
||||
gglwe_switching_key_compressed_encrypt_sk => crate::tests::test_suite::encryption::test_gglwe_switching_key_compressed_encrypt_sk,
|
||||
@@ -86,7 +86,7 @@ glwe_external_product => crate::tests::test_suite::external_product::test_glwe_e
|
||||
glwe_external_product_inplace => crate::tests::test_suite::external_product::test_glwe_external_product_inplace,
|
||||
// GLWE Trace
|
||||
glwe_trace_inplace => crate::tests::test_suite::test_glwe_trace_inplace,
|
||||
glwe_packing => crate::tests::test_suite::test_glwe_packing,
|
||||
glwe_packing => crate::tests::test_suite::test_glwe_packer,
|
||||
// GGLWE Encryption
|
||||
gglwe_switching_key_encrypt_sk => crate::tests::test_suite::encryption::test_gglwe_switching_key_encrypt_sk,
|
||||
gglwe_switching_key_compressed_encrypt_sk => crate::tests::test_suite::encryption::test_gglwe_switching_key_compressed_encrypt_sk,
|
||||
@@ -146,7 +146,7 @@ glwe_external_product => crate::tests::test_suite::external_product::test_glwe_e
|
||||
glwe_external_product_inplace => crate::tests::test_suite::external_product::test_glwe_external_product_inplace,
|
||||
// GLWE Trace
|
||||
glwe_trace_inplace => crate::tests::test_suite::test_glwe_trace_inplace,
|
||||
glwe_packing => crate::tests::test_suite::test_glwe_packing,
|
||||
glwe_packing => crate::tests::test_suite::test_glwe_packer,
|
||||
// GGLWE Encryption
|
||||
gglwe_switching_key_encrypt_sk => crate::tests::test_suite::encryption::test_gglwe_switching_key_encrypt_sk,
|
||||
gglwe_switching_key_compressed_encrypt_sk => crate::tests::test_suite::encryption::test_gglwe_switching_key_compressed_encrypt_sk,
|
||||
|
||||
@@ -15,7 +15,7 @@ use crate::{
|
||||
},
|
||||
};
|
||||
|
||||
pub fn test_glwe_packing<BE: Backend>(module: &Module<BE>)
|
||||
pub fn test_glwe_packer<BE: Backend>(module: &Module<BE>)
|
||||
where
|
||||
Module<BE>: GLWEEncryptSk<BE>
|
||||
+ GLWEAutomorphismKeyEncryptSk<BE>
|
||||
@@ -4,9 +4,9 @@ pub mod external_product;
|
||||
pub mod keyswitch;
|
||||
|
||||
mod conversion;
|
||||
mod packing;
|
||||
mod glwe_packer;
|
||||
mod trace;
|
||||
|
||||
pub use conversion::*;
|
||||
pub use packing::*;
|
||||
pub use glwe_packer::*;
|
||||
pub use trace::*;
|
||||
|
||||
Reference in New Issue
Block a user