arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-core/src/layouts/lwe_plaintext.rs
poulpy-core/src/layouts/lwe_plaintext.rsRaw
  1use std::fmt;
  2
  3use poulpy_hal::layouts::{Data, DataMut, DataRef, VecZnx, VecZnxToMut, VecZnxToRef, ZnxInfos};
  4
  5use crate::layouts::{Base2K, Degree, LWEInfos, SetLWEInfos, TorusPrecision};
  6
  7#[derive(PartialEq, Eq, Copy, Clone, Debug)]
  8pub struct LWEPlaintextLayout {
  9    k: TorusPrecision,
 10    base2k: Base2K,
 11}
 12
 13impl LWEInfos for LWEPlaintextLayout {
 14    fn base2k(&self) -> Base2K {
 15        self.base2k
 16    }
 17
 18    fn k(&self) -> TorusPrecision {
 19        self.k
 20    }
 21
 22    fn n(&self) -> Degree {
 23        Degree(0)
 24    }
 25
 26    fn size(&self) -> usize {
 27        self.k.0.div_ceil(self.base2k.0) as usize
 28    }
 29}
 30
 31pub struct LWEPlaintext<D: Data> {
 32    pub(crate) data: VecZnx<D>,
 33    pub(crate) k: TorusPrecision,
 34    pub(crate) base2k: Base2K,
 35}
 36
 37impl<D: DataMut> SetLWEInfos for LWEPlaintext<D> {
 38    fn set_base2k(&mut self, base2k: Base2K) {
 39        self.base2k = base2k
 40    }
 41
 42    fn set_k(&mut self, k: TorusPrecision) {
 43        self.k = k
 44    }
 45}
 46
 47impl<D: Data> LWEInfos for LWEPlaintext<D> {
 48    fn base2k(&self) -> Base2K {
 49        self.base2k
 50    }
 51
 52    fn k(&self) -> TorusPrecision {
 53        self.k
 54    }
 55
 56    fn n(&self) -> Degree {
 57        Degree(self.data.n() as u32 - 1)
 58    }
 59
 60    fn size(&self) -> usize {
 61        self.data.size()
 62    }
 63}
 64
 65impl LWEPlaintext<Vec<u8>> {
 66    pub fn alloc_from_infos<A>(infos: &A) -> Self
 67    where
 68        A: LWEInfos,
 69    {
 70        Self::alloc(infos.base2k(), infos.k())
 71    }
 72
 73    pub fn alloc(base2k: Base2K, k: TorusPrecision) -> Self {
 74        LWEPlaintext {
 75            data: VecZnx::alloc(1, 1, k.0.div_ceil(base2k.0) as usize),
 76            k,
 77            base2k,
 78        }
 79    }
 80
 81    pub fn bytes_of_from_infos<A>(infos: &A) -> usize
 82    where
 83        A: LWEInfos,
 84    {
 85        Self::bytes_of(infos.size())
 86    }
 87
 88    pub fn bytes_of(size: usize) -> usize {
 89        VecZnx::bytes_of(1, 1, size)
 90    }
 91}
 92
 93impl<D: DataRef> fmt::Display for LWEPlaintext<D> {
 94    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 95        write!(f, "LWEPlaintext: base2k={} k={}: {}", self.base2k().0, self.k().0, self.data)
 96    }
 97}
 98
 99pub trait LWEPlaintextToRef {
100    #[allow(dead_code)]
101    fn to_ref(&self) -> LWEPlaintext<&[u8]>;
102}
103
104impl<D: DataRef> LWEPlaintextToRef for LWEPlaintext<D> {
105    fn to_ref(&self) -> LWEPlaintext<&[u8]> {
106        LWEPlaintext {
107            data: self.data.to_ref(),
108            base2k: self.base2k,
109            k: self.k,
110        }
111    }
112}
113
114pub trait LWEPlaintextToMut {
115    #[allow(dead_code)]
116    fn to_mut(&mut self) -> LWEPlaintext<&mut [u8]>;
117}
118
119impl<D: DataMut> LWEPlaintextToMut for LWEPlaintext<D> {
120    fn to_mut(&mut self) -> LWEPlaintext<&mut [u8]> {
121        LWEPlaintext {
122            data: self.data.to_mut(),
123            base2k: self.base2k,
124            k: self.k,
125        }
126    }
127}
128
129impl<D: DataRef> LWEPlaintext<D> {
130    pub fn data(&self) -> &VecZnx<D> {
131        &self.data
132    }
133}
134
135impl<D: DataMut> LWEPlaintext<D> {
136    pub fn data_mut(&mut self) -> &mut VecZnx<D> {
137        &mut self.data
138    }
139}