1use itertools::Itertools;
5
6use crate::algebra::scalar::Scalar;
7
8pub trait SharedValueSource: Send + Sync {
14 fn next_shared_bit(&mut self) -> Scalar;
16 fn next_shared_bit_batch(&mut self, num_values: usize) -> Vec<Scalar> {
18 (0..num_values)
19 .map(|_| self.next_shared_bit())
20 .collect_vec()
21 }
22 fn next_shared_value(&mut self) -> Scalar;
24 fn next_shared_value_batch(&mut self, num_values: usize) -> Vec<Scalar> {
26 (0..num_values)
27 .map(|_| self.next_shared_value())
28 .collect_vec()
29 }
30 fn next_shared_inverse_pair(&mut self) -> (Scalar, Scalar);
32 fn next_shared_inverse_pair_batch(&mut self, num_pairs: usize) -> (Vec<Scalar>, Vec<Scalar>) {
34 (0..num_pairs)
35 .map(|_| self.next_shared_inverse_pair())
36 .unzip()
37 }
38 fn next_triplet(&mut self) -> (Scalar, Scalar, Scalar);
40 fn next_triplet_batch(
42 &mut self,
43 num_triplets: usize,
44 ) -> (Vec<Scalar>, Vec<Scalar>, Vec<Scalar>) {
45 let mut a_vals = Vec::with_capacity(num_triplets);
46 let mut b_vals = Vec::with_capacity(num_triplets);
47 let mut c_vals = Vec::with_capacity(num_triplets);
48
49 for _ in 0..num_triplets {
50 let (a, b, c) = self.next_triplet();
51 a_vals.push(a);
52 b_vals.push(b);
53 c_vals.push(c);
54 }
55
56 (a_vals, b_vals, c_vals)
57 }
58}
59#[cfg(any(feature = "test_helpers", test))]
62#[derive(Clone, Debug, Default)]
63pub struct PartyIDBeaverSource {
64 party_id: u64,
66}
67
68#[cfg(any(feature = "test_helpers", test))]
69impl PartyIDBeaverSource {
70 pub fn new(party_id: u64) -> Self {
72 Self { party_id }
73 }
74}
75
76#[cfg(any(feature = "test_helpers", test))]
79impl SharedValueSource for PartyIDBeaverSource {
80 fn next_shared_bit(&mut self) -> Scalar {
81 assert!(self.party_id == 0 || self.party_id == 1);
83 Scalar::from(self.party_id)
84 }
85
86 fn next_triplet(&mut self) -> (Scalar, Scalar, Scalar) {
87 if self.party_id == 0 {
88 (Scalar::from(1u64), Scalar::from(3u64), Scalar::from(2u64))
89 } else {
90 (Scalar::from(1u64), Scalar::from(0u64), Scalar::from(4u64))
91 }
92 }
93
94 fn next_shared_inverse_pair(&mut self) -> (Scalar, Scalar) {
95 (Scalar::from(self.party_id), Scalar::from(self.party_id))
96 }
97
98 fn next_shared_value(&mut self) -> Scalar {
99 Scalar::from(self.party_id)
100 }
101}