171TEST(Protogalaxy, CombinerOn2Keys)
175 const auto restrict_to_standard_arithmetic_relation = [](
auto& polys) {
176 std::fill(polys.q_arith.coeffs().begin(), polys.q_arith.coeffs().end(), 1);
177 std::fill(polys.q_delta_range.coeffs().begin(), polys.q_delta_range.coeffs().end(), 0);
178 std::fill(polys.q_elliptic.coeffs().begin(), polys.q_elliptic.coeffs().end(), 0);
179 std::fill(polys.q_memory.coeffs().begin(), polys.q_memory.coeffs().end(), 0);
180 std::fill(polys.q_nnf.coeffs().begin(), polys.q_nnf.coeffs().end(), 0);
181 std::fill(polys.q_lookup.coeffs().begin(), polys.q_lookup.coeffs().end(), 0);
182 std::fill(polys.q_4.coeffs().begin(), polys.q_4.coeffs().end(), 0);
183 std::fill(polys.q_poseidon2_external.coeffs().begin(), polys.q_poseidon2_external.coeffs().end(), 0);
184 std::fill(polys.q_poseidon2_internal.coeffs().begin(), polys.q_poseidon2_internal.coeffs().end(), 0);
185 std::fill(polys.w_4.coeffs().begin(), polys.w_4.coeffs().end(), 0);
186 std::fill(polys.w_4_shift.coeffs().begin(), polys.w_4_shift.coeffs().end(), 0);
189 auto run_test = [&](
bool is_random_input) {
194 if (is_random_input) {
197 for (
size_t idx = 0; idx < bb::NUM_INSTANCES; idx++) {
199 auto prover_polynomials = get_sequential_prover_polynomials<Flavor>(
201 restrict_to_standard_arithmetic_relation(prover_polynomials);
203 key->set_dyadic_size(2);
212 keys, gate_separators, univariate_relation_parameters_no_skpping, alphas);
230 for (
size_t idx = 0; idx < bb::NUM_INSTANCES; idx++) {
232 auto prover_polynomials = get_zero_prover_polynomials<Flavor>(
234 restrict_to_standard_arithmetic_relation(prover_polynomials);
236 key->set_dyadic_size(2);
243 const auto create_add_gate = [](
auto& polys,
const size_t idx,
FF w_l,
FF w_r) {
244 polys.w_l.at(idx) = w_l;
245 polys.w_r.at(idx) = w_r;
246 polys.w_o.at(idx) = w_l + w_r;
247 polys.q_l.at(idx) = 1;
248 polys.q_r.at(idx) = 1;
249 polys.q_o.at(idx) = -1;
252 const auto create_mul_gate = [](
auto& polys,
const size_t idx,
FF w_l,
FF w_r) {
253 polys.w_l.at(idx) = w_l;
254 polys.w_r.at(idx) = w_r;
255 polys.w_o.at(idx) = w_l * w_r;
256 polys.q_m.at(idx) = 1;
257 polys.q_o.at(idx) = -1;
260 create_add_gate(keys[0]->polynomials, 0, 1, 2);
261 create_add_gate(keys[0]->polynomials, 1, 0, 4);
262 create_add_gate(keys[1]->polynomials, 0, 3, 4);
263 create_mul_gate(keys[1]->polynomials, 1, 1, 4);
265 restrict_to_standard_arithmetic_relation(keys[0]->polynomials);
266 restrict_to_standard_arithmetic_relation(keys[1]->polynomials);
291 keys, gate_separators, univariate_relation_parameters_no_skipping, alphas);
295 keys, gate_separators, univariate_relation_parameters, alphas, accumulators);
297 Univariate<FF, 12>(
std::array<FF, 12>{ 0, 0, 12, 36, 72, 120, 180, 252, 336, 432, 540, 660 });
308TEST(Protogalaxy, CombinerOptimizationConsistency)
313 constexpr size_t UNIVARIATE_LENGTH = 12;
314 const auto restrict_to_standard_arithmetic_relation = [](
auto& polys) {
315 std::fill(polys.q_arith.coeffs().begin(), polys.q_arith.coeffs().end(), 1);
316 std::fill(polys.q_delta_range.coeffs().begin(), polys.q_delta_range.coeffs().end(), 0);
317 std::fill(polys.q_elliptic.coeffs().begin(), polys.q_elliptic.coeffs().end(), 0);
318 std::fill(polys.q_memory.coeffs().begin(), polys.q_memory.coeffs().end(), 0);
319 std::fill(polys.q_nnf.coeffs().begin(), polys.q_nnf.coeffs().end(), 0);
320 std::fill(polys.q_lookup.coeffs().begin(), polys.q_lookup.coeffs().end(), 0);
321 std::fill(polys.q_4.coeffs().begin(), polys.q_4.coeffs().end(), 0);
322 std::fill(polys.w_4.coeffs().begin(), polys.w_4.coeffs().end(), 0);
323 std::fill(polys.w_4_shift.coeffs().begin(), polys.w_4_shift.coeffs().end(), 0);
326 auto run_test = [&](
bool is_random_input) {
331 if (is_random_input) {
334 for (
size_t idx = 0; idx < bb::NUM_INSTANCES; idx++) {
336 auto prover_polynomials = get_sequential_prover_polynomials<Flavor>(
338 restrict_to_standard_arithmetic_relation(prover_polynomials);
340 key->set_dyadic_size(2);
352 using TupleOfArraysOfValues =
decltype(create_tuple_of_arrays_of_values<typename Flavor::Relations>());
353 TupleOfArraysOfValues temporary_accumulator{};
356 for (
size_t i = 0; i < 2; i++) {
357 UltraArithmeticRelation::accumulate(
std::get<0>(temporary_accumulator),
358 keys[bb::NUM_INSTANCES - 1]->polynomials.get_row(i),
365 keys[1]->polynomials.q_c.at(0) -= key_offset;
367 extended_polynomials;
370 for (
size_t idx = bb::NUM_INSTANCES; idx < UNIVARIATE_LENGTH; idx++) {
373 auto prover_polynomials = get_zero_prover_polynomials<Flavor>(1);
374 for (
auto [key_0_polynomial, key_1_polynomial, new_polynomial] :
375 zip_view(keys[0]->polynomials.get_all(),
376 keys[1]->polynomials.get_all(),
377 prover_polynomials.get_all())) {
378 for (
size_t i = 0; i < 2; i++) {
379 new_polynomial.at(i) =
380 key_0_polynomial[i] + ((key_1_polynomial[i] - key_0_polynomial[i]) * idx);
383 extended_polynomials.push_back(
std::move(prover_polynomials));
385 std::array<FF, UNIVARIATE_LENGTH> precomputed_result{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
387 for (
size_t idx = 0; idx < UNIVARIATE_LENGTH; idx++) {
389 TupleOfArraysOfValues accumulator{};
390 if (idx < bb::NUM_INSTANCES) {
391 for (
size_t i = 0; i < 2; i++) {
392 UltraArithmeticRelation::accumulate(
std::get<0>(accumulator),
393 keys[idx]->polynomials.get_row(i),
398 for (
size_t i = 0; i < 2; i++) {
399 UltraArithmeticRelation::accumulate(
std::get<0>(accumulator),
400 extended_polynomials[idx - bb::NUM_INSTANCES].get_row(i),
405 precomputed_result[idx] =
std::get<0>(accumulator)[0];
411 keys, gate_separators, univariate_relation_parameters_no_skpping, alphas);
415 keys, gate_separators, univariate_relation_parameters, alphas, accumulators);
422 for (
size_t idx = 0; idx < bb::NUM_INSTANCES; idx++) {
424 auto prover_polynomials = get_zero_prover_polynomials<Flavor>(
426 restrict_to_standard_arithmetic_relation(prover_polynomials);
428 key->set_dyadic_size(2);
435 const auto create_add_gate = [](
auto& polys,
const size_t idx,
FF w_l,
FF w_r) {
436 polys.w_l.at(idx) = w_l;
437 polys.w_r.at(idx) = w_r;
438 polys.w_o.at(idx) = w_l + w_r;
439 polys.q_l.at(idx) = 1;
440 polys.q_r.at(idx) = 1;
441 polys.q_o.at(idx) = -1;
444 const auto create_mul_gate = [](
auto& polys,
const size_t idx,
FF w_l,
FF w_r) {
445 polys.w_l.at(idx) = w_l;
446 polys.w_r.at(idx) = w_r;
447 polys.w_o.at(idx) = w_l * w_r;
448 polys.q_m.at(idx) = 1;
449 polys.q_o.at(idx) = -1;
452 create_add_gate(keys[0]->polynomials, 0, 1, 2);
453 create_add_gate(keys[0]->polynomials, 1, 0, 4);
454 create_add_gate(keys[1]->polynomials, 0, 3, 4);
455 create_mul_gate(keys[1]->polynomials, 1, 1, 4);
457 restrict_to_standard_arithmetic_relation(keys[0]->polynomials);
458 restrict_to_standard_arithmetic_relation(keys[1]->polynomials);
483 keys, gate_separators, univariate_relation_parameters_no_skpping, alphas);
487 keys, gate_separators, univariate_relation_parameters, alphas, accumulators);
489 Univariate<FF, 12>(
std::array<FF, 12>{ 0, 0, 12, 36, 72, 120, 180, 252, 336, 432, 540, 660 });