use std::marker::PhantomData;
use primitives::{
algebra::{
elliptic_curve::Curve,
field::{binary::Gf2_128, mersenne::Mersenne107},
},
correlated_randomness::{
bundler::{errors::BundlerError, Bundler},
dabits::DaBit,
singlets::Singlet,
stream::CorrelatedStream,
triples::Triple,
},
};
use crate::{
circuit::preprocessing::CircuitPreprocessing,
errors::AbortError,
preprocessing::iterator::PreprocessingIterator,
};
pub struct StreamBundler<
C: Curve,
BFDS: CorrelatedStream<DaBit<C::BaseField>>,
BFSS: CorrelatedStream<Singlet<C::BaseField>>,
BFTS: CorrelatedStream<Triple<C::BaseField>>,
BSS: CorrelatedStream<Singlet<Gf2_128>>,
BTS: CorrelatedStream<Triple<Gf2_128>>,
MDS: CorrelatedStream<DaBit<Mersenne107>>,
MSS: CorrelatedStream<Singlet<Mersenne107>>,
MTS: CorrelatedStream<Triple<Mersenne107>>,
SDS: CorrelatedStream<DaBit<C::Scalar>>,
SSS: CorrelatedStream<Singlet<C::Scalar>>,
STS: CorrelatedStream<Triple<C::Scalar>>,
> {
pub basefield_dabit_stream: BFDS,
pub basefield_singlet_stream: BFSS,
pub basefield_triple_stream: BFTS,
pub binary_singlet_stream: BSS,
pub binary_triple_stream: BTS,
pub mersenne107_dabit_stream: MDS,
pub mersenne107_singlet_stream: MSS,
pub mersenne107_triple_stream: MTS,
pub scalar_dabit_stream: SDS,
pub scalar_singlet_stream: SSS,
pub scalar_triple_stream: STS,
pub _c: PhantomData<C>,
}
impl<C, BFDS, BFSS, BFTS, BSS, BTS, MDS, MSS, MTS, SDS, SSS, STS>
StreamBundler<C, BFDS, BFSS, BFTS, BSS, BTS, MDS, MSS, MTS, SDS, SSS, STS>
where
C: Curve,
BFDS: CorrelatedStream<DaBit<C::BaseField>>,
BFSS: CorrelatedStream<Singlet<C::BaseField>>,
BFTS: CorrelatedStream<Triple<C::BaseField>>,
BSS: CorrelatedStream<Singlet<Gf2_128>>,
BTS: CorrelatedStream<Triple<Gf2_128>>,
MDS: CorrelatedStream<DaBit<Mersenne107>>,
MSS: CorrelatedStream<Singlet<Mersenne107>>,
MTS: CorrelatedStream<Triple<Mersenne107>>,
SDS: CorrelatedStream<DaBit<C::Scalar>>,
SSS: CorrelatedStream<Singlet<C::Scalar>>,
STS: CorrelatedStream<Triple<C::Scalar>>,
{
#[allow(clippy::too_many_arguments)]
pub fn new(
basefield_dabit_stream: BFDS,
basefield_singlet_stream: BFSS,
basefield_triple_stream: BFTS,
binary_singlet_stream: BSS,
binary_triple_stream: BTS,
mersenne107_dabit_stream: MDS,
mersenne107_singlet_stream: MSS,
mersenne107_triple_stream: MTS,
scalar_dabit_stream: SDS,
scalar_singlet_stream: SSS,
scalar_triple_stream: STS,
) -> Self {
Self {
basefield_dabit_stream,
basefield_singlet_stream,
basefield_triple_stream,
binary_singlet_stream,
binary_triple_stream,
mersenne107_dabit_stream,
mersenne107_singlet_stream,
mersenne107_triple_stream,
scalar_dabit_stream,
scalar_singlet_stream,
scalar_triple_stream,
_c: PhantomData,
}
}
}
impl<C, BFDS, BFSS, BFTS, BSS, BTS, MDS, MSS, MTS, SDS, SSS, STS> Bundler
for StreamBundler<C, BFDS, BFSS, BFTS, BSS, BTS, MDS, MSS, MTS, SDS, SSS, STS>
where
C: Curve,
BFDS: CorrelatedStream<DaBit<C::BaseField>, Error = AbortError>,
BFSS: CorrelatedStream<Singlet<C::BaseField>, Error = AbortError>,
BFTS: CorrelatedStream<Triple<C::BaseField>, Error = AbortError>,
BSS: CorrelatedStream<Singlet<Gf2_128>, Error = AbortError>,
BTS: CorrelatedStream<Triple<Gf2_128>, Error = AbortError>,
MDS: CorrelatedStream<DaBit<Mersenne107>, Error = AbortError>,
MSS: CorrelatedStream<Singlet<Mersenne107>, Error = AbortError>,
MTS: CorrelatedStream<Triple<Mersenne107>, Error = AbortError>,
SDS: CorrelatedStream<DaBit<C::Scalar>, Error = AbortError>,
SSS: CorrelatedStream<Singlet<C::Scalar>, Error = AbortError>,
STS: CorrelatedStream<Triple<C::Scalar>, Error = AbortError>,
{
type Iterator = PreprocessingIterator<C>;
fn fetch(
&mut self,
req: &CircuitPreprocessing,
) -> Result<PreprocessingIterator<C>, BundlerError> {
Ok(PreprocessingIterator {
base_field_dabits: self
.basefield_dabit_stream
.next_n(req.base_field.dabits)?
.into_iter(),
base_field_singlets: self
.basefield_singlet_stream
.next_n(req.base_field.singlets)?
.into_iter(),
base_field_triples: self
.basefield_triple_stream
.next_n(req.base_field.triples)?
.into_iter(),
binary_singlets: self
.binary_singlet_stream
.next_n(req.bit_singlets)?
.into_iter(),
binary_triples: self
.binary_triple_stream
.next_n(req.bit_triples)?
.into_iter(),
mersenne107_dabits: self
.mersenne107_dabit_stream
.next_n(req.mersenne107.dabits)?
.into_iter(),
mersenne107_singlets: self
.mersenne107_singlet_stream
.next_n(req.mersenne107.singlets)?
.into_iter(),
mersenne107_triples: self
.mersenne107_triple_stream
.next_n(req.mersenne107.triples)?
.into_iter(),
scalar_dabits: self
.scalar_dabit_stream
.next_n(req.scalar.dabits)?
.into_iter(),
scalar_singlets: self
.scalar_singlet_stream
.next_n(req.scalar.singlets)?
.into_iter(),
scalar_triples: self
.scalar_triple_stream
.next_n(req.scalar.triples)?
.into_iter(),
})
}
}