Skip to main content

sp1_hypercube/
folder.rs

1use crate::InteractionKind;
2use std::{
3    marker::PhantomData,
4    ops::{Add, Div, Mul, MulAssign, Sub},
5};
6
7use crate::air::{AirInteraction, EmptyMessageBuilder, InteractionScope, MessageBuilder};
8use slop_air::{
9    AirBuilder, AirBuilderWithPublicValues, ExtensionBuilder, PairBuilder, PermutationAirBuilder,
10};
11use slop_algebra::{AbstractExtensionField, AbstractField, ExtensionField, Field};
12use slop_challenger::IopCtx;
13use slop_matrix::dense::RowMajorMatrixView;
14
15/// A folder for verifier constraints.
16pub type VerifierConstraintFolder<'a, F, EF> =
17    GenericVerifierConstraintFolder<'a, F, EF, F, EF, EF>;
18
19/// A folder for verifier constraints.
20pub struct GenericVerifierConstraintFolder<'a, F, EF, PubVar, Var, Expr> {
21    /// The preprocessed trace.
22    pub preprocessed: RowMajorMatrixView<'a, Var>,
23    /// The main trace.
24    pub main: RowMajorMatrixView<'a, Var>,
25    /// The constraint folding challenge.
26    pub alpha: Var,
27    /// The accumulator for the constraint folding.
28    pub accumulator: Expr,
29    /// The public values.
30    pub public_values: &'a [PubVar],
31    /// The marker type.
32    pub _marker: PhantomData<(F, EF)>,
33}
34
35impl<'a, F, EF, PubVar, Var, Expr> AirBuilder
36    for GenericVerifierConstraintFolder<'a, F, EF, PubVar, Var, Expr>
37where
38    F: Field,
39    EF: ExtensionField<F>,
40    Expr: AbstractField
41        + From<F>
42        + Add<Var, Output = Expr>
43        + Add<F, Output = Expr>
44        + Sub<Var, Output = Expr>
45        + Sub<F, Output = Expr>
46        + Mul<Var, Output = Expr>
47        + Mul<F, Output = Expr>
48        + MulAssign<EF>,
49    Var: Into<Expr>
50        + Copy
51        + Add<F, Output = Expr>
52        + Add<Var, Output = Expr>
53        + Add<Expr, Output = Expr>
54        + Sub<F, Output = Expr>
55        + Sub<Var, Output = Expr>
56        + Sub<Expr, Output = Expr>
57        + Mul<F, Output = Expr>
58        + Mul<Var, Output = Expr>
59        + Mul<Expr, Output = Expr>
60        + Send
61        + Sync,
62    PubVar: Into<Expr> + Copy,
63{
64    type F = F;
65    type Expr = Expr;
66    type Var = Var;
67    type M = RowMajorMatrixView<'a, Var>;
68
69    fn main(&self) -> Self::M {
70        self.main
71    }
72
73    fn is_first_row(&self) -> Self::Expr {
74        unimplemented!()
75    }
76
77    fn is_last_row(&self) -> Self::Expr {
78        unimplemented!()
79    }
80
81    fn is_transition_window(&self, _: usize) -> Self::Expr {
82        unimplemented!()
83    }
84
85    fn assert_zero<I: Into<Self::Expr>>(&mut self, x: I) {
86        let x: Expr = x.into();
87        self.accumulator *= self.alpha.into();
88        self.accumulator += x;
89    }
90}
91
92impl<F, EF, PubVar, Var, Expr> ExtensionBuilder
93    for GenericVerifierConstraintFolder<'_, F, EF, PubVar, Var, Expr>
94where
95    F: Field,
96    EF: ExtensionField<F>,
97    Expr: AbstractField<F = EF>
98        + From<F>
99        + Add<Var, Output = Expr>
100        + Add<F, Output = Expr>
101        + Sub<Var, Output = Expr>
102        + Sub<F, Output = Expr>
103        + Mul<Var, Output = Expr>
104        + Mul<F, Output = Expr>
105        + MulAssign<EF>,
106    Var: Into<Expr>
107        + Copy
108        + Add<F, Output = Expr>
109        + Add<Var, Output = Expr>
110        + Add<Expr, Output = Expr>
111        + Sub<F, Output = Expr>
112        + Sub<Var, Output = Expr>
113        + Sub<Expr, Output = Expr>
114        + Mul<F, Output = Expr>
115        + Mul<Var, Output = Expr>
116        + Mul<Expr, Output = Expr>
117        + Send
118        + Sync,
119    PubVar: Into<Expr> + Copy,
120{
121    type EF = EF;
122    type ExprEF = Expr;
123    type VarEF = Var;
124
125    fn assert_zero_ext<I>(&mut self, x: I)
126    where
127        I: Into<Self::ExprEF>,
128    {
129        self.assert_zero(x);
130    }
131}
132
133impl<'a, F, EF, PubVar, Var, Expr> PermutationAirBuilder
134    for GenericVerifierConstraintFolder<'a, F, EF, PubVar, Var, Expr>
135where
136    F: Field,
137    EF: ExtensionField<F>,
138    Expr: AbstractField<F = EF>
139        + From<F>
140        + Add<Var, Output = Expr>
141        + Add<F, Output = Expr>
142        + Sub<Var, Output = Expr>
143        + Sub<F, Output = Expr>
144        + Mul<Var, Output = Expr>
145        + Mul<F, Output = Expr>
146        + MulAssign<EF>,
147    Var: Into<Expr>
148        + Copy
149        + Add<F, Output = Expr>
150        + Add<Var, Output = Expr>
151        + Add<Expr, Output = Expr>
152        + Sub<F, Output = Expr>
153        + Sub<Var, Output = Expr>
154        + Sub<Expr, Output = Expr>
155        + Mul<F, Output = Expr>
156        + Mul<Var, Output = Expr>
157        + Mul<Expr, Output = Expr>
158        + Send
159        + Sync,
160    PubVar: Into<Expr> + Copy,
161{
162    type MP = RowMajorMatrixView<'a, Var>;
163    type RandomVar = Var;
164
165    fn permutation(&self) -> Self::MP {
166        unimplemented!();
167    }
168
169    fn permutation_randomness(&self) -> &[Self::Var] {
170        unimplemented!()
171    }
172}
173
174impl<F, EF, PubVar, Var, Expr> PairBuilder
175    for GenericVerifierConstraintFolder<'_, F, EF, PubVar, Var, Expr>
176where
177    F: Field,
178    EF: ExtensionField<F>,
179    Expr: AbstractField<F = EF>
180        + From<F>
181        + Add<Var, Output = Expr>
182        + Add<F, Output = Expr>
183        + Sub<Var, Output = Expr>
184        + Sub<F, Output = Expr>
185        + Mul<Var, Output = Expr>
186        + Mul<F, Output = Expr>
187        + MulAssign<EF>,
188    Var: Into<Expr>
189        + Copy
190        + Add<F, Output = Expr>
191        + Add<Var, Output = Expr>
192        + Add<Expr, Output = Expr>
193        + Sub<F, Output = Expr>
194        + Sub<Var, Output = Expr>
195        + Sub<Expr, Output = Expr>
196        + Mul<F, Output = Expr>
197        + Mul<Var, Output = Expr>
198        + Mul<Expr, Output = Expr>
199        + Send
200        + Sync,
201    PubVar: Into<Expr> + Copy,
202{
203    fn preprocessed(&self) -> Self::M {
204        self.preprocessed
205    }
206}
207
208impl<F, EF, PubVar, Var, Expr> EmptyMessageBuilder
209    for GenericVerifierConstraintFolder<'_, F, EF, PubVar, Var, Expr>
210where
211    F: Field,
212    EF: ExtensionField<F>,
213    Expr: AbstractField<F = EF>
214        + From<F>
215        + Add<Var, Output = Expr>
216        + Add<F, Output = Expr>
217        + Sub<Var, Output = Expr>
218        + Sub<F, Output = Expr>
219        + Mul<Var, Output = Expr>
220        + Mul<F, Output = Expr>
221        + MulAssign<EF>,
222    Var: Into<Expr>
223        + Copy
224        + Add<F, Output = Expr>
225        + Add<Var, Output = Expr>
226        + Add<Expr, Output = Expr>
227        + Sub<F, Output = Expr>
228        + Sub<Var, Output = Expr>
229        + Sub<Expr, Output = Expr>
230        + Mul<F, Output = Expr>
231        + Mul<Var, Output = Expr>
232        + Mul<Expr, Output = Expr>
233        + Send
234        + Sync,
235    PubVar: Into<Expr> + Copy,
236{
237}
238
239impl<F, EF, PubVar, Var, Expr> AirBuilderWithPublicValues
240    for GenericVerifierConstraintFolder<'_, F, EF, PubVar, Var, Expr>
241where
242    F: Field,
243    EF: ExtensionField<F>,
244    Expr: AbstractField<F = EF>
245        + From<F>
246        + Add<Var, Output = Expr>
247        + Add<F, Output = Expr>
248        + Sub<Var, Output = Expr>
249        + Sub<F, Output = Expr>
250        + Mul<Var, Output = Expr>
251        + Mul<F, Output = Expr>
252        + MulAssign<EF>,
253    Var: Into<Expr>
254        + Copy
255        + Add<F, Output = Expr>
256        + Add<Var, Output = Expr>
257        + Add<Expr, Output = Expr>
258        + Sub<F, Output = Expr>
259        + Sub<Var, Output = Expr>
260        + Sub<Expr, Output = Expr>
261        + Mul<F, Output = Expr>
262        + Mul<Var, Output = Expr>
263        + Mul<Expr, Output = Expr>
264        + Send
265        + Sync,
266    PubVar: Into<Expr> + Copy,
267{
268    type PublicVar = PubVar;
269
270    fn public_values(&self) -> &[Self::PublicVar] {
271        self.public_values
272    }
273}
274
275/// A folder for the zerocheck sumcheck poly.
276pub struct ConstraintSumcheckFolder<'a, F: Field, K: Field, EF> {
277    /// The preprocessed row.
278    pub preprocessed: RowMajorMatrixView<'a, K>,
279    /// The main row.
280    pub main: RowMajorMatrixView<'a, K>,
281    /// The constraint folding challenge.
282    pub powers_of_alpha: &'a [EF],
283    /// The accumulator for the constraint folding.
284    pub accumulator: EF,
285    /// The public values.
286    pub public_values: &'a [F],
287    /// The constraint index.
288    pub constraint_index: usize,
289}
290
291impl<
292        'a,
293        F: Field,
294        K: Field + From<F> + Add<F, Output = K> + Sub<F, Output = K> + Mul<F, Output = K>,
295        EF: Field + Mul<K, Output = EF>,
296    > AirBuilder for ConstraintSumcheckFolder<'a, F, K, EF>
297{
298    type F = F;
299    type Expr = K;
300    type Var = K;
301    type M = RowMajorMatrixView<'a, K>;
302
303    fn main(&self) -> Self::M {
304        self.main
305    }
306
307    fn is_first_row(&self) -> Self::Expr {
308        unimplemented!()
309    }
310
311    fn is_last_row(&self) -> Self::Expr {
312        unimplemented!()
313    }
314
315    fn is_transition_window(&self, _: usize) -> Self::Expr {
316        unimplemented!()
317    }
318
319    fn assert_zero<I: Into<Self::Expr>>(&mut self, x: I) {
320        self.accumulator += self.powers_of_alpha[self.constraint_index] * x.into();
321        self.constraint_index += 1;
322    }
323}
324
325impl<
326        F: Field,
327        K: Field + From<F> + Add<F, Output = K> + Sub<F, Output = K> + Mul<F, Output = K>,
328        EF: Field + Mul<K, Output = EF> + ExtensionField<F> + AbstractExtensionField<K> + From<K>,
329    > ExtensionBuilder for ConstraintSumcheckFolder<'_, F, K, EF>
330{
331    type EF = EF;
332
333    type ExprEF = EF;
334
335    type VarEF = EF;
336
337    fn assert_zero_ext<I>(&mut self, x: I)
338    where
339        I: Into<Self::ExprEF>,
340    {
341        self.accumulator += self.powers_of_alpha[self.constraint_index] * x.into();
342        self.constraint_index += 1;
343    }
344}
345
346impl<
347        'a,
348        F: Field,
349        K: Field + From<F> + Add<F, Output = K> + Sub<F, Output = K> + Mul<F, Output = K>,
350        EF: Field + Mul<K, Output = EF> + ExtensionField<F> + AbstractExtensionField<K>,
351    > PermutationAirBuilder for ConstraintSumcheckFolder<'a, F, K, EF>
352{
353    type MP = RowMajorMatrixView<'a, EF>;
354
355    type RandomVar = EF;
356
357    fn permutation(&self) -> Self::MP {
358        unimplemented!()
359    }
360
361    fn permutation_randomness(&self) -> &[Self::RandomVar] {
362        unimplemented!()
363    }
364}
365
366impl<
367        F: Field,
368        K: Field + From<F> + Add<F, Output = K> + Sub<F, Output = K> + Mul<F, Output = K>,
369        EF: Field + Mul<K, Output = EF>,
370    > PairBuilder for ConstraintSumcheckFolder<'_, F, K, EF>
371{
372    fn preprocessed(&self) -> Self::M {
373        self.preprocessed
374    }
375}
376
377impl<
378        F: Field,
379        K: Field + From<F> + Add<F, Output = K> + Sub<F, Output = K> + Mul<F, Output = K>,
380        EF: Field + Mul<K, Output = EF>,
381    > AirBuilderWithPublicValues for ConstraintSumcheckFolder<'_, F, K, EF>
382{
383    type PublicVar = Self::F;
384
385    fn public_values(&self) -> &[Self::PublicVar] {
386        self.public_values
387    }
388}
389
390/// A folder for verifier constraints on public values.
391pub type VerifierPublicValuesConstraintFolder<'a, C> = GenericVerifierPublicValuesConstraintFolder<
392    'a,
393    <C as IopCtx>::F,
394    <C as IopCtx>::EF,
395    <C as IopCtx>::F,
396    <C as IopCtx>::EF,
397    <C as IopCtx>::EF,
398>;
399
400/// A folder for verifier constraints.
401pub struct GenericVerifierPublicValuesConstraintFolder<'a, F, EF, PubVar, Var, Expr> {
402    /// The challenges for the permutation.
403    pub perm_challenges: (&'a Var, &'a [Expr]),
404    /// The constraint folding challenge.
405    pub alpha: Var,
406    /// The accumulator for the constraint folding.
407    pub accumulator: Expr,
408    /// The public values.
409    pub public_values: &'a [PubVar],
410    /// The local interaction digests.
411    pub local_interaction_digest: Expr,
412    /// The marker type.
413    pub _marker: PhantomData<(F, EF)>,
414}
415
416impl<'a, F, EF, PubVar, Var, Expr> AirBuilder
417    for GenericVerifierPublicValuesConstraintFolder<'a, F, EF, PubVar, Var, Expr>
418where
419    F: Field,
420    EF: ExtensionField<F>,
421    Expr: AbstractField<F = EF>
422        + From<F>
423        + Add<Var, Output = Expr>
424        + Add<F, Output = Expr>
425        + Sub<Var, Output = Expr>
426        + Sub<F, Output = Expr>
427        + Mul<Var, Output = Expr>
428        + Mul<F, Output = Expr>
429        + MulAssign<EF>,
430    Var: Into<Expr>
431        + Copy
432        + Add<F, Output = Expr>
433        + Add<Var, Output = Expr>
434        + Add<Expr, Output = Expr>
435        + Sub<F, Output = Expr>
436        + Sub<Var, Output = Expr>
437        + Sub<Expr, Output = Expr>
438        + Mul<F, Output = Expr>
439        + Mul<Var, Output = Expr>
440        + Mul<Expr, Output = Expr>
441        + Send
442        + Sync,
443    PubVar: Into<Expr> + Copy,
444{
445    type F = F;
446    type Expr = Expr;
447    type Var = Var;
448    type M = RowMajorMatrixView<'a, Var>;
449
450    fn main(&self) -> Self::M {
451        unimplemented!()
452    }
453
454    fn is_first_row(&self) -> Self::Expr {
455        unimplemented!()
456    }
457
458    fn is_last_row(&self) -> Self::Expr {
459        unimplemented!()
460    }
461
462    fn is_transition_window(&self, _: usize) -> Self::Expr {
463        unimplemented!()
464    }
465
466    fn assert_zero<I: Into<Self::Expr>>(&mut self, x: I) {
467        let x: Expr = x.into();
468        self.accumulator *= self.alpha.into();
469        self.accumulator += x;
470    }
471}
472
473impl<F, EF, PubVar, Var, Expr> ExtensionBuilder
474    for GenericVerifierPublicValuesConstraintFolder<'_, F, EF, PubVar, Var, Expr>
475where
476    F: Field,
477    EF: ExtensionField<F>,
478    Expr: AbstractField<F = EF>
479        + From<F>
480        + Add<Var, Output = Expr>
481        + Add<F, Output = Expr>
482        + Sub<Var, Output = Expr>
483        + Sub<F, Output = Expr>
484        + Mul<Var, Output = Expr>
485        + Mul<F, Output = Expr>
486        + MulAssign<EF>,
487    Var: Into<Expr>
488        + Copy
489        + Add<F, Output = Expr>
490        + Add<Var, Output = Expr>
491        + Add<Expr, Output = Expr>
492        + Sub<F, Output = Expr>
493        + Sub<Var, Output = Expr>
494        + Sub<Expr, Output = Expr>
495        + Mul<F, Output = Expr>
496        + Mul<Var, Output = Expr>
497        + Mul<Expr, Output = Expr>
498        + Send
499        + Sync,
500    PubVar: Into<Expr> + Copy,
501{
502    type EF = EF;
503    type ExprEF = Expr;
504    type VarEF = Var;
505
506    fn assert_zero_ext<I>(&mut self, x: I)
507    where
508        I: Into<Self::ExprEF>,
509    {
510        self.assert_zero(x);
511    }
512}
513
514impl<'a, F, EF, PubVar, Var, Expr> PermutationAirBuilder
515    for GenericVerifierPublicValuesConstraintFolder<'a, F, EF, PubVar, Var, Expr>
516where
517    F: Field,
518    EF: ExtensionField<F>,
519    Expr: AbstractField<F = EF>
520        + From<F>
521        + Add<Var, Output = Expr>
522        + Add<F, Output = Expr>
523        + Sub<Var, Output = Expr>
524        + Sub<F, Output = Expr>
525        + Mul<Var, Output = Expr>
526        + Mul<F, Output = Expr>
527        + MulAssign<EF>,
528    Var: Into<Expr>
529        + Copy
530        + Add<F, Output = Expr>
531        + Add<Var, Output = Expr>
532        + Add<Expr, Output = Expr>
533        + Sub<F, Output = Expr>
534        + Sub<Var, Output = Expr>
535        + Sub<Expr, Output = Expr>
536        + Mul<F, Output = Expr>
537        + Mul<Var, Output = Expr>
538        + Mul<Expr, Output = Expr>
539        + Send
540        + Sync,
541    PubVar: Into<Expr> + Copy,
542{
543    type MP = RowMajorMatrixView<'a, Var>;
544    type RandomVar = Var;
545
546    fn permutation(&self) -> Self::MP {
547        unimplemented!()
548    }
549
550    fn permutation_randomness(&self) -> &[Self::Var] {
551        unimplemented!()
552    }
553}
554
555impl<F, EF, PubVar, Var, Expr> PairBuilder
556    for GenericVerifierPublicValuesConstraintFolder<'_, F, EF, PubVar, Var, Expr>
557where
558    F: Field,
559    EF: ExtensionField<F>,
560    Expr: AbstractField<F = EF>
561        + From<F>
562        + Add<Var, Output = Expr>
563        + Add<F, Output = Expr>
564        + Sub<Var, Output = Expr>
565        + Sub<F, Output = Expr>
566        + Mul<Var, Output = Expr>
567        + Mul<F, Output = Expr>
568        + MulAssign<EF>,
569    Var: Into<Expr>
570        + Copy
571        + Add<F, Output = Expr>
572        + Add<Var, Output = Expr>
573        + Add<Expr, Output = Expr>
574        + Sub<F, Output = Expr>
575        + Sub<Var, Output = Expr>
576        + Sub<Expr, Output = Expr>
577        + Mul<F, Output = Expr>
578        + Mul<Var, Output = Expr>
579        + Mul<Expr, Output = Expr>
580        + Send
581        + Sync,
582    PubVar: Into<Expr> + Copy,
583{
584    fn preprocessed(&self) -> Self::M {
585        unimplemented!()
586    }
587}
588
589impl<F, EF, PubVar, Var, Expr> MessageBuilder<AirInteraction<Expr>>
590    for GenericVerifierPublicValuesConstraintFolder<'_, F, EF, PubVar, Var, Expr>
591where
592    F: Field,
593    EF: ExtensionField<F>,
594    Expr: AbstractField<F = EF>
595        + From<F>
596        + Add<Var, Output = Expr>
597        + Add<F, Output = Expr>
598        + Sub<Var, Output = Expr>
599        + Sub<F, Output = Expr>
600        + Mul<Var, Output = Expr>
601        + Mul<F, Output = Expr>
602        + MulAssign<EF>
603        + Div<Expr, Output = Expr>,
604    Var: Into<Expr>
605        + Copy
606        + Add<F, Output = Expr>
607        + Add<Var, Output = Expr>
608        + Add<Expr, Output = Expr>
609        + Sub<F, Output = Expr>
610        + Sub<Var, Output = Expr>
611        + Sub<Expr, Output = Expr>
612        + Mul<F, Output = Expr>
613        + Mul<Var, Output = Expr>
614        + Mul<Expr, Output = Expr>
615        + Send
616        + Sync,
617    PubVar: Into<Expr> + Copy,
618{
619    fn send(&mut self, message: AirInteraction<Expr>, _scope: InteractionScope) {
620        let mut denominator: Expr = (*self.perm_challenges.0).into();
621        let mut betas = self.perm_challenges.1.iter().cloned();
622        denominator += betas.next().unwrap() * F::from_canonical_usize(message.kind as usize);
623        for value in message.values {
624            denominator += value * betas.next().unwrap();
625        }
626        let digest = message.multiplicity / denominator;
627        self.local_interaction_digest += digest;
628    }
629
630    fn receive(&mut self, message: AirInteraction<Expr>, _scope: InteractionScope) {
631        let mut denominator: Expr = (*self.perm_challenges.0).into();
632        let mut betas = self.perm_challenges.1.iter().cloned();
633        denominator += betas.next().unwrap() * F::from_canonical_usize(message.kind as usize);
634        for value in message.values {
635            denominator += value * betas.next().unwrap();
636        }
637        let digest = message.multiplicity / denominator;
638        self.local_interaction_digest -= digest;
639    }
640}
641
642impl<F, EF, PubVar, Var, Expr> AirBuilderWithPublicValues
643    for GenericVerifierPublicValuesConstraintFolder<'_, F, EF, PubVar, Var, Expr>
644where
645    F: Field,
646    EF: ExtensionField<F>,
647    Expr: AbstractField<F = EF>
648        + From<F>
649        + Add<Var, Output = Expr>
650        + Add<F, Output = Expr>
651        + Sub<Var, Output = Expr>
652        + Sub<F, Output = Expr>
653        + Mul<Var, Output = Expr>
654        + Mul<F, Output = Expr>
655        + MulAssign<EF>,
656    Var: Into<Expr>
657        + Copy
658        + Add<F, Output = Expr>
659        + Add<Var, Output = Expr>
660        + Add<Expr, Output = Expr>
661        + Sub<F, Output = Expr>
662        + Sub<Var, Output = Expr>
663        + Sub<Expr, Output = Expr>
664        + Mul<F, Output = Expr>
665        + Mul<Var, Output = Expr>
666        + Mul<Expr, Output = Expr>
667        + Send
668        + Sync,
669    PubVar: Into<Expr> + Copy,
670{
671    type PublicVar = PubVar;
672
673    fn public_values(&self) -> &[Self::PublicVar] {
674        self.public_values
675    }
676}
677
678/// A folder for verifier constraints on public values.
679pub type DebugPublicValuesConstraintFolder<'a, F> =
680    GenericDebugPublicValuesConstraintFolder<'a, F, F, F, F, F>;
681
682/// A folder for verifier constraints.
683pub struct GenericDebugPublicValuesConstraintFolder<'a, F, EF, PubVar, Var, Expr> {
684    /// The challenges for the permutation.
685    pub perm_challenges: (&'a Var, &'a [Var]),
686    /// The constraint folding challenge.
687    pub alpha: Var,
688    /// The accumulator for the constraint folding.
689    pub accumulator: Expr,
690    /// The public values.
691    pub public_values: &'a [PubVar],
692    /// The interactions.
693    pub interactions: Vec<(InteractionKind, InteractionScope, Vec<Expr>, Expr)>,
694    /// The marker type.
695    pub _marker: PhantomData<(F, EF, Expr)>,
696}
697
698impl<'a, F, EF, PubVar, Var, Expr> AirBuilder
699    for GenericDebugPublicValuesConstraintFolder<'a, F, EF, PubVar, Var, Expr>
700where
701    F: Field,
702    EF: ExtensionField<F>,
703    Expr: AbstractField<F = EF>
704        + From<F>
705        + Add<Var, Output = Expr>
706        + Add<F, Output = Expr>
707        + Sub<Var, Output = Expr>
708        + Sub<F, Output = Expr>
709        + Mul<Var, Output = Expr>
710        + Mul<F, Output = Expr>
711        + MulAssign<EF>,
712    Var: Into<Expr>
713        + Copy
714        + Add<F, Output = Expr>
715        + Add<Var, Output = Expr>
716        + Add<Expr, Output = Expr>
717        + Sub<F, Output = Expr>
718        + Sub<Var, Output = Expr>
719        + Sub<Expr, Output = Expr>
720        + Mul<F, Output = Expr>
721        + Mul<Var, Output = Expr>
722        + Mul<Expr, Output = Expr>
723        + Send
724        + Sync,
725    PubVar: Into<Expr> + Copy,
726{
727    type F = F;
728    type Expr = Expr;
729    type Var = Var;
730    type M = RowMajorMatrixView<'a, Var>;
731
732    fn main(&self) -> Self::M {
733        unimplemented!()
734    }
735
736    fn is_first_row(&self) -> Self::Expr {
737        unimplemented!()
738    }
739
740    fn is_last_row(&self) -> Self::Expr {
741        unimplemented!()
742    }
743
744    fn is_transition_window(&self, _: usize) -> Self::Expr {
745        unimplemented!()
746    }
747
748    fn assert_zero<I: Into<Self::Expr>>(&mut self, x: I) {
749        let x: Expr = x.into();
750        self.accumulator *= self.alpha.into();
751        self.accumulator += x;
752    }
753}
754
755impl<F, EF, PubVar, Var, Expr> ExtensionBuilder
756    for GenericDebugPublicValuesConstraintFolder<'_, F, EF, PubVar, Var, Expr>
757where
758    F: Field,
759    EF: ExtensionField<F>,
760    Expr: AbstractField<F = EF>
761        + From<F>
762        + Add<Var, Output = Expr>
763        + Add<F, Output = Expr>
764        + Sub<Var, Output = Expr>
765        + Sub<F, Output = Expr>
766        + Mul<Var, Output = Expr>
767        + Mul<F, Output = Expr>
768        + MulAssign<EF>,
769    Var: Into<Expr>
770        + Copy
771        + Add<F, Output = Expr>
772        + Add<Var, Output = Expr>
773        + Add<Expr, Output = Expr>
774        + Sub<F, Output = Expr>
775        + Sub<Var, Output = Expr>
776        + Sub<Expr, Output = Expr>
777        + Mul<F, Output = Expr>
778        + Mul<Var, Output = Expr>
779        + Mul<Expr, Output = Expr>
780        + Send
781        + Sync,
782    PubVar: Into<Expr> + Copy,
783{
784    type EF = EF;
785    type ExprEF = Expr;
786    type VarEF = Var;
787
788    fn assert_zero_ext<I>(&mut self, x: I)
789    where
790        I: Into<Self::ExprEF>,
791    {
792        self.assert_zero(x);
793    }
794}
795
796impl<'a, F, EF, PubVar, Var, Expr> PermutationAirBuilder
797    for GenericDebugPublicValuesConstraintFolder<'a, F, EF, PubVar, Var, Expr>
798where
799    F: Field,
800    EF: ExtensionField<F>,
801    Expr: AbstractField<F = EF>
802        + From<F>
803        + Add<Var, Output = Expr>
804        + Add<F, Output = Expr>
805        + Sub<Var, Output = Expr>
806        + Sub<F, Output = Expr>
807        + Mul<Var, Output = Expr>
808        + Mul<F, Output = Expr>
809        + MulAssign<EF>,
810    Var: Into<Expr>
811        + Copy
812        + Add<F, Output = Expr>
813        + Add<Var, Output = Expr>
814        + Add<Expr, Output = Expr>
815        + Sub<F, Output = Expr>
816        + Sub<Var, Output = Expr>
817        + Sub<Expr, Output = Expr>
818        + Mul<F, Output = Expr>
819        + Mul<Var, Output = Expr>
820        + Mul<Expr, Output = Expr>
821        + Send
822        + Sync,
823    PubVar: Into<Expr> + Copy,
824{
825    type MP = RowMajorMatrixView<'a, Var>;
826    type RandomVar = Var;
827
828    fn permutation(&self) -> Self::MP {
829        unimplemented!()
830    }
831
832    fn permutation_randomness(&self) -> &[Self::Var] {
833        unimplemented!()
834    }
835}
836
837impl<F, EF, PubVar, Var, Expr> PairBuilder
838    for GenericDebugPublicValuesConstraintFolder<'_, F, EF, PubVar, Var, Expr>
839where
840    F: Field,
841    EF: ExtensionField<F>,
842    Expr: AbstractField<F = EF>
843        + From<F>
844        + Add<Var, Output = Expr>
845        + Add<F, Output = Expr>
846        + Sub<Var, Output = Expr>
847        + Sub<F, Output = Expr>
848        + Mul<Var, Output = Expr>
849        + Mul<F, Output = Expr>
850        + MulAssign<EF>,
851    Var: Into<Expr>
852        + Copy
853        + Add<F, Output = Expr>
854        + Add<Var, Output = Expr>
855        + Add<Expr, Output = Expr>
856        + Sub<F, Output = Expr>
857        + Sub<Var, Output = Expr>
858        + Sub<Expr, Output = Expr>
859        + Mul<F, Output = Expr>
860        + Mul<Var, Output = Expr>
861        + Mul<Expr, Output = Expr>
862        + Send
863        + Sync,
864    PubVar: Into<Expr> + Copy,
865{
866    fn preprocessed(&self) -> Self::M {
867        unimplemented!()
868    }
869}
870
871impl<F, EF, PubVar, Var, Expr> MessageBuilder<AirInteraction<Expr>>
872    for GenericDebugPublicValuesConstraintFolder<'_, F, EF, PubVar, Var, Expr>
873where
874    F: Field,
875    EF: ExtensionField<F>,
876    Expr: AbstractField<F = EF>
877        + From<F>
878        + Add<Var, Output = Expr>
879        + Add<F, Output = Expr>
880        + Sub<Var, Output = Expr>
881        + Sub<F, Output = Expr>
882        + Mul<Var, Output = Expr>
883        + Mul<F, Output = Expr>
884        + MulAssign<EF>
885        + Div<Expr, Output = Expr>,
886    Var: Into<Expr>
887        + Copy
888        + Add<F, Output = Expr>
889        + Add<Var, Output = Expr>
890        + Add<Expr, Output = Expr>
891        + Sub<F, Output = Expr>
892        + Sub<Var, Output = Expr>
893        + Sub<Expr, Output = Expr>
894        + Mul<F, Output = Expr>
895        + Mul<Var, Output = Expr>
896        + Mul<Expr, Output = Expr>
897        + Send
898        + Sync,
899    PubVar: Into<Expr> + Copy,
900{
901    fn send(&mut self, message: AirInteraction<Expr>, scope: InteractionScope) {
902        self.interactions.push((message.kind, scope, message.values, message.multiplicity));
903    }
904
905    fn receive(&mut self, message: AirInteraction<Expr>, scope: InteractionScope) {
906        self.interactions.push((message.kind, scope, message.values, -message.multiplicity));
907    }
908}
909
910impl<F, EF, PubVar, Var, Expr> AirBuilderWithPublicValues
911    for GenericDebugPublicValuesConstraintFolder<'_, F, EF, PubVar, Var, Expr>
912where
913    F: Field,
914    EF: ExtensionField<F>,
915    Expr: AbstractField<F = EF>
916        + From<F>
917        + Add<Var, Output = Expr>
918        + Add<F, Output = Expr>
919        + Sub<Var, Output = Expr>
920        + Sub<F, Output = Expr>
921        + Mul<Var, Output = Expr>
922        + Mul<F, Output = Expr>
923        + MulAssign<EF>,
924    Var: Into<Expr>
925        + Copy
926        + Add<F, Output = Expr>
927        + Add<Var, Output = Expr>
928        + Add<Expr, Output = Expr>
929        + Sub<F, Output = Expr>
930        + Sub<Var, Output = Expr>
931        + Sub<Expr, Output = Expr>
932        + Mul<F, Output = Expr>
933        + Mul<Var, Output = Expr>
934        + Mul<Expr, Output = Expr>
935        + Send
936        + Sync,
937    PubVar: Into<Expr> + Copy,
938{
939    type PublicVar = PubVar;
940
941    fn public_values(&self) -> &[Self::PublicVar] {
942        self.public_values
943    }
944}