173TEST(Protogalaxy, CombinerOn2Keys)
178 const auto restrict_to_standard_arithmetic_relation = [](
auto& polys) {
179 std::fill(polys.q_arith.coeffs().begin(), polys.q_arith.coeffs().end(), 1);
180 std::fill(polys.q_delta_range.coeffs().begin(), polys.q_delta_range.coeffs().end(), 0);
181 std::fill(polys.q_elliptic.coeffs().begin(), polys.q_elliptic.coeffs().end(), 0);
182 std::fill(polys.q_memory.coeffs().begin(), polys.q_memory.coeffs().end(), 0);
183 std::fill(polys.q_nnf.coeffs().begin(), polys.q_nnf.coeffs().end(), 0);
184 std::fill(polys.q_lookup.coeffs().begin(), polys.q_lookup.coeffs().end(), 0);
185 std::fill(polys.q_4.coeffs().begin(), polys.q_4.coeffs().end(), 0);
186 std::fill(polys.q_poseidon2_external.coeffs().begin(), polys.q_poseidon2_external.coeffs().end(), 0);
187 std::fill(polys.q_poseidon2_internal.coeffs().begin(), polys.q_poseidon2_internal.coeffs().end(), 0);
188 std::fill(polys.w_4.coeffs().begin(), polys.w_4.coeffs().end(), 0);
189 std::fill(polys.w_4_shift.coeffs().begin(), polys.w_4_shift.coeffs().end(), 0);
192 auto run_test = [&](
bool is_random_input) {
197 if (is_random_input) {
200 for (
size_t idx = 0; idx <
NUM_KEYS; idx++) {
202 auto prover_polynomials = get_sequential_prover_polynomials<Flavor>(
204 restrict_to_standard_arithmetic_relation(prover_polynomials);
206 key->set_dyadic_size(2);
207 keys_data[idx] =
key;
210 DeciderProvingKeys keys{ keys_data };
216 keys, gate_separators, univariate_relation_parameters_no_skpping, alphas);
234 for (
size_t idx = 0; idx <
NUM_KEYS; idx++) {
236 auto prover_polynomials = get_zero_prover_polynomials<Flavor>(
238 restrict_to_standard_arithmetic_relation(prover_polynomials);
240 key->set_dyadic_size(2);
241 keys_data[idx] =
key;
244 DeciderProvingKeys keys{ keys_data };
248 const auto create_add_gate = [](
auto& polys,
const size_t idx,
FF w_l,
FF w_r) {
249 polys.w_l.at(idx) = w_l;
250 polys.w_r.at(idx) = w_r;
251 polys.w_o.at(idx) = w_l + w_r;
252 polys.q_l.at(idx) = 1;
253 polys.q_r.at(idx) = 1;
254 polys.q_o.at(idx) = -1;
257 const auto create_mul_gate = [](
auto& polys,
const size_t idx,
FF w_l,
FF w_r) {
258 polys.w_l.at(idx) = w_l;
259 polys.w_r.at(idx) = w_r;
260 polys.w_o.at(idx) = w_l * w_r;
261 polys.q_m.at(idx) = 1;
262 polys.q_o.at(idx) = -1;
265 create_add_gate(keys[0]->polynomials, 0, 1, 2);
266 create_add_gate(keys[0]->polynomials, 1, 0, 4);
267 create_add_gate(keys[1]->polynomials, 0, 3, 4);
268 create_mul_gate(keys[1]->polynomials, 1, 1, 4);
270 restrict_to_standard_arithmetic_relation(keys[0]->polynomials);
271 restrict_to_standard_arithmetic_relation(keys[1]->polynomials);
296 keys, gate_separators, univariate_relation_parameters_no_skpping, alphas);
297 auto result_with_skipping =
298 pg_internal.
compute_combiner(keys, gate_separators, univariate_relation_parameters, alphas);
300 Univariate<FF, 12>(
std::array<FF, 12>{ 0, 0, 12, 36, 72, 120, 180, 252, 336, 432, 540, 660 });
311TEST(Protogalaxy, CombinerOptimizationConsistency)
317 constexpr size_t UNIVARIATE_LENGTH = 12;
318 const auto restrict_to_standard_arithmetic_relation = [](
auto& polys) {
319 std::fill(polys.q_arith.coeffs().begin(), polys.q_arith.coeffs().end(), 1);
320 std::fill(polys.q_delta_range.coeffs().begin(), polys.q_delta_range.coeffs().end(), 0);
321 std::fill(polys.q_elliptic.coeffs().begin(), polys.q_elliptic.coeffs().end(), 0);
322 std::fill(polys.q_memory.coeffs().begin(), polys.q_memory.coeffs().end(), 0);
323 std::fill(polys.q_nnf.coeffs().begin(), polys.q_nnf.coeffs().end(), 0);
324 std::fill(polys.q_lookup.coeffs().begin(), polys.q_lookup.coeffs().end(), 0);
325 std::fill(polys.q_4.coeffs().begin(), polys.q_4.coeffs().end(), 0);
326 std::fill(polys.w_4.coeffs().begin(), polys.w_4.coeffs().end(), 0);
327 std::fill(polys.w_4_shift.coeffs().begin(), polys.w_4_shift.coeffs().end(), 0);
330 auto run_test = [&](
bool is_random_input) {
335 if (is_random_input) {
339 for (
size_t idx = 0; idx <
NUM_KEYS; idx++) {
341 auto prover_polynomials = get_sequential_prover_polynomials<Flavor>(
343 restrict_to_standard_arithmetic_relation(prover_polynomials);
345 key->set_dyadic_size(2);
346 keys_data[idx] =
key;
349 DeciderProvingKeys keys{ keys_data };
358 using TupleOfArraysOfValues =
decltype(create_tuple_of_arrays_of_values<typename Flavor::Relations>());
359 TupleOfArraysOfValues temporary_accumulator{};
362 for (
size_t i = 0; i < 2; i++) {
363 UltraArithmeticRelation::accumulate(
std::get<0>(temporary_accumulator),
364 keys_data[
NUM_KEYS - 1]->polynomials.get_row(i),
371 keys_data[1]->polynomials.q_c.at(0) -= key_offset;
373 extended_polynomials;
376 for (
size_t idx =
NUM_KEYS; idx < UNIVARIATE_LENGTH; idx++) {
379 auto prover_polynomials = get_zero_prover_polynomials<Flavor>(1);
380 for (
auto [key_0_polynomial, key_1_polynomial, new_polynomial] :
381 zip_view(keys_data[0]->polynomials.get_all(),
382 keys_data[1]->polynomials.get_all(),
383 prover_polynomials.get_all())) {
384 for (
size_t i = 0; i < 2; i++) {
385 new_polynomial.at(i) =
386 key_0_polynomial[i] + ((key_1_polynomial[i] - key_0_polynomial[i]) * idx);
389 extended_polynomials.push_back(
std::move(prover_polynomials));
391 std::array<FF, UNIVARIATE_LENGTH> precomputed_result{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
393 for (
size_t idx = 0; idx < UNIVARIATE_LENGTH; idx++) {
395 TupleOfArraysOfValues accumulator{};
397 for (
size_t i = 0; i < 2; i++) {
398 UltraArithmeticRelation::accumulate(
std::get<0>(accumulator),
399 keys_data[idx]->polynomials.get_row(i),
404 for (
size_t i = 0; i < 2; i++) {
405 UltraArithmeticRelation::accumulate(
std::get<0>(accumulator),
406 extended_polynomials[idx -
NUM_KEYS].get_row(i),
411 precomputed_result[idx] =
std::get<0>(accumulator)[0];
417 keys, gate_separators, univariate_relation_parameters_no_skpping, alphas);
418 auto result_with_skipping =
419 pg_internal.
compute_combiner(keys, gate_separators, univariate_relation_parameters, alphas);
426 for (
size_t idx = 0; idx <
NUM_KEYS; idx++) {
428 auto prover_polynomials = get_zero_prover_polynomials<Flavor>(
430 restrict_to_standard_arithmetic_relation(prover_polynomials);
432 key->set_dyadic_size(2);
433 keys_data[idx] =
key;
436 DeciderProvingKeys keys{ keys_data };
440 const auto create_add_gate = [](
auto& polys,
const size_t idx,
FF w_l,
FF w_r) {
441 polys.w_l.at(idx) = w_l;
442 polys.w_r.at(idx) = w_r;
443 polys.w_o.at(idx) = w_l + w_r;
444 polys.q_l.at(idx) = 1;
445 polys.q_r.at(idx) = 1;
446 polys.q_o.at(idx) = -1;
449 const auto create_mul_gate = [](
auto& polys,
const size_t idx,
FF w_l,
FF w_r) {
450 polys.w_l.at(idx) = w_l;
451 polys.w_r.at(idx) = w_r;
452 polys.w_o.at(idx) = w_l * w_r;
453 polys.q_m.at(idx) = 1;
454 polys.q_o.at(idx) = -1;
457 create_add_gate(keys[0]->polynomials, 0, 1, 2);
458 create_add_gate(keys[0]->polynomials, 1, 0, 4);
459 create_add_gate(keys[1]->polynomials, 0, 3, 4);
460 create_mul_gate(keys[1]->polynomials, 1, 1, 4);
462 restrict_to_standard_arithmetic_relation(keys[0]->polynomials);
463 restrict_to_standard_arithmetic_relation(keys[1]->polynomials);
488 keys, gate_separators, univariate_relation_parameters_no_skpping, alphas);
489 auto result_with_skipping =
490 pg_internal.
compute_combiner(keys, gate_separators, univariate_relation_parameters, alphas);
492 Univariate<FF, 12>(
std::array<FF, 12>{ 0, 0, 12, 36, 72, 120, 180, 252, 336, 432, 540, 660 });