mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-04 23:03:08 +00:00
Switch Field type of generators to be F: RichField + Extendable<D>
This commit is contained in:
parent
ee5d1aa6c8
commit
d684ee2d8d
@ -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 {
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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![]
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()));
|
||||
}
|
||||
|
||||
@ -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>>,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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),+)?;
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user