use itertools::Itertools;
use crate::algebra::scalar::Scalar;
pub trait SharedValueSource: Send + Sync {
fn next_shared_bit(&mut self) -> Scalar;
fn next_shared_bit_batch(&mut self, num_values: usize) -> Vec<Scalar> {
(0..num_values)
.map(|_| self.next_shared_bit())
.collect_vec()
}
fn next_shared_value(&mut self) -> Scalar;
fn next_shared_value_batch(&mut self, num_values: usize) -> Vec<Scalar> {
(0..num_values)
.map(|_| self.next_shared_value())
.collect_vec()
}
fn next_shared_inverse_pair(&mut self) -> (Scalar, Scalar);
fn next_shared_inverse_pair_batch(&mut self, num_pairs: usize) -> (Vec<Scalar>, Vec<Scalar>) {
(0..num_pairs)
.map(|_| self.next_shared_inverse_pair())
.unzip()
}
fn next_triplet(&mut self) -> (Scalar, Scalar, Scalar);
fn next_triplet_batch(
&mut self,
num_triplets: usize,
) -> (Vec<Scalar>, Vec<Scalar>, Vec<Scalar>) {
let mut a_vals = Vec::with_capacity(num_triplets);
let mut b_vals = Vec::with_capacity(num_triplets);
let mut c_vals = Vec::with_capacity(num_triplets);
for _ in 0..num_triplets {
let (a, b, c) = self.next_triplet();
a_vals.push(a);
b_vals.push(b);
c_vals.push(c);
}
(a_vals, b_vals, c_vals)
}
}
#[cfg(any(feature = "test_helpers", test))]
#[derive(Clone, Debug, Default)]
pub struct PartyIDBeaverSource {
party_id: u64,
}
#[cfg(any(feature = "test_helpers", test))]
impl PartyIDBeaverSource {
pub fn new(party_id: u64) -> Self {
Self { party_id }
}
}
#[cfg(any(feature = "test_helpers", test))]
impl SharedValueSource for PartyIDBeaverSource {
fn next_shared_bit(&mut self) -> Scalar {
assert!(self.party_id == 0 || self.party_id == 1);
Scalar::from(self.party_id)
}
fn next_triplet(&mut self) -> (Scalar, Scalar, Scalar) {
if self.party_id == 0 {
(Scalar::from(1u64), Scalar::from(3u64), Scalar::from(2u64))
} else {
(Scalar::from(1u64), Scalar::from(0u64), Scalar::from(4u64))
}
}
fn next_shared_inverse_pair(&mut self) -> (Scalar, Scalar) {
(Scalar::from(self.party_id), Scalar::from(self.party_id))
}
fn next_shared_value(&mut self) -> Scalar {
Scalar::from(self.party_id)
}
}