mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-07 16:23:12 +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>,
|
_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>
|
for SquareRootGenerator<F, D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -379,7 +379,7 @@ pub struct EqualityGenerator {
|
|||||||
inv: Target,
|
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 {
|
fn id(&self) -> String {
|
||||||
"EqualityGenerator".to_string()
|
"EqualityGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -501,7 +501,7 @@ pub struct QuotientGeneratorExtension<const D: usize> {
|
|||||||
quotient: ExtensionTarget<D>,
|
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>
|
for QuotientGeneratorExtension<D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -60,7 +60,7 @@ pub struct LowHighGenerator {
|
|||||||
high: Target,
|
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 {
|
fn id(&self) -> String {
|
||||||
"LowHighGenerator".to_string()
|
"LowHighGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,6 @@ use core::borrow::Borrow;
|
|||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
|
||||||
use crate::field::extension::Extendable;
|
use crate::field::extension::Extendable;
|
||||||
use crate::field::types::Field;
|
|
||||||
use crate::gates::base_sum::BaseSumGate;
|
use crate::gates::base_sum::BaseSumGate;
|
||||||
use crate::hash::hash_types::RichField;
|
use crate::hash::hash_types::RichField;
|
||||||
use crate::iop::generator::{GeneratedValues, SimpleGenerator};
|
use crate::iop::generator::{GeneratedValues, SimpleGenerator};
|
||||||
@ -86,7 +85,9 @@ pub struct BaseSumGenerator<const B: usize> {
|
|||||||
limbs: Vec<BoolTarget>,
|
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 {
|
fn id(&self) -> String {
|
||||||
"BaseSumGenerator".to_string()
|
"BaseSumGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -62,7 +62,7 @@ pub struct SplitGenerator {
|
|||||||
bits: Vec<Target>,
|
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 {
|
fn id(&self) -> String {
|
||||||
"SplitGenerator".to_string()
|
"SplitGenerator".to_string()
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ pub struct WireSplitGenerator {
|
|||||||
num_limbs: usize,
|
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 {
|
fn id(&self) -> String {
|
||||||
"WireSplitGenerator".to_string()
|
"WireSplitGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -126,7 +126,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ArithmeticGate
|
|||||||
constraints
|
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)
|
(0..self.num_ops)
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
WitnessGeneratorRef::new(
|
WitnessGeneratorRef::new(
|
||||||
@ -188,7 +188,7 @@ pub struct ArithmeticBaseGenerator<F: RichField + Extendable<D>, const D: usize>
|
|||||||
i: 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>
|
for ArithmeticBaseGenerator<F, D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -131,7 +131,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ArithmeticExte
|
|||||||
constraints
|
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)
|
(0..self.num_ops)
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
WitnessGeneratorRef::new(
|
WitnessGeneratorRef::new(
|
||||||
@ -172,7 +172,7 @@ pub struct ArithmeticExtensionGenerator<F: RichField + Extendable<D>, const D: u
|
|||||||
i: 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 ArithmeticExtensionGenerator<F, D>
|
for ArithmeticExtensionGenerator<F, D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -118,7 +118,7 @@ impl<F: RichField + Extendable<D>, const D: usize, const B: usize> Gate<F, D> fo
|
|||||||
constraints
|
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> {
|
let gen = BaseSplitGenerator::<B> {
|
||||||
row,
|
row,
|
||||||
num_limbs: self.num_limbs,
|
num_limbs: self.num_limbs,
|
||||||
@ -175,7 +175,9 @@ pub struct BaseSplitGenerator<const B: usize> {
|
|||||||
num_limbs: 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 {
|
fn id(&self) -> String {
|
||||||
"BaseSplitGenerator".to_string()
|
"BaseSplitGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -86,7 +86,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ConstantGate {
|
|||||||
.collect()
|
.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![]
|
vec![]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -362,7 +362,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for CosetInterpola
|
|||||||
constraints
|
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());
|
let gen = InterpolationGenerator::<F, D>::new(row, self.clone());
|
||||||
vec![WitnessGeneratorRef::new(gen.adapter())]
|
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>
|
for InterpolationGenerator<F, D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -173,7 +173,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for Exponentiation
|
|||||||
constraints
|
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> {
|
let gen = ExponentiationGenerator::<F, D> {
|
||||||
row,
|
row,
|
||||||
gate: self.clone(),
|
gate: self.clone(),
|
||||||
@ -243,7 +243,7 @@ pub struct ExponentiationGenerator<F: RichField + Extendable<D>, const D: usize>
|
|||||||
gate: ExponentiationGate<F, D>,
|
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>
|
for ExponentiationGenerator<F, D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
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.
|
/// The generators used to populate the witness.
|
||||||
/// Note: This should return exactly 1 generator per operation in the gate.
|
/// 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.
|
/// The number of wires used by this gate.
|
||||||
fn num_wires(&self) -> usize;
|
fn num_wires(&self) -> usize;
|
||||||
|
|||||||
@ -101,7 +101,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for LookupGate {
|
|||||||
vec![]
|
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)
|
(0..self.num_slots)
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
WitnessGeneratorRef::new(
|
WitnessGeneratorRef::new(
|
||||||
@ -149,7 +149,7 @@ pub struct LookupGenerator {
|
|||||||
slot_nb: usize,
|
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 {
|
fn id(&self) -> String {
|
||||||
"LookupGenerator".to_string()
|
"LookupGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -116,7 +116,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for LookupTableGat
|
|||||||
vec![]
|
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)
|
(0..self.num_slots)
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
WitnessGeneratorRef::new(
|
WitnessGeneratorRef::new(
|
||||||
@ -168,7 +168,7 @@ pub struct LookupTableGenerator {
|
|||||||
last_lut_row: usize,
|
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 {
|
fn id(&self) -> String {
|
||||||
"LookupTableGenerator".to_string()
|
"LookupTableGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -119,7 +119,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for MulExtensionGa
|
|||||||
constraints
|
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)
|
(0..self.num_ops)
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
WitnessGeneratorRef::new(
|
WitnessGeneratorRef::new(
|
||||||
@ -158,7 +158,7 @@ pub struct MulExtensionGenerator<F: RichField + Extendable<D>, const D: usize> {
|
|||||||
i: 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>
|
for MulExtensionGenerator<F, D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -42,7 +42,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for NoopGate {
|
|||||||
Vec::new()
|
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()
|
Vec::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -380,7 +380,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for PoseidonGate<F
|
|||||||
constraints
|
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> {
|
let gen = PoseidonGenerator::<F, D> {
|
||||||
row,
|
row,
|
||||||
_phantom: PhantomData,
|
_phantom: PhantomData,
|
||||||
@ -415,7 +415,7 @@ pub struct PoseidonGenerator<F: RichField + Extendable<D> + Poseidon, const D: u
|
|||||||
_phantom: PhantomData<F>,
|
_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>
|
for PoseidonGenerator<F, D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -187,7 +187,7 @@ impl<F: RichField + Extendable<D> + Poseidon, const D: usize> Gate<F, D> for Pos
|
|||||||
.collect()
|
.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 };
|
let gen = PoseidonMdsGenerator::<D> { row };
|
||||||
vec![WitnessGeneratorRef::new(gen.adapter())]
|
vec![WitnessGeneratorRef::new(gen.adapter())]
|
||||||
}
|
}
|
||||||
@ -214,7 +214,7 @@ pub struct PoseidonMdsGenerator<const D: usize> {
|
|||||||
row: 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>
|
for PoseidonMdsGenerator<D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -72,7 +72,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for PublicInputGat
|
|||||||
.collect()
|
.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()
|
Vec::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -252,7 +252,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for RandomAccessGa
|
|||||||
constraints
|
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)
|
(0..self.num_copies)
|
||||||
.map(|copy| {
|
.map(|copy| {
|
||||||
WitnessGeneratorRef::new(
|
WitnessGeneratorRef::new(
|
||||||
@ -345,7 +345,7 @@ pub struct RandomAccessGenerator<F: RichField + Extendable<D>, const D: usize> {
|
|||||||
copy: 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>
|
for RandomAccessGenerator<F, D>
|
||||||
{
|
{
|
||||||
fn id(&self) -> String {
|
fn id(&self) -> String {
|
||||||
|
|||||||
@ -150,7 +150,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ReducingGate<D
|
|||||||
.collect()
|
.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(
|
vec![WitnessGeneratorRef::new(
|
||||||
ReducingGenerator {
|
ReducingGenerator {
|
||||||
row,
|
row,
|
||||||
@ -183,7 +183,7 @@ pub struct ReducingGenerator<const D: usize> {
|
|||||||
gate: ReducingGate<D>,
|
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 {
|
fn id(&self) -> String {
|
||||||
"ReducingGenerator".to_string()
|
"ReducingGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,7 +150,7 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ReducingExtens
|
|||||||
.collect()
|
.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(
|
vec![WitnessGeneratorRef::new(
|
||||||
ReducingGenerator {
|
ReducingGenerator {
|
||||||
row,
|
row,
|
||||||
@ -183,7 +183,7 @@ pub struct ReducingGenerator<const D: usize> {
|
|||||||
gate: ReducingExtensionGate<D>,
|
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 {
|
fn id(&self) -> String {
|
||||||
"ReducingExtensionGenerator".to_string()
|
"ReducingExtensionGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -98,7 +98,9 @@ pub(crate) fn generate_partial_witness<
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A generator participates in the generation of the 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;
|
fn id(&self) -> String;
|
||||||
|
|
||||||
/// Targets to be "watched" by this generator. Whenever a target in the watch list is populated,
|
/// 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`
|
/// A wrapper around an `Box<WitnessGenerator>` which implements `PartialEq`
|
||||||
/// and `Eq` based on generator IDs.
|
/// 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> {
|
impl<F: RichField + Extendable<D>, const D: usize> WitnessGeneratorRef<F, D> {
|
||||||
pub fn new<G: WitnessGenerator<F>>(generator: G) -> WitnessGeneratorRef<F> {
|
pub fn new<G: WitnessGenerator<F, D>>(generator: G) -> WitnessGeneratorRef<F, D> {
|
||||||
WitnessGeneratorRef(Box::new(generator))
|
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 {
|
fn eq(&self, other: &Self) -> bool {
|
||||||
self.0.id() == other.0.id()
|
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 {
|
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||||
write!(f, "{}", self.0.id())
|
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.
|
/// 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 id(&self) -> String;
|
||||||
|
|
||||||
fn dependencies(&self) -> Vec<Target>;
|
fn dependencies(&self) -> Vec<Target>;
|
||||||
|
|
||||||
fn run_once(&self, witness: &PartitionWitness<F>, out_buffer: &mut GeneratedValues<F>);
|
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
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
{
|
{
|
||||||
@ -215,12 +221,18 @@ pub trait SimpleGenerator<F: Field>: 'static + Send + Sync + Debug {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(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>,
|
_phantom: PhantomData<F>,
|
||||||
inner: SG,
|
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 {
|
fn id(&self) -> String {
|
||||||
self.inner.id()
|
self.inner.id()
|
||||||
}
|
}
|
||||||
@ -257,7 +269,7 @@ pub struct CopyGenerator {
|
|||||||
pub(crate) dst: Target,
|
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 {
|
fn id(&self) -> String {
|
||||||
"CopyGenerator".to_string()
|
"CopyGenerator".to_string()
|
||||||
}
|
}
|
||||||
@ -289,7 +301,7 @@ pub struct RandomValueGenerator {
|
|||||||
pub(crate) target: Target,
|
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 {
|
fn id(&self) -> String {
|
||||||
"RandomValueGenerator".to_string()
|
"RandomValueGenerator".to_string()
|
||||||
}
|
}
|
||||||
@ -320,7 +332,7 @@ pub struct NonzeroTestGenerator {
|
|||||||
pub(crate) dummy: Target,
|
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 {
|
fn id(&self) -> String {
|
||||||
"NonzeroTestGenerator".to_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 {
|
fn id(&self) -> String {
|
||||||
"ConstantGenerator".to_string()
|
"ConstantGenerator".to_string()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -109,7 +109,7 @@ pub struct CircuitBuilder<F: RichField + Extendable<D>, const D: usize> {
|
|||||||
context_log: ContextTree,
|
context_log: ContextTree,
|
||||||
|
|
||||||
/// Generators used to generate the witness.
|
/// Generators used to generate the witness.
|
||||||
generators: Vec<WitnessGeneratorRef<F>>,
|
generators: Vec<WitnessGeneratorRef<F, D>>,
|
||||||
|
|
||||||
constants_to_targets: HashMap<F, Target>,
|
constants_to_targets: HashMap<F, Target>,
|
||||||
targets_to_constants: HashMap<Target, F>,
|
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);
|
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);
|
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
|
self.generators
|
||||||
.push(WitnessGeneratorRef::new(generator.adapter()));
|
.push(WitnessGeneratorRef::new(generator.adapter()));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -295,7 +295,7 @@ pub struct ProverOnlyCircuitData<
|
|||||||
C: GenericConfig<D, F = F>,
|
C: GenericConfig<D, F = F>,
|
||||||
const D: usize,
|
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
|
/// Generator indices (within the `Vec` above), indexed by the representative of each target
|
||||||
/// they watch.
|
/// they watch.
|
||||||
pub generator_indices_by_watches: BTreeMap<usize, Vec<usize>>,
|
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
|
where
|
||||||
F: RichField + Extendable<D>,
|
F: RichField + Extendable<D>,
|
||||||
C: GenericConfig<D, F = F> + 'static,
|
C: GenericConfig<D, F = F> + 'static,
|
||||||
|
|||||||
@ -11,12 +11,13 @@ pub trait WitnessGeneratorSerializer<F: RichField + Extendable<D>, const D: usiz
|
|||||||
fn read_generator(
|
fn read_generator(
|
||||||
&self,
|
&self,
|
||||||
buf: &mut Buffer,
|
buf: &mut Buffer,
|
||||||
common: &CommonCircuitData<F, D>,
|
cd: &CommonCircuitData<F, D>,
|
||||||
) -> IoResult<WitnessGeneratorRef<F>>;
|
) -> IoResult<WitnessGeneratorRef<F, D>>;
|
||||||
|
|
||||||
fn write_generator(
|
fn write_generator(
|
||||||
&self,
|
&self,
|
||||||
buf: &mut Vec<u8>,
|
buf: &mut Vec<u8>,
|
||||||
generator: &WitnessGeneratorRef<F>,
|
generator: &WitnessGeneratorRef<F, D>,
|
||||||
) -> IoResult<()>;
|
) -> IoResult<()>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,16 +31,16 @@ macro_rules! read_generator_impl {
|
|||||||
if tag == 0 {
|
if tag == 0 {
|
||||||
let generator: $crate::recursion::dummy_circuit::DummyProofGenerator<F, C, D> =
|
let generator: $crate::recursion::dummy_circuit::DummyProofGenerator<F, C, D> =
|
||||||
$crate::recursion::dummy_circuit::DummyProofGenerator::deserialize_with_circuit_data(buf, $common)?;
|
$crate::recursion::dummy_circuit::DummyProofGenerator::deserialize_with_circuit_data(buf, $common)?;
|
||||||
return Ok($crate::iop::generator::WitnessGeneratorRef::<F>::new(
|
return Ok($crate::iop::generator::WitnessGeneratorRef::<F, D>::new(
|
||||||
$crate::iop::generator::SimpleGenerator::<F>::adapter(generator),
|
$crate::iop::generator::SimpleGenerator::<F, D>::adapter(generator),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
$(if tag == i.next().unwrap() {
|
$(if tag == i.next().unwrap() {
|
||||||
let generator =
|
let generator =
|
||||||
<$generator_types as $crate::iop::generator::SimpleGenerator<F>>::deserialize(buf)?;
|
<$generator_types as $crate::iop::generator::SimpleGenerator<F, D>>::deserialize(buf)?;
|
||||||
Ok($crate::iop::generator::WitnessGeneratorRef::<F>::new(
|
Ok($crate::iop::generator::WitnessGeneratorRef::<F, D>::new(
|
||||||
$crate::iop::generator::SimpleGenerator::<F>::adapter(generator),
|
$crate::iop::generator::SimpleGenerator::<F, D>::adapter(generator),
|
||||||
))
|
))
|
||||||
} else)*
|
} else)*
|
||||||
{
|
{
|
||||||
@ -52,7 +53,7 @@ macro_rules! read_generator_impl {
|
|||||||
macro_rules! get_generator_tag_impl {
|
macro_rules! get_generator_tag_impl {
|
||||||
($generator:expr, $($generator_types:ty),+) => {{
|
($generator:expr, $($generator_types:ty),+) => {{
|
||||||
let mut i = 0..;
|
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)
|
Ok(tag)
|
||||||
} else)*
|
} else)*
|
||||||
{
|
{
|
||||||
@ -77,7 +78,7 @@ macro_rules! impl_generator_serializer {
|
|||||||
&self,
|
&self,
|
||||||
buf: &mut $crate::util::serialization::Buffer,
|
buf: &mut $crate::util::serialization::Buffer,
|
||||||
common: &$crate::plonk::circuit_data::CommonCircuitData<F, D>,
|
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)?;
|
let tag = $crate::util::serialization::Read::read_u32(buf)?;
|
||||||
read_generator_impl!(buf, tag, common, $($generator_types),+)
|
read_generator_impl!(buf, tag, common, $($generator_types),+)
|
||||||
}
|
}
|
||||||
@ -85,7 +86,7 @@ macro_rules! impl_generator_serializer {
|
|||||||
fn write_generator(
|
fn write_generator(
|
||||||
&self,
|
&self,
|
||||||
buf: &mut Vec<u8>,
|
buf: &mut Vec<u8>,
|
||||||
generator: &$crate::iop::generator::WitnessGeneratorRef<F>,
|
generator: &$crate::iop::generator::WitnessGeneratorRef<F, D>,
|
||||||
) -> $crate::util::serialization::IoResult<()> {
|
) -> $crate::util::serialization::IoResult<()> {
|
||||||
let tag = get_generator_tag_impl!(generator, $($generator_types),+)?;
|
let tag = get_generator_tag_impl!(generator, $($generator_types),+)?;
|
||||||
|
|
||||||
|
|||||||
@ -690,7 +690,7 @@ pub trait Read {
|
|||||||
&mut self,
|
&mut self,
|
||||||
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
|
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
|
||||||
common_data: &CommonCircuitData<F, D>,
|
common_data: &CommonCircuitData<F, D>,
|
||||||
) -> IoResult<WitnessGeneratorRef<F>>;
|
) -> IoResult<WitnessGeneratorRef<F, D>>;
|
||||||
|
|
||||||
fn read_selectors_info(&mut self) -> IoResult<SelectorsInfo> {
|
fn read_selectors_info(&mut self) -> IoResult<SelectorsInfo> {
|
||||||
let selector_indices = self.read_usize_vec()?;
|
let selector_indices = self.read_usize_vec()?;
|
||||||
@ -1693,7 +1693,7 @@ pub trait Write {
|
|||||||
|
|
||||||
fn write_generator<F: RichField + Extendable<D>, const D: usize>(
|
fn write_generator<F: RichField + Extendable<D>, const D: usize>(
|
||||||
&mut self,
|
&mut self,
|
||||||
generator: &WitnessGeneratorRef<F>,
|
generator: &WitnessGeneratorRef<F, D>,
|
||||||
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
|
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
|
||||||
) -> IoResult<()>;
|
) -> IoResult<()>;
|
||||||
|
|
||||||
@ -2116,7 +2116,7 @@ impl Write for Vec<u8> {
|
|||||||
|
|
||||||
fn write_generator<F: RichField + Extendable<D>, const D: usize>(
|
fn write_generator<F: RichField + Extendable<D>, const D: usize>(
|
||||||
&mut self,
|
&mut self,
|
||||||
generator: &WitnessGeneratorRef<F>,
|
generator: &WitnessGeneratorRef<F, D>,
|
||||||
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
|
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
|
||||||
) -> IoResult<()> {
|
) -> IoResult<()> {
|
||||||
generator_serializer.write_generator(self, generator)
|
generator_serializer.write_generator(self, generator)
|
||||||
@ -2186,7 +2186,7 @@ impl<'a> Read for Buffer<'a> {
|
|||||||
&mut self,
|
&mut self,
|
||||||
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
|
generator_serializer: &dyn WitnessGeneratorSerializer<F, D>,
|
||||||
common_data: &CommonCircuitData<F, D>,
|
common_data: &CommonCircuitData<F, D>,
|
||||||
) -> IoResult<WitnessGeneratorRef<F>> {
|
) -> IoResult<WitnessGeneratorRef<F, D>> {
|
||||||
generator_serializer.read_generator(self, common_data)
|
generator_serializer.read_generator(self, common_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user