use backend::hal::{ api::{MatZnxAlloc, MatZnxAllocBytes, VecZnxCopy, VecZnxFillUniform}, layouts::{Backend, Data, DataMut, DataRef, MatZnx, Module, ReaderFrom, WriterTo}, }; use crate::{GGLWECiphertextCompressed, GGSWCiphertext, Infos}; #[derive(PartialEq, Eq)] pub struct GGSWCiphertextCompressed { pub(crate) data: GGLWECiphertextCompressed, } impl GGSWCiphertextCompressed> { pub fn alloc(module: &Module, basek: usize, k: usize, rows: usize, digits: usize, rank: usize) -> Self where Module: MatZnxAlloc, { GGSWCiphertextCompressed { data: GGLWECiphertextCompressed::alloc(module, basek, k, rows, digits, rank, rank), } } pub fn bytes_of(module: &Module, basek: usize, k: usize, rows: usize, digits: usize, rank: usize) -> usize where Module: MatZnxAllocBytes, { GGLWECiphertextCompressed::bytes_of(module, basek, k, rows, digits, rank) } } impl Infos for GGSWCiphertextCompressed { type Inner = MatZnx; fn inner(&self) -> &Self::Inner { self.data.inner() } fn basek(&self) -> usize { self.data.basek() } fn k(&self) -> usize { self.data.k() } } impl GGSWCiphertextCompressed { pub fn rank(&self) -> usize { self.data.rank() } pub fn digits(&self) -> usize { self.data.digits() } } impl ReaderFrom for GGSWCiphertextCompressed { fn read_from(&mut self, reader: &mut R) -> std::io::Result<()> { self.data.read_from(reader) } } impl WriterTo for GGSWCiphertextCompressed { fn write_to(&self, writer: &mut W) -> std::io::Result<()> { self.data.write_to(writer) } } impl GGSWCiphertext { pub fn decompress(&mut self, module: &Module, other: &GGSWCiphertextCompressed) where Module: VecZnxFillUniform + VecZnxCopy, { let rows = self.rows(); (0..rows).for_each(|row_i| { self.at_mut(row_i, 0) .decompress(module, &other.data.at(row_i, 0)); }); } }