poulpy/core/src/lwe/secret.rs
core/src/lwe/secret.rsRaw
1use backend::hal::{
2 api::{ZnxInfos, ZnxZero},
3 layouts::{Data, DataMut, ScalarZnx},
4};
5use sampling::source::Source;
6
7use crate::Distribution;
8
9pub struct LWESecret<D: Data> {
10 pub(crate) data: ScalarZnx<D>,
11 pub(crate) dist: Distribution,
12}
13
14impl LWESecret<Vec<u8>> {
15 pub fn alloc(n: usize) -> Self {
16 Self {
17 data: ScalarZnx::new(n, 1),
18 dist: Distribution::NONE,
19 }
20 }
21}
22
23impl<D: Data> LWESecret<D> {
24 pub fn n(&self) -> usize {
25 self.data.n()
26 }
27
28 pub fn log_n(&self) -> usize {
29 self.data.log_n()
30 }
31
32 pub fn rank(&self) -> usize {
33 self.data.cols()
34 }
35}
36
37impl<D: DataMut> LWESecret<D> {
38 pub fn fill_ternary_prob(&mut self, prob: f64, source: &mut Source) {
39 self.data.fill_ternary_prob(0, prob, source);
40 self.dist = Distribution::TernaryProb(prob);
41 }
42
43 pub fn fill_ternary_hw(&mut self, hw: usize, source: &mut Source) {
44 self.data.fill_ternary_hw(0, hw, source);
45 self.dist = Distribution::TernaryFixed(hw);
46 }
47
48 pub fn fill_binary_prob(&mut self, prob: f64, source: &mut Source) {
49 self.data.fill_binary_prob(0, prob, source);
50 self.dist = Distribution::BinaryProb(prob);
51 }
52
53 pub fn fill_binary_hw(&mut self, hw: usize, source: &mut Source) {
54 self.data.fill_binary_hw(0, hw, source);
55 self.dist = Distribution::BinaryFixed(hw);
56 }
57
58 pub fn fill_binary_block(&mut self, block_size: usize, source: &mut Source) {
59 self.data.fill_binary_block(0, block_size, source);
60 self.dist = Distribution::BinaryBlock(block_size);
61 }
62
63 pub fn fill_zero(&mut self) {
64 self.data.zero();
65 self.dist = Distribution::ZERO;
66 }
67}