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
15pub type VerifierConstraintFolder<'a, F, EF> =
17 GenericVerifierConstraintFolder<'a, F, EF, F, EF, EF>;
18
19pub struct GenericVerifierConstraintFolder<'a, F, EF, PubVar, Var, Expr> {
21 pub preprocessed: RowMajorMatrixView<'a, Var>,
23 pub main: RowMajorMatrixView<'a, Var>,
25 pub alpha: Var,
27 pub accumulator: Expr,
29 pub public_values: &'a [PubVar],
31 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
275pub struct ConstraintSumcheckFolder<'a, F: Field, K: Field, EF> {
277 pub preprocessed: RowMajorMatrixView<'a, K>,
279 pub main: RowMajorMatrixView<'a, K>,
281 pub powers_of_alpha: &'a [EF],
283 pub accumulator: EF,
285 pub public_values: &'a [F],
287 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
390pub 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
400pub struct GenericVerifierPublicValuesConstraintFolder<'a, F, EF, PubVar, Var, Expr> {
402 pub perm_challenges: (&'a Var, &'a [Expr]),
404 pub alpha: Var,
406 pub accumulator: Expr,
408 pub public_values: &'a [PubVar],
410 pub local_interaction_digest: Expr,
412 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
678pub type DebugPublicValuesConstraintFolder<'a, F> =
680 GenericDebugPublicValuesConstraintFolder<'a, F, F, F, F, F>;
681
682pub struct GenericDebugPublicValuesConstraintFolder<'a, F, EF, PubVar, Var, Expr> {
684 pub perm_challenges: (&'a Var, &'a [Var]),
686 pub alpha: Var,
688 pub accumulator: Expr,
690 pub public_values: &'a [PubVar],
692 pub interactions: Vec<(InteractionKind, InteractionScope, Vec<Expr>, Expr)>,
694 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}