arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-core/src/layouts/compressed/gglwe_atk.rs
poulpy-core/src/layouts/compressed/gglwe_atk.rsRaw
  1use poulpy_backend::hal::{
  2    api::{FillUniform, Reset, VecZnxCopy, VecZnxFillUniform},
  3    layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo},
  4    source::Source,
  5};
  6
  7use crate::layouts::{
  8    GGLWEAutomorphismKey, Infos,
  9    compressed::{Decompress, GGLWESwitchingKeyCompressed},
 10};
 11use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
 12use std::fmt;
 13
 14#[derive(PartialEq, Eq, Clone)]
 15pub struct GGLWEAutomorphismKeyCompressed<D: Data> {
 16    pub(crate) key: GGLWESwitchingKeyCompressed<D>,
 17    pub(crate) p: i64,
 18}
 19
 20impl<D: DataRef> fmt::Debug for GGLWEAutomorphismKeyCompressed<D> {
 21    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 22        write!(f, "{}", self)
 23    }
 24}
 25
 26impl<D: DataMut> FillUniform for GGLWEAutomorphismKeyCompressed<D> {
 27    fn fill_uniform(&mut self, source: &mut Source) {
 28        self.key.fill_uniform(source);
 29    }
 30}
 31
 32impl<D: DataMut> Reset for GGLWEAutomorphismKeyCompressed<D>
 33where
 34    MatZnx<D>: Reset,
 35{
 36    fn reset(&mut self) {
 37        self.key.reset();
 38        self.p = 0;
 39    }
 40}
 41
 42impl<D: DataRef> fmt::Display for GGLWEAutomorphismKeyCompressed<D> {
 43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 44        write!(f, "(AutomorphismKeyCompressed: p={}) {}", self.p, self.key)
 45    }
 46}
 47
 48impl GGLWEAutomorphismKeyCompressed<Vec<u8>> {
 49    pub fn alloc(n: usize, basek: usize, k: usize, rows: usize, digits: usize, rank: usize) -> Self {
 50        GGLWEAutomorphismKeyCompressed {
 51            key: GGLWESwitchingKeyCompressed::alloc(n, basek, k, rows, digits, rank, rank),
 52            p: 0,
 53        }
 54    }
 55
 56    pub fn bytes_of(n: usize, basek: usize, k: usize, rows: usize, digits: usize, rank: usize) -> usize {
 57        GGLWESwitchingKeyCompressed::<Vec<u8>>::bytes_of(n, basek, k, rows, digits, rank)
 58    }
 59}
 60
 61impl<D: Data> Infos for GGLWEAutomorphismKeyCompressed<D> {
 62    type Inner = MatZnx<D>;
 63
 64    fn inner(&self) -> &Self::Inner {
 65        self.key.inner()
 66    }
 67
 68    fn basek(&self) -> usize {
 69        self.key.basek()
 70    }
 71
 72    fn k(&self) -> usize {
 73        self.key.k()
 74    }
 75}
 76
 77impl<D: Data> GGLWEAutomorphismKeyCompressed<D> {
 78    pub fn rank(&self) -> usize {
 79        self.key.rank()
 80    }
 81
 82    pub fn digits(&self) -> usize {
 83        self.key.digits()
 84    }
 85
 86    pub fn rank_in(&self) -> usize {
 87        self.key.rank_in()
 88    }
 89
 90    pub fn rank_out(&self) -> usize {
 91        self.key.rank_out()
 92    }
 93}
 94
 95impl<D: DataMut> ReaderFrom for GGLWEAutomorphismKeyCompressed<D> {
 96    fn read_from<R: std::io::Read>(&mut self, reader: &mut R) -> std::io::Result<()> {
 97        self.p = reader.read_u64::<LittleEndian>()? as i64;
 98        self.key.read_from(reader)
 99    }
100}
101
102impl<D: DataRef> WriterTo for GGLWEAutomorphismKeyCompressed<D> {
103    fn write_to<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
104        writer.write_u64::<LittleEndian>(self.p as u64)?;
105        self.key.write_to(writer)
106    }
107}
108
109impl<D: DataMut, DR: DataRef, B: Backend> Decompress<B, GGLWEAutomorphismKeyCompressed<DR>> for GGLWEAutomorphismKey<D> {
110    fn decompress(&mut self, module: &Module<B>, other: &GGLWEAutomorphismKeyCompressed<DR>)
111    where
112        Module<B>: VecZnxFillUniform + VecZnxCopy,
113    {
114        self.key.decompress(module, &other.key);
115        self.p = other.p;
116    }
117}