104 auto test_invalid = [](
auto modify_data) {
106 auto data = create_add_triple_data(5, 7);
114 data.const_scaling });
119 test_invalid([](AddTripleData& d) { d.a +=
fr(1); });
120 test_invalid([](AddTripleData& d) { d.b +=
fr(1); });
121 test_invalid([](AddTripleData& d) { d.c +=
fr(1); });
124 test_invalid([](AddTripleData& d) { d.a_scaling +=
fr(1); });
125 test_invalid([](AddTripleData& d) { d.b_scaling +=
fr(1); });
126 test_invalid([](AddTripleData& d) { d.c_scaling +=
fr(1); });
127 test_invalid([](AddTripleData& d) { d.const_scaling +=
fr(1); });
150 auto test_invalid = [](
auto modify_data) {
152 auto data = create_add_quad_data(3, 5, 7);
162 data.const_scaling });
167 test_invalid([](AddQuadData& d) { d.a +=
fr(1); });
168 test_invalid([](AddQuadData& d) { d.b +=
fr(1); });
169 test_invalid([](AddQuadData& d) { d.c +=
fr(1); });
170 test_invalid([](AddQuadData& d) { d.d +=
fr(1); });
173 test_invalid([](AddQuadData& d) { d.a_scaling +=
fr(1); });
174 test_invalid([](AddQuadData& d) { d.b_scaling +=
fr(1); });
175 test_invalid([](AddQuadData& d) { d.c_scaling +=
fr(1); });
176 test_invalid([](AddQuadData& d) { d.d_scaling +=
fr(1); });
177 test_invalid([](AddQuadData& d) { d.const_scaling +=
fr(1); });
199 auto test_invalid = [](
auto modify_data) {
201 auto data = create_arithmetic_triple_data(5, 7);
215 test_invalid([](ArithTripleData& d) { d.a +=
fr(1); });
216 test_invalid([](ArithTripleData& d) { d.b +=
fr(1); });
217 test_invalid([](ArithTripleData& d) { d.c +=
fr(1); });
220 test_invalid([](ArithTripleData& d) { d.q_m +=
fr(1); });
221 test_invalid([](ArithTripleData& d) { d.q_l +=
fr(1); });
222 test_invalid([](ArithTripleData& d) { d.q_r +=
fr(1); });
223 test_invalid([](ArithTripleData& d) { d.q_o +=
fr(1); });
224 test_invalid([](ArithTripleData& d) { d.q_c +=
fr(1); });
233 auto add_data = create_add_triple_data(5, 7);
234 auto big_mul_data = create_mul_quad_data(3, 4);
235 auto arith_data = create_arithmetic_triple_data(2, 6);
238 uint32_t add_a =
builder.add_variable(add_data.a);
239 uint32_t add_b =
builder.add_variable(add_data.b);
240 uint32_t add_c =
builder.add_variable(add_data.c);
242 { add_a, add_b, add_c, add_data.a_scaling, add_data.b_scaling, add_data.c_scaling, add_data.const_scaling });
245 uint32_t a_idx =
builder.add_variable(big_mul_data.a);
246 uint32_t b_idx =
builder.add_variable(big_mul_data.b);
247 uint32_t c_idx =
builder.add_variable(big_mul_data.c);
248 uint32_t d_idx =
builder.add_variable(big_mul_data.d);
250 builder.create_big_mul_add_gate({ a_idx,
254 big_mul_data.mul_scaling,
255 big_mul_data.a_scaling,
256 big_mul_data.b_scaling,
257 big_mul_data.c_scaling,
258 big_mul_data.d_scaling,
259 big_mul_data.const_scaling },
263 uint32_t arith_a =
builder.add_variable(arith_data.a);
264 uint32_t arith_b =
builder.add_variable(arith_data.b);
265 uint32_t arith_c =
builder.add_variable(arith_data.c);
266 builder.create_arithmetic_gate(
267 { arith_a, arith_b, arith_c, arith_data.q_m, arith_data.q_l, arith_data.q_r, arith_data.q_o, arith_data.q_c });
306 fr d = -(
a +
b + c + next_w_4);
308 uint32_t a_idx =
builder.add_variable(
a);
309 uint32_t b_idx =
builder.add_variable(
b);
310 uint32_t c_idx =
builder.add_variable(c);
311 uint32_t d_idx =
builder.add_variable(d);
312 uint32_t next_w_4_idx =
builder.add_variable(next_w_4);
313 uint32_t dummy_idx =
builder.add_variable(
fr(13));
316 builder.create_big_add_gate({ a_idx, b_idx, c_idx, d_idx,
fr(1),
fr(1),
fr(1),
fr(1),
fr(0) },
320 builder.create_big_add_gate({ dummy_idx, dummy_idx, dummy_idx, next_w_4_idx,
fr(0),
fr(0),
fr(0),
fr(0),
fr(0) });
335 fr d = -(
a +
b + c + next_w_4) +
fr(1);
337 uint32_t a_idx =
builder.add_variable(
a);
338 uint32_t b_idx =
builder.add_variable(
b);
339 uint32_t c_idx =
builder.add_variable(c);
340 uint32_t d_idx =
builder.add_variable(d);
341 uint32_t next_w_4_idx =
builder.add_variable(next_w_4);
342 uint32_t dummy_idx =
builder.add_variable(
fr(13));
344 builder.create_big_add_gate({ a_idx, b_idx, c_idx, d_idx,
fr(1),
fr(1),
fr(1),
fr(1),
fr(0) },
347 builder.create_big_add_gate({ dummy_idx, dummy_idx, dummy_idx, next_w_4_idx,
fr(0),
fr(0),
fr(0),
fr(0),
fr(0) });
381 auto test_invalid = [](
auto modify_data) {
383 auto data = create_mul_quad_data(5, 7, 3);
394 data.const_scaling },
400 test_invalid([](MulQuadData& d) { d.a +=
fr(1); });
401 test_invalid([](MulQuadData& d) { d.b +=
fr(1); });
402 test_invalid([](MulQuadData& d) { d.c +=
fr(1); });
403 test_invalid([](MulQuadData& d) { d.d +=
fr(1); });
406 test_invalid([](MulQuadData& d) { d.mul_scaling +=
fr(1); });
407 test_invalid([](MulQuadData& d) { d.a_scaling +=
fr(1); });
408 test_invalid([](MulQuadData& d) { d.b_scaling +=
fr(1); });
409 test_invalid([](MulQuadData& d) { d.c_scaling +=
fr(1); });
410 test_invalid([](MulQuadData& d) { d.d_scaling +=
fr(1); });
411 test_invalid([](MulQuadData& d) { d.const_scaling +=
fr(1); });
424 fr d = -(
a *
b + c + next_w_4);
426 uint32_t a_idx =
builder.add_variable(
a);
427 uint32_t b_idx =
builder.add_variable(
b);
428 uint32_t c_idx =
builder.add_variable(c);
429 uint32_t d_idx =
builder.add_variable(d);
430 uint32_t next_w_4_idx =
builder.add_variable(next_w_4);
431 uint32_t dummy_idx =
builder.add_variable(
fr(13));
434 builder.create_big_mul_add_gate({ a_idx, b_idx, c_idx, d_idx,
fr(1),
fr(0),
fr(0),
fr(1),
fr(1),
fr(0) },
437 builder.create_big_add_gate({ dummy_idx, dummy_idx, dummy_idx, next_w_4_idx,
fr(0),
fr(0),
fr(0),
fr(0),
fr(0) });
452 fr d = -(
a *
b + c + next_w_4) +
fr(1);
454 uint32_t a_idx =
builder.add_variable(
a);
455 uint32_t b_idx =
builder.add_variable(
b);
456 uint32_t c_idx =
builder.add_variable(c);
457 uint32_t d_idx =
builder.add_variable(d);
458 uint32_t next_w_4_idx =
builder.add_variable(next_w_4);
459 uint32_t dummy_idx =
builder.add_variable(
fr(13));
461 builder.create_big_mul_add_gate({ a_idx, b_idx, c_idx, d_idx,
fr(1),
fr(0),
fr(0),
fr(1),
fr(1),
fr(0) },
464 builder.create_big_add_gate({ dummy_idx, dummy_idx, dummy_idx, next_w_4_idx,
fr(0),
fr(0),
fr(0),
fr(0),
fr(0) });
515 auto build_and_check = [](
auto modify_fn,
bool expect_valid) {
527 fr q_m = w_1_next - w_1 - w_4;
528 const fr scale =
fr(2);
533 fr q_c = -(q_1 * w_1 + q_2 * w_2 + q_3 * w_3 + q_4 * w_4 +
fr(2) * w_4_next);
536 modify_fn(w_1, w_2, w_3, w_4, w_1_next, w_4_next, q_m, q_1, q_2, q_3, q_4, q_c);
538 uint32_t w1_idx =
builder.add_variable(w_1);
539 uint32_t w2_idx =
builder.add_variable(w_2);
540 uint32_t w3_idx =
builder.add_variable(w_3);
541 uint32_t w4_idx =
builder.add_variable(w_4);
542 uint32_t w1_next_idx =
builder.add_variable(w_1_next);
543 uint32_t w4_next_idx =
builder.add_variable(w_4_next);
546 builder.blocks.arithmetic.populate_wires(w1_idx, w2_idx, w3_idx, w4_idx);
547 builder.blocks.arithmetic.q_m().emplace_back(q_m);
548 builder.blocks.arithmetic.q_1().emplace_back(q_1);
549 builder.blocks.arithmetic.q_2().emplace_back(q_2);
550 builder.blocks.arithmetic.q_3().emplace_back(q_3);
551 builder.blocks.arithmetic.q_4().emplace_back(q_4);
552 builder.blocks.arithmetic.q_c().emplace_back(q_c);
553 builder.blocks.arithmetic.set_gate_selector(3);
554 builder.check_selector_length_consistency();
558 builder.blocks.arithmetic.populate_wires(w1_next_idx,
builder.zero_idx(),
builder.zero_idx(), w4_next_idx);
559 builder.blocks.arithmetic.q_m().emplace_back(0);
560 builder.blocks.arithmetic.q_1().emplace_back(0);
561 builder.blocks.arithmetic.q_2().emplace_back(0);
562 builder.blocks.arithmetic.q_3().emplace_back(0);
563 builder.blocks.arithmetic.q_4().emplace_back(0);
564 builder.blocks.arithmetic.q_c().emplace_back(0);
565 builder.blocks.arithmetic.set_gate_selector(1);
566 builder.check_selector_length_consistency();
577 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&) {},
true);
580 build_and_check([](
fr& w_1,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&) { w_1 +=
fr(1); },
false);
581 build_and_check([](
fr&,
fr& w_2,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&) { w_2 +=
fr(1); },
false);
582 build_and_check([](
fr&,
fr&,
fr& w_3,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&) { w_3 +=
fr(1); },
false);
583 build_and_check([](
fr&,
fr&,
fr&,
fr& w_4,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&) { w_4 +=
fr(1); },
false);
586 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr& w_1_next,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&) { w_1_next +=
fr(1); },
588 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr&,
fr& w_4_next,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&) { w_4_next +=
fr(1); },
592 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr& q_m,
fr&,
fr&,
fr&,
fr&,
fr&) { q_m +=
fr(1); },
false);
593 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr& q_1,
fr&,
fr&,
fr&,
fr&) { q_1 +=
fr(1); },
false);
594 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr& q_2,
fr&,
fr&,
fr&) { q_2 +=
fr(1); },
false);
595 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr& q_3,
fr&,
fr&) { q_3 +=
fr(1); },
false);
596 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr& q_4,
fr&) { q_4 +=
fr(1); },
false);
597 build_and_check([](
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr&,
fr& q_c) { q_c +=
fr(1); },
false);