poulpy_core/layouts/
lwe_sk.rs1use 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}