poulpy_core/layouts/
lwe_sk.rs

1use poulpy_hal::{
2    layouts::{Data, DataMut, DataRef, ScalarZnx, ZnxInfos, ZnxView, ZnxZero},
3    source::Source,
4};
5
6use crate::dist::Distribution;
7
8pub struct LWESecret<D: Data> {
9    pub(crate) data: ScalarZnx<D>,
10    pub(crate) dist: Distribution,
11}
12
13impl LWESecret<Vec<u8>> {
14    pub fn alloc(n: usize) -> Self {
15        Self {
16            data: ScalarZnx::alloc(n, 1),
17            dist: Distribution::NONE,
18        }
19    }
20}
21
22impl<D: DataRef> LWESecret<D> {
23    pub fn raw(&self) -> &[i64] {
24        self.data.at(0, 0)
25    }
26
27    pub fn dist(&self) -> Distribution {
28        self.dist
29    }
30
31    pub fn data(&self) -> &ScalarZnx<D> {
32        &self.data
33    }
34}
35
36impl<D: Data> LWESecret<D> {
37    pub fn n(&self) -> usize {
38        self.data.n()
39    }
40
41    pub fn log_n(&self) -> usize {
42        self.data.log_n()
43    }
44
45    pub fn rank(&self) -> usize {
46        self.data.cols()
47    }
48}
49
50impl<D: DataMut> LWESecret<D> {
51    pub fn fill_ternary_prob(&mut self, prob: f64, source: &mut Source) {
52        self.data.fill_ternary_prob(0, prob, source);
53        self.dist = Distribution::TernaryProb(prob);
54    }
55
56    pub fn fill_ternary_hw(&mut self, hw: usize, source: &mut Source) {
57        self.data.fill_ternary_hw(0, hw, source);
58        self.dist = Distribution::TernaryFixed(hw);
59    }
60
61    pub fn fill_binary_prob(&mut self, prob: f64, source: &mut Source) {
62        self.data.fill_binary_prob(0, prob, source);
63        self.dist = Distribution::BinaryProb(prob);
64    }
65
66    pub fn fill_binary_hw(&mut self, hw: usize, source: &mut Source) {
67        self.data.fill_binary_hw(0, hw, source);
68        self.dist = Distribution::BinaryFixed(hw);
69    }
70
71    pub fn fill_binary_block(&mut self, block_size: usize, source: &mut Source) {
72        self.data.fill_binary_block(0, block_size, source);
73        self.dist = Distribution::BinaryBlock(block_size);
74    }
75
76    pub fn fill_zero(&mut self) {
77        self.data.zero();
78        self.dist = Distribution::ZERO;
79    }
80}