Add cross-basek normalization (#90)

* added cross_basek_normalization

* updated method signatures to take layouts

* fixed cross-base normalization

fix #91
fix #93
This commit is contained in:
Jean-Philippe Bossuat
2025-09-30 14:40:10 +02:00
committed by GitHub
parent 4da790ea6a
commit 37e13b965c
216 changed files with 12481 additions and 7745 deletions

View File

@@ -1,52 +1,52 @@
use crate::layouts::{GLWEPlaintext, Infos, LWEPlaintext};
use crate::layouts::{GLWEPlaintext, LWEInfos, LWEPlaintext, TorusPrecision};
use poulpy_hal::layouts::{DataMut, DataRef};
use rug::Float;
impl<D: DataMut> GLWEPlaintext<D> {
pub fn encode_vec_i64(&mut self, data: &[i64], k: usize) {
let basek: usize = self.basek();
self.data
.encode_vec_i64(basek, 0, k, data, i64::BITS as usize);
pub fn encode_vec_i64(&mut self, data: &[i64], k: TorusPrecision) {
let base2k: usize = self.base2k().into();
self.data.encode_vec_i64(base2k, 0, k.into(), data);
}
pub fn encode_coeff_i64(&mut self, data: i64, k: usize, idx: usize) {
let basek: usize = self.basek();
self.data
.encode_coeff_i64(basek, 0, k, idx, data, i64::BITS as usize);
pub fn encode_coeff_i64(&mut self, data: i64, k: TorusPrecision, idx: usize) {
let base2k: usize = self.base2k().into();
self.data.encode_coeff_i64(base2k, 0, k.into(), idx, data);
}
}
impl<D: DataRef> GLWEPlaintext<D> {
pub fn decode_vec_i64(&self, data: &mut [i64], k: usize) {
self.data.decode_vec_i64(self.basek(), 0, k, data);
pub fn decode_vec_i64(&self, data: &mut [i64], k: TorusPrecision) {
self.data
.decode_vec_i64(self.base2k().into(), 0, k.into(), data);
}
pub fn decode_coeff_i64(&self, k: usize, idx: usize) -> i64 {
self.data.decode_coeff_i64(self.basek(), 0, k, idx)
pub fn decode_coeff_i64(&self, k: TorusPrecision, idx: usize) -> i64 {
self.data
.decode_coeff_i64(self.base2k().into(), 0, k.into(), idx)
}
pub fn decode_vec_float(&self, data: &mut [Float]) {
self.data.decode_vec_float(self.basek(), 0, data);
self.data.decode_vec_float(self.base2k().into(), 0, data);
}
pub fn std(&self) -> f64 {
self.data.std(self.basek(), 0)
self.data.std(self.base2k().into(), 0)
}
}
impl<D: DataMut> LWEPlaintext<D> {
pub fn encode_i64(&mut self, data: i64, k: usize) {
let basek: usize = self.basek();
self.data.encode_i64(basek, k, data, i64::BITS as usize);
pub fn encode_i64(&mut self, data: i64, k: TorusPrecision) {
let base2k: usize = self.base2k().into();
self.data.encode_i64(base2k, k.into(), data);
}
}
impl<D: DataRef> LWEPlaintext<D> {
pub fn decode_i64(&self, k: usize) -> i64 {
self.data.decode_i64(self.basek(), k)
pub fn decode_i64(&self, k: TorusPrecision) -> i64 {
self.data.decode_i64(self.base2k().into(), k.into())
}
pub fn decode_float(&self) -> Float {
self.data.decode_float(self.basek())
self.data.decode_float(self.base2k().into())
}
}