Switch Field type of generators to be F: RichField + Extendable<D>

This commit is contained in:
Robin Salen 2023-06-28 07:59:07 -04:00
parent ee5d1aa6c8
commit d684ee2d8d
No known key found for this signature in database
GPG Key ID: F98FD38F65687358
29 changed files with 89 additions and 73 deletions

View File

@ -32,7 +32,7 @@ struct SquareRootGenerator<F: RichField + Extendable<D>, const D: usize> {
_phantom: PhantomData<F>,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
for SquareRootGenerator<F, D>
{
fn id(&self) -> String {

View File

@ -379,7 +379,7 @@ pub struct EqualityGenerator {
inv: Target,
}
impl<F: RichField> SimpleGenerator<F> for EqualityGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for EqualityGenerator {
fn id(&self) -> String {
"EqualityGenerator".to_string()
}

View File

@ -501,7 +501,7 @@ pub struct QuotientGeneratorExtension<const D: usize> {
quotient: ExtensionTarget<D>,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
for QuotientGeneratorExtension<D>
{
fn id(&self) -> String {

View File

@ -60,7 +60,7 @@ pub struct LowHighGenerator {
high: Target,
}
impl<F: RichField> SimpleGenerator<F> for LowHighGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for LowHighGenerator {
fn id(&self) -> String {
"LowHighGenerator".to_string()
}

View File

@ -5,7 +5,6 @@ use core::borrow::Borrow;
use itertools::Itertools;
use crate::field::extension::Extendable;
use crate::field::types::Field;
use crate::gates::base_sum::BaseSumGate;
use crate::hash::hash_types::RichField;
use crate::iop::generator::{GeneratedValues, SimpleGenerator};
@ -86,7 +85,9 @@ pub struct BaseSumGenerator<const B: usize> {
limbs: Vec<BoolTarget>,
}
impl<F: Field, const B: usize> SimpleGenerator<F> for BaseSumGenerator<B> {
impl<F: RichField + Extendable<D>, const B: usize, const D: usize> SimpleGenerator<F, D>
for BaseSumGenerator<B>
{
fn id(&self) -> String {
"BaseSumGenerator".to_string()
}

View File

@ -62,7 +62,7 @@ pub struct SplitGenerator {
bits: Vec<Target>,
}
impl<F: RichField> SimpleGenerator<F> for SplitGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for SplitGenerator {
fn id(&self) -> String {
"SplitGenerator".to_string()
}
@ -105,7 +105,7 @@ pub struct WireSplitGenerator {
num_limbs: usize,
}
impl<F: RichField> SimpleGenerator<F> for WireSplitGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for WireSplitGenerator {
fn id(&self) -> String {
"WireSplitGenerator".to_string()
}

View File

@ -126,7 +126,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ArithmeticGate
constraints
}
fn generators(&self, row: usize, local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
(0..self.num_ops)
.map(|i| {
WitnessGeneratorRef::new(
@ -188,7 +188,7 @@ pub struct ArithmeticBaseGenerator<F: RichField + Extendable<D>, const D: usize>
i: usize,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
for ArithmeticBaseGenerator<F, D>
{
fn id(&self) -> String {

View File

@ -131,7 +131,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ArithmeticExte
constraints
}
fn generators(&self, row: usize, local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
(0..self.num_ops)
.map(|i| {
WitnessGeneratorRef::new(
@ -172,7 +172,7 @@ pub struct ArithmeticExtensionGenerator<F: RichField + Extendable<D>, const D: u
i: usize,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
for ArithmeticExtensionGenerator<F, D>
{
fn id(&self) -> String {

View File

@ -118,7 +118,7 @@ impl<F: RichField + Extendable<D>, const D: usize, const B: usize> Gate<F, D> fo
constraints
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
let gen = BaseSplitGenerator::<B> {
row,
num_limbs: self.num_limbs,
@ -175,7 +175,9 @@ pub struct BaseSplitGenerator<const B: usize> {
num_limbs: usize,
}
impl<F: RichField, const B: usize> SimpleGenerator<F> for BaseSplitGenerator<B> {
impl<F: RichField + Extendable<D>, const B: usize, const D: usize> SimpleGenerator<F, D>
for BaseSplitGenerator<B>
{
fn id(&self) -> String {
"BaseSplitGenerator".to_string()
}

View File

@ -86,7 +86,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ConstantGate {
.collect()
}
fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
vec![]
}

View File

@ -362,7 +362,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for CosetInterpola
constraints
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
let gen = InterpolationGenerator::<F, D>::new(row, self.clone());
vec![WitnessGeneratorRef::new(gen.adapter())]
}
@ -406,7 +406,7 @@ impl<F: RichField + Extendable<D>, const D: usize> InterpolationGenerator<F, D>
}
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
for InterpolationGenerator<F, D>
{
fn id(&self) -> String {

View File

@ -173,7 +173,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for Exponentiation
constraints
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
let gen = ExponentiationGenerator::<F, D> {
row,
gate: self.clone(),
@ -243,7 +243,7 @@ pub struct ExponentiationGenerator<F: RichField + Extendable<D>, const D: usize>
gate: ExponentiationGate<F, D>,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
for ExponentiationGenerator<F, D>
{
fn id(&self) -> String {

View File

@ -175,7 +175,7 @@ pub trait Gate<F: RichField + Extendable<D>, const D: usize>: 'static + Send + S
/// The generators used to populate the witness.
/// Note: This should return exactly 1 generator per operation in the gate.
fn generators(&self, row: usize, local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>>;
fn generators(&self, row: usize, local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>>;
/// The number of wires used by this gate.
fn num_wires(&self) -> usize;

View File

@ -101,7 +101,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for LookupGate {
vec![]
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
(0..self.num_slots)
.map(|i| {
WitnessGeneratorRef::new(
@ -149,7 +149,7 @@ pub struct LookupGenerator {
slot_nb: usize,
}
impl<F: RichField> SimpleGenerator<F> for LookupGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for LookupGenerator {
fn id(&self) -> String {
"LookupGenerator".to_string()
}

View File

@ -116,7 +116,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for LookupTableGat
vec![]
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
(0..self.num_slots)
.map(|i| {
WitnessGeneratorRef::new(
@ -168,7 +168,7 @@ pub struct LookupTableGenerator {
last_lut_row: usize,
}
impl<F: RichField> SimpleGenerator<F> for LookupTableGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for LookupTableGenerator {
fn id(&self) -> String {
"LookupTableGenerator".to_string()
}

View File

@ -119,7 +119,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for MulExtensionGa
constraints
}
fn generators(&self, row: usize, local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
(0..self.num_ops)
.map(|i| {
WitnessGeneratorRef::new(
@ -158,7 +158,7 @@ pub struct MulExtensionGenerator<F: RichField + Extendable<D>, const D: usize> {
i: usize,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
for MulExtensionGenerator<F, D>
{
fn id(&self) -> String {

View File

@ -42,7 +42,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for NoopGate {
Vec::new()
}
fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
Vec::new()
}

View File

@ -380,7 +380,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for PoseidonGate<F
constraints
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
let gen = PoseidonGenerator::<F, D> {
row,
_phantom: PhantomData,
@ -415,7 +415,7 @@ pub struct PoseidonGenerator<F: RichField + Extendable<D> + Poseidon, const D: u
_phantom: PhantomData<F>,
}
impl<F: RichField + Extendable<D> + Poseidon, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D> + Poseidon, const D: usize> SimpleGenerator<F, D>
for PoseidonGenerator<F, D>
{
fn id(&self) -> String {

View File

@ -187,7 +187,7 @@ impl<F: RichField + Extendable<D> + Poseidon, const D: usize> Gate<F, D> for Pos
.collect()
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
let gen = PoseidonMdsGenerator::<D> { row };
vec![WitnessGeneratorRef::new(gen.adapter())]
}
@ -214,7 +214,7 @@ pub struct PoseidonMdsGenerator<const D: usize> {
row: usize,
}
impl<F: RichField + Extendable<D> + Poseidon, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D> + Poseidon, const D: usize> SimpleGenerator<F, D>
for PoseidonMdsGenerator<D>
{
fn id(&self) -> String {

View File

@ -72,7 +72,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for PublicInputGat
.collect()
}
fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
Vec::new()
}

View File

@ -252,7 +252,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for RandomAccessGa
constraints
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
(0..self.num_copies)
.map(|copy| {
WitnessGeneratorRef::new(
@ -345,7 +345,7 @@ pub struct RandomAccessGenerator<F: RichField + Extendable<D>, const D: usize> {
copy: usize,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F>
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D>
for RandomAccessGenerator<F, D>
{
fn id(&self) -> String {

View File

@ -150,7 +150,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ReducingGate<D
.collect()
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
vec![WitnessGeneratorRef::new(
ReducingGenerator {
row,
@ -183,7 +183,7 @@ pub struct ReducingGenerator<const D: usize> {
gate: ReducingGate<D>,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F> for ReducingGenerator<D> {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for ReducingGenerator<D> {
fn id(&self) -> String {
"ReducingGenerator".to_string()
}

View File

@ -150,7 +150,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ReducingExtens
.collect()
}
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F>> {
fn generators(&self, row: usize, _local_constants: &[F]) -> Vec<WitnessGeneratorRef<F, D>> {
vec![WitnessGeneratorRef::new(
ReducingGenerator {
row,
@ -183,7 +183,7 @@ pub struct ReducingGenerator<const D: usize> {
gate: ReducingExtensionGate<D>,
}
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F> for ReducingGenerator<D> {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for ReducingGenerator<D> {
fn id(&self) -> String {
"ReducingExtensionGenerator".to_string()
}

View File

@ -98,7 +98,9 @@ pub(crate) fn generate_partial_witness<
}
/// A generator participates in the generation of the witness.
pub trait WitnessGenerator<F: Field>: 'static + Send + Sync + Debug {
pub trait WitnessGenerator<F: RichField + Extendable<D>, const D: usize>:
'static + Send + Sync + Debug
{
fn id(&self) -> String;
/// Targets to be "watched" by this generator. Whenever a target in the watch list is populated,
@ -119,23 +121,25 @@ pub trait WitnessGenerator<F: Field>: 'static + Send + Sync + Debug {
/// A wrapper around an `Box<WitnessGenerator>` which implements `PartialEq`
/// and `Eq` based on generator IDs.
pub struct WitnessGeneratorRef<F: Field>(pub Box<dyn WitnessGenerator<F>>);
pub struct WitnessGeneratorRef<F: RichField + Extendable<D>, const D: usize>(
pub Box<dyn WitnessGenerator<F, D>>,
);
impl<F: Field> WitnessGeneratorRef<F> {
pub fn new<G: WitnessGenerator<F>>(generator: G) -> WitnessGeneratorRef<F> {
impl<F: RichField + Extendable<D>, const D: usize> WitnessGeneratorRef<F, D> {
pub fn new<G: WitnessGenerator<F, D>>(generator: G) -> WitnessGeneratorRef<F, D> {
WitnessGeneratorRef(Box::new(generator))
}
}
impl<F: Field> PartialEq for WitnessGeneratorRef<F> {
impl<F: RichField + Extendable<D>, const D: usize> PartialEq for WitnessGeneratorRef<F, D> {
fn eq(&self, other: &Self) -> bool {
self.0.id() == other.0.id()
}
}
impl<F: Field> Eq for WitnessGeneratorRef<F> {}
impl<F: RichField + Extendable<D>, const D: usize> Eq for WitnessGeneratorRef<F, D> {}
impl<F: Field> Debug for WitnessGeneratorRef<F> {
impl<F: RichField + Extendable<D>, const D: usize> Debug for WitnessGeneratorRef<F, D> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{}", self.0.id())
}
@ -190,14 +194,16 @@ impl<F: Field> GeneratedValues<F> {
}
/// A generator which runs once after a list of dependencies is present in the witness.
pub trait SimpleGenerator<F: Field>: 'static + Send + Sync + Debug {
pub trait SimpleGenerator<F: RichField + Extendable<D>, const D: usize>:
'static + Send + Sync + Debug
{
fn id(&self) -> String;
fn dependencies(&self) -> Vec<Target>;
fn run_once(&self, witness: &PartitionWitness<F>, out_buffer: &mut GeneratedValues<F>);
fn adapter(self) -> SimpleGeneratorAdapter<F, Self>
fn adapter(self) -> SimpleGeneratorAdapter<F, Self, D>
where
Self: Sized,
{
@ -215,12 +221,18 @@ pub trait SimpleGenerator<F: Field>: 'static + Send + Sync + Debug {
}
#[derive(Debug)]
pub struct SimpleGeneratorAdapter<F: Field, SG: SimpleGenerator<F> + ?Sized> {
pub struct SimpleGeneratorAdapter<
F: RichField + Extendable<D>,
SG: SimpleGenerator<F, D> + ?Sized,
const D: usize,
> {
_phantom: PhantomData<F>,
inner: SG,
}
impl<F: Field, SG: SimpleGenerator<F>> WitnessGenerator<F> for SimpleGeneratorAdapter<F, SG> {
impl<F: RichField + Extendable<D>, SG: SimpleGenerator<F, D>, const D: usize> WitnessGenerator<F, D>
for SimpleGeneratorAdapter<F, SG, D>
{
fn id(&self) -> String {
self.inner.id()
}
@ -257,7 +269,7 @@ pub struct CopyGenerator {
pub(crate) dst: Target,
}
impl<F: Field> SimpleGenerator<F> for CopyGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for CopyGenerator {
fn id(&self) -> String {
"CopyGenerator".to_string()
}
@ -289,7 +301,7 @@ pub struct RandomValueGenerator {
pub(crate) target: Target,
}
impl<F: Field> SimpleGenerator<F> for RandomValueGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for RandomValueGenerator {
fn id(&self) -> String {
"RandomValueGenerator".to_string()
}
@ -320,7 +332,7 @@ pub struct NonzeroTestGenerator {
pub(crate) dummy: Target,
}
impl<F: Field> SimpleGenerator<F> for NonzeroTestGenerator {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for NonzeroTestGenerator {
fn id(&self) -> String {
"NonzeroTestGenerator".to_string()
}
@ -368,7 +380,7 @@ impl<F: Field> ConstantGenerator<F> {
}
}
impl<F: RichField> SimpleGenerator<F> for ConstantGenerator<F> {
impl<F: RichField + Extendable<D>, const D: usize> SimpleGenerator<F, D> for ConstantGenerator<F> {
fn id(&self) -> String {
"ConstantGenerator".to_string()
}

View File

@ -109,7 +109,7 @@ pub struct CircuitBuilder<F: RichField + Extendable<D>, const D: usize> {
context_log: ContextTree,
/// Generators used to generate the witness.
generators: Vec<WitnessGeneratorRef<F>>,
generators: Vec<WitnessGeneratorRef<F, D>>,
constants_to_targets: HashMap<F, Target>,
targets_to_constants: HashMap<Target, F>,
@ -444,11 +444,11 @@ impl<F: RichField + Extendable<D>, const D: usize> CircuitBuilder<F, D> {
self.connect(x, one);
}
pub fn add_generators(&mut self, generators: Vec<WitnessGeneratorRef<F>>) {
pub fn add_generators(&mut self, generators: Vec<WitnessGeneratorRef<F, D>>) {
self.generators.extend(generators);
}
pub fn add_simple_generator<G: SimpleGenerator<F>>(&mut self, generator: G) {
pub fn add_simple_generator<G: SimpleGenerator<F, D>>(&mut self, generator: G) {
self.generators
.push(WitnessGeneratorRef::new(generator.adapter()));
}

View File

@ -295,7 +295,7 @@ pub struct ProverOnlyCircuitData<
C: GenericConfig<D, F = F>,
const D: usize,
> {
pub generators: Vec<WitnessGeneratorRef<F>>,
pub generators: Vec<WitnessGeneratorRef<F, D>>,
/// Generator indices (within the `Vec` above), indexed by the representative of each target
/// they watch.
pub generator_indices_by_watches: BTreeMap<usize, Vec<usize>>,

View File

@ -238,7 +238,7 @@ where
}
}
impl<F, C, const D: usize> SimpleGenerator<F> for DummyProofGenerator<F, C, D>
impl<F, C, const D: usize> SimpleGenerator<F, D> for DummyProofGenerator<F, C, D>
where
F: RichField + Extendable<D>,
C: GenericConfig<D, F = F> + 'static,

View File

@ -11,12 +11,13 @@ pub trait WitnessGeneratorSerializer<F: RichField + Extendable<D>, const D: usiz
fn read_generator(
&self,
buf: &mut Buffer,
common: &CommonCircuitData<F, D>,
) -> IoResult<WitnessGeneratorRef<F>>;
cd: &CommonCircuitData<F, D>,
) -> IoResult<WitnessGeneratorRef<F, D>>;
fn write_generator(
&self,
buf: &mut Vec<u8>,
generator: &WitnessGeneratorRef<F>,
generator: &WitnessGeneratorRef<F, D>,
) -> IoResult<()>;
}
@ -30,16 +31,16 @@ macro_rules! read_generator_impl {
if tag == 0 {
let generator: $crate::recursion::dummy_circuit::DummyProofGenerator<F, C, D> =
$crate::recursion::dummy_circuit::DummyProofGenerator::deserialize_with_circuit_data(buf, $common)?;
return Ok($crate::iop::generator::WitnessGeneratorRef::<F>::new(
$crate::iop::generator::SimpleGenerator::<F>::adapter(generator),
return Ok($crate::iop::generator::WitnessGeneratorRef::<F, D>::new(
$crate::iop::generator::SimpleGenerator::<F, D>::adapter(generator),
));
}
$(if tag == i.next().unwrap() {
let generator =
<$generator_types as $crate::iop::generator::SimpleGenerator<F>>::deserialize(buf)?;
Ok($crate::iop::generator::WitnessGeneratorRef::<F>::new(
$crate::iop::generator::SimpleGenerator::<F>::adapter(generator),
<$generator_types as $crate::iop::generator::SimpleGenerator<F, D>>::deserialize(buf)?;
Ok($crate::iop::generator::WitnessGeneratorRef::<F, D>::new(
$crate::iop::generator::SimpleGenerator::<F, D>::adapter(generator),
))
} else)*
{
@ -52,7 +53,7 @@ macro_rules! read_generator_impl {
macro_rules! get_generator_tag_impl {
($generator:expr, $($generator_types:ty),+) => {{
let mut i = 0..;
$(if let (tag, true) = (i.next().unwrap(), $generator.0.id() == $crate::iop::generator::SimpleGenerator::<F>::id(&<$generator_types>::default())) {
$(if let (tag, true) = (i.next().unwrap(), $generator.0.id() == $crate::iop::generator::SimpleGenerator::<F, D>::id(&<$generator_types>::default())) {
Ok(tag)
} else)*
{
@ -77,7 +78,7 @@ macro_rules! impl_generator_serializer {
&self,
buf: &mut $crate::util::serialization::Buffer,
common: &$crate::plonk::circuit_data::CommonCircuitData<F, D>,
) -> $crate::util::serialization::IoResult<$crate::iop::generator::WitnessGeneratorRef<F>> {
) -> $crate::util::serialization::IoResult<$crate::iop::generator::WitnessGeneratorRef<F, D>> {
let tag = $crate::util::serialization::Read::read_u32(buf)?;
read_generator_impl!(buf, tag, common, $($generator_types),+)
}
@ -85,7 +86,7 @@ macro_rules! impl_generator_serializer {
fn write_generator(
&self,
buf: &mut Vec<u8>,
generator: &$crate::iop::generator::WitnessGeneratorRef<F>,
generator: &$crate::iop::generator::WitnessGeneratorRef<F, D>,
) -> $crate::util::serialization::IoResult<()> {
let tag = get_generator_tag_impl!(generator, $($generator_types),+)?;

View File

@ -690,7 +690,7 @@ pub trait Read {
&mut self,
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
common_data: &CommonCircuitData<F, D>,
) -> IoResult<WitnessGeneratorRef<F>>;
) -> IoResult<WitnessGeneratorRef<F, D>>;
fn read_selectors_info(&mut self) -> IoResult<SelectorsInfo> {
let selector_indices = self.read_usize_vec()?;
@ -1693,7 +1693,7 @@ pub trait Write {
fn write_generator<F: RichField + Extendable<D>, const D: usize>(
&mut self,
generator: &WitnessGeneratorRef<F>,
generator: &WitnessGeneratorRef<F, D>,
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
) -> IoResult<()>;
@ -2116,7 +2116,7 @@ impl Write for Vec<u8> {
fn write_generator<F: RichField + Extendable<D>, const D: usize>(
&mut self,
generator: &WitnessGeneratorRef<F>,
generator: &WitnessGeneratorRef<F, D>,
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
) -> IoResult<()> {
generator_serializer.write_generator(self, generator)
@ -2186,7 +2186,7 @@ impl<'a> Read for Buffer<'a> {
&mut self,
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
common_data: &CommonCircuitData<F, D>,
) -> IoResult<WitnessGeneratorRef<F>> {
) -> IoResult<WitnessGeneratorRef<F, D>> {
generator_serializer.read_generator(self, common_data)
}
}