diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index 483c9f8095e..96c8a980c9b 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -325,7 +325,7 @@ template class ZeroMorphProver_ { // Extract multilinear challenge u and claimed multilinear evaluations from Sumcheck output std::span u_challenge = multilinear_challenge; - std::span claimed_evaluations = evaluations; + auto claimed_evaluations = evaluations.pointer_view(); size_t log_N = u_challenge.size(); size_t N = 1 << log_N; @@ -340,14 +340,14 @@ template class ZeroMorphProver_ { size_t poly_idx = 0; // TODO(#391) zip for (auto& f_poly : f_polynomials) { f_batched.add_scaled(f_poly, rhos[poly_idx]); - batched_evaluation += rhos[poly_idx] * claimed_evaluations[poly_idx]; + batched_evaluation += rhos[poly_idx] * (*claimed_evaluations[poly_idx]); ++poly_idx; } Polynomial g_batched(N); // batched to-be-shifted polynomials for (auto& g_poly : g_polynomials) { g_batched.add_scaled(g_poly, rhos[poly_idx]); - batched_evaluation += rhos[poly_idx] * claimed_evaluations[poly_idx]; + batched_evaluation += rhos[poly_idx] * (*claimed_evaluations[poly_idx]); ++poly_idx; }; diff --git a/barretenberg/cpp/src/barretenberg/common/serialize.hpp b/barretenberg/cpp/src/barretenberg/common/serialize.hpp index 16d2c66e803..fb8360ac8b9 100644 --- a/barretenberg/cpp/src/barretenberg/common/serialize.hpp +++ b/barretenberg/cpp/src/barretenberg/common/serialize.hpp @@ -370,6 +370,18 @@ template inline void read(B& it, std::optional& opt_ opt_value = T(value); } +template +concept HasPointerView = requires(T t) { t.pointer_view(); }; + +// Write out a struct that defines pointer_view() +template inline void write(B& buf, T const& value) +{ + using serialize::write; + for (auto* pointer : value.pointer_view()) { + write(buf, *pointer); + } +} + // Write std::optional. // Note: It takes up a different amount of space, depending on whether it's std::nullopt or populated with an actual // value. diff --git a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp index 366616e9322..0fa3fb0c861 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp @@ -88,9 +88,11 @@ template class ECCVMBa template class PrecomputedEntities : public PrecomputedEntities_ { public: - DataType& lagrange_first = std::get<0>(this->_data); - DataType& lagrange_second = std::get<1>(this->_data); - DataType& lagrange_last = std::get<2>(this->_data); + DataType lagrange_first; // column 0 + DataType lagrange_second; // column 1 + DataType lagrange_last; // column 2 + + DEFINE_POINTER_VIEW(NUM_PRECOMPUTED_ENTITIES, &lagrange_first, &lagrange_second, &lagrange_last) std::vector get_selectors() override { return { lagrange_first, lagrange_second, lagrange_last }; }; std::vector get_sigma_polynomials() override { return {}; }; @@ -105,85 +107,160 @@ template class ECCVMBa template class WitnessEntities : public WitnessEntities_ { public: - // clang-format off - DataType& transcript_add = std::get<0>(this->_data); - DataType& transcript_mul = std::get<1>(this->_data); - DataType& transcript_eq = std::get<2>(this->_data); - DataType& transcript_collision_check = std::get<3>(this->_data); - DataType& transcript_msm_transition = std::get<4>(this->_data); - DataType& transcript_pc = std::get<5>(this->_data); - DataType& transcript_msm_count = std::get<6>(this->_data); - DataType& transcript_x = std::get<7>(this->_data); - DataType& transcript_y = std::get<8>(this->_data); - DataType& transcript_z1 = std::get<9>(this->_data); - DataType& transcript_z2 = std::get<10>(this->_data); - DataType& transcript_z1zero = std::get<11>(this->_data); - DataType& transcript_z2zero = std::get<12>(this->_data); - DataType& transcript_op = std::get<13>(this->_data); - DataType& transcript_accumulator_x = std::get<14>(this->_data); - DataType& transcript_accumulator_y = std::get<15>(this->_data); - DataType& transcript_msm_x = std::get<16>(this->_data); - DataType& transcript_msm_y = std::get<17>(this->_data); - DataType& precompute_pc = std::get<18>(this->_data); - DataType& precompute_point_transition = std::get<19>(this->_data); - DataType& precompute_round = std::get<20>(this->_data); - DataType& precompute_scalar_sum = std::get<21>(this->_data); - DataType& precompute_s1hi = std::get<22>(this->_data); - DataType& precompute_s1lo = std::get<23>(this->_data); - DataType& precompute_s2hi = std::get<24>(this->_data); - DataType& precompute_s2lo = std::get<25>(this->_data); - DataType& precompute_s3hi = std::get<26>(this->_data); - DataType& precompute_s3lo = std::get<27>(this->_data); - DataType& precompute_s4hi = std::get<28>(this->_data); - DataType& precompute_s4lo = std::get<29>(this->_data); - DataType& precompute_skew = std::get<30>(this->_data); - DataType& precompute_dx = std::get<31>(this->_data); - DataType& precompute_dy = std::get<32>(this->_data); - DataType& precompute_tx = std::get<33>(this->_data); - DataType& precompute_ty = std::get<34>(this->_data); - DataType& msm_transition = std::get<35>(this->_data); - DataType& msm_add = std::get<36>(this->_data); - DataType& msm_double = std::get<37>(this->_data); - DataType& msm_skew = std::get<38>(this->_data); - DataType& msm_accumulator_x = std::get<39>(this->_data); - DataType& msm_accumulator_y = std::get<40>(this->_data); - DataType& msm_pc = std::get<41>(this->_data); - DataType& msm_size_of_msm = std::get<42>(this->_data); - DataType& msm_count = std::get<43>(this->_data); - DataType& msm_round = std::get<44>(this->_data); - DataType& msm_add1 = std::get<45>(this->_data); - DataType& msm_add2 = std::get<46>(this->_data); - DataType& msm_add3 = std::get<47>(this->_data); - DataType& msm_add4 = std::get<48>(this->_data); - DataType& msm_x1 = std::get<49>(this->_data); - DataType& msm_y1 = std::get<50>(this->_data); - DataType& msm_x2 = std::get<51>(this->_data); - DataType& msm_y2 = std::get<52>(this->_data); - DataType& msm_x3 = std::get<53>(this->_data); - DataType& msm_y3 = std::get<54>(this->_data); - DataType& msm_x4 = std::get<55>(this->_data); - DataType& msm_y4 = std::get<56>(this->_data); - DataType& msm_collision_x1 = std::get<57>(this->_data); - DataType& msm_collision_x2 = std::get<58>(this->_data); - DataType& msm_collision_x3 = std::get<59>(this->_data); - DataType& msm_collision_x4 = std::get<60>(this->_data); - DataType& msm_lambda1 = std::get<61>(this->_data); - DataType& msm_lambda2 = std::get<62>(this->_data); - DataType& msm_lambda3 = std::get<63>(this->_data); - DataType& msm_lambda4 = std::get<64>(this->_data); - DataType& msm_slice1 = std::get<65>(this->_data); - DataType& msm_slice2 = std::get<66>(this->_data); - DataType& msm_slice3 = std::get<67>(this->_data); - DataType& msm_slice4 = std::get<68>(this->_data); - DataType& transcript_accumulator_empty = std::get<69>(this->_data); - DataType& transcript_reset_accumulator = std::get<70>(this->_data); - DataType& precompute_select = std::get<71>(this->_data); - DataType& lookup_read_counts_0 = std::get<72>(this->_data); - DataType& lookup_read_counts_1 = std::get<73>(this->_data); - DataType& z_perm = std::get<74>(this->_data); - DataType& lookup_inverses = std::get<75>(this->_data); + DataType transcript_add; // column 0 + DataType transcript_mul; // column 1 + DataType transcript_eq; // column 2 + DataType transcript_collision_check; // column 3 + DataType transcript_msm_transition; // column 4 + DataType transcript_pc; // column 5 + DataType transcript_msm_count; // column 6 + DataType transcript_x; // column 7 + DataType transcript_y; // column 8 + DataType transcript_z1; // column 9 + DataType transcript_z2; // column 10 + DataType transcript_z1zero; // column 11 + DataType transcript_z2zero; // column 12 + DataType transcript_op; // column 13 + DataType transcript_accumulator_x; // column 14 + DataType transcript_accumulator_y; // column 15 + DataType transcript_msm_x; // column 16 + DataType transcript_msm_y; // column 17 + DataType precompute_pc; // column 18 + DataType precompute_point_transition; // column 19 + DataType precompute_round; // column 20 + DataType precompute_scalar_sum; // column 21 + DataType precompute_s1hi; // column 22 + DataType precompute_s1lo; // column 23 + DataType precompute_s2hi; // column 24 + DataType precompute_s2lo; // column 25 + DataType precompute_s3hi; // column 26 + DataType precompute_s3lo; // column 27 + DataType precompute_s4hi; // column 28 + DataType precompute_s4lo; // column 29 + DataType precompute_skew; // column 30 + DataType precompute_dx; // column 31 + DataType precompute_dy; // column 32 + DataType precompute_tx; // column 33 + DataType precompute_ty; // column 34 + DataType msm_transition; // column 35 + DataType msm_add; // column 36 + DataType msm_double; // column 37 + DataType msm_skew; // column 38 + DataType msm_accumulator_x; // column 39 + DataType msm_accumulator_y; // column 40 + DataType msm_pc; // column 41 + DataType msm_size_of_msm; // column 42 + DataType msm_count; // column 43 + DataType msm_round; // column 44 + DataType msm_add1; // column 45 + DataType msm_add2; // column 46 + DataType msm_add3; // column 47 + DataType msm_add4; // column 48 + DataType msm_x1; // column 49 + DataType msm_y1; // column 50 + DataType msm_x2; // column 51 + DataType msm_y2; // column 52 + DataType msm_x3; // column 53 + DataType msm_y3; // column 54 + DataType msm_x4; // column 55 + DataType msm_y4; // column 56 + DataType msm_collision_x1; // column 57 + DataType msm_collision_x2; // column 58 + DataType msm_collision_x3; // column 59 + DataType msm_collision_x4; // column 60 + DataType msm_lambda1; // column 61 + DataType msm_lambda2; // column 62 + DataType msm_lambda3; // column 63 + DataType msm_lambda4; // column 64 + DataType msm_slice1; // column 65 + DataType msm_slice2; // column 66 + DataType msm_slice3; // column 67 + DataType msm_slice4; // column 68 + DataType transcript_accumulator_empty; // column 69 + DataType transcript_reset_accumulator; // column 70 + DataType precompute_select; // column 71 + DataType lookup_read_counts_0; // column 72 + DataType lookup_read_counts_1; // column 73 + DataType z_perm; // column 74 + DataType lookup_inverses; // column 75 - // clang-format on + DEFINE_POINTER_VIEW(NUM_WITNESS_ENTITIES, + &transcript_add, + &transcript_mul, + &transcript_eq, + &transcript_collision_check, + &transcript_msm_transition, + &transcript_pc, + &transcript_msm_count, + &transcript_x, + &transcript_y, + &transcript_z1, + &transcript_z2, + &transcript_z1zero, + &transcript_z2zero, + &transcript_op, + &transcript_accumulator_x, + &transcript_accumulator_y, + &transcript_msm_x, + &transcript_msm_y, + &precompute_pc, + &precompute_point_transition, + &precompute_round, + &precompute_scalar_sum, + &precompute_s1hi, + &precompute_s1lo, + &precompute_s2hi, + &precompute_s2lo, + &precompute_s3hi, + &precompute_s3lo, + &precompute_s4hi, + &precompute_s4lo, + &precompute_skew, + &precompute_dx, + &precompute_dy, + &precompute_tx, + &precompute_ty, + &msm_transition, + &msm_add, + &msm_double, + &msm_skew, + &msm_accumulator_x, + &msm_accumulator_y, + &msm_pc, + &msm_size_of_msm, + &msm_count, + &msm_round, + &msm_add1, + &msm_add2, + &msm_add3, + &msm_add4, + &msm_x1, + &msm_y1, + &msm_x2, + &msm_y2, + &msm_x3, + &msm_y3, + &msm_x4, + &msm_y4, + &msm_collision_x1, + &msm_collision_x2, + &msm_collision_x3, + &msm_collision_x4, + &msm_lambda1, + &msm_lambda2, + &msm_lambda3, + &msm_lambda4, + &msm_slice1, + &msm_slice2, + &msm_slice3, + &msm_slice4, + &transcript_accumulator_empty, + &transcript_reset_accumulator, + &precompute_select, + &lookup_read_counts_0, + &lookup_read_counts_1, + &z_perm, + &lookup_inverses) std::vector get_wires() override { return { @@ -279,120 +356,121 @@ template class ECCVMBa template class AllEntities : public AllEntities_ { public: - // clang-format off - DataType& lagrange_first = std::get<0>(this->_data); - DataType& lagrange_second = std::get<1>(this->_data); - DataType& lagrange_last = std::get<2>(this->_data); - DataType& transcript_add = std::get<3>(this->_data); - DataType& transcript_mul = std::get<4>(this->_data); - DataType& transcript_eq = std::get<5>(this->_data); - DataType& transcript_collision_check = std::get<6>(this->_data); - DataType& transcript_msm_transition = std::get<7>(this->_data); - DataType& transcript_pc = std::get<8>(this->_data); - DataType& transcript_msm_count = std::get<9>(this->_data); - DataType& transcript_x = std::get<10>(this->_data); - DataType& transcript_y = std::get<11>(this->_data); - DataType& transcript_z1 = std::get<12>(this->_data); - DataType& transcript_z2 = std::get<13>(this->_data); - DataType& transcript_z1zero = std::get<14>(this->_data); - DataType& transcript_z2zero = std::get<15>(this->_data); - DataType& transcript_op = std::get<16>(this->_data); - DataType& transcript_accumulator_x = std::get<17>(this->_data); - DataType& transcript_accumulator_y = std::get<18>(this->_data); - DataType& transcript_msm_x = std::get<19>(this->_data); - DataType& transcript_msm_y = std::get<20>(this->_data); - DataType& precompute_pc = std::get<21>(this->_data); - DataType& precompute_point_transition = std::get<22>(this->_data); - DataType& precompute_round = std::get<23>(this->_data); - DataType& precompute_scalar_sum = std::get<24>(this->_data); - DataType& precompute_s1hi = std::get<25>(this->_data); - DataType& precompute_s1lo = std::get<26>(this->_data); - DataType& precompute_s2hi = std::get<27>(this->_data); - DataType& precompute_s2lo = std::get<28>(this->_data); - DataType& precompute_s3hi = std::get<29>(this->_data); - DataType& precompute_s3lo = std::get<30>(this->_data); - DataType& precompute_s4hi = std::get<31>(this->_data); - DataType& precompute_s4lo = std::get<32>(this->_data); - DataType& precompute_skew = std::get<33>(this->_data); - DataType& precompute_dx = std::get<34>(this->_data); - DataType& precompute_dy = std::get<35>(this->_data); - DataType& precompute_tx = std::get<36>(this->_data); - DataType& precompute_ty = std::get<37>(this->_data); - DataType& msm_transition = std::get<38>(this->_data); - DataType& msm_add = std::get<39>(this->_data); - DataType& msm_double = std::get<40>(this->_data); - DataType& msm_skew = std::get<41>(this->_data); - DataType& msm_accumulator_x = std::get<42>(this->_data); - DataType& msm_accumulator_y = std::get<43>(this->_data); - DataType& msm_pc = std::get<44>(this->_data); - DataType& msm_size_of_msm = std::get<45>(this->_data); - DataType& msm_count = std::get<46>(this->_data); - DataType& msm_round = std::get<47>(this->_data); - DataType& msm_add1 = std::get<48>(this->_data); - DataType& msm_add2 = std::get<49>(this->_data); - DataType& msm_add3 = std::get<50>(this->_data); - DataType& msm_add4 = std::get<51>(this->_data); - DataType& msm_x1 = std::get<52>(this->_data); - DataType& msm_y1 = std::get<53>(this->_data); - DataType& msm_x2 = std::get<54>(this->_data); - DataType& msm_y2 = std::get<55>(this->_data); - DataType& msm_x3 = std::get<56>(this->_data); - DataType& msm_y3 = std::get<57>(this->_data); - DataType& msm_x4 = std::get<58>(this->_data); - DataType& msm_y4 = std::get<59>(this->_data); - DataType& msm_collision_x1 = std::get<60>(this->_data); - DataType& msm_collision_x2 = std::get<61>(this->_data); - DataType& msm_collision_x3 = std::get<62>(this->_data); - DataType& msm_collision_x4 = std::get<63>(this->_data); - DataType& msm_lambda1 = std::get<64>(this->_data); - DataType& msm_lambda2 = std::get<65>(this->_data); - DataType& msm_lambda3 = std::get<66>(this->_data); - DataType& msm_lambda4 = std::get<67>(this->_data); - DataType& msm_slice1 = std::get<68>(this->_data); - DataType& msm_slice2 = std::get<69>(this->_data); - DataType& msm_slice3 = std::get<70>(this->_data); - DataType& msm_slice4 = std::get<71>(this->_data); - DataType& transcript_accumulator_empty = std::get<72>(this->_data); - DataType& transcript_reset_accumulator = std::get<73>(this->_data); - DataType& precompute_select = std::get<74>(this->_data); - DataType& lookup_read_counts_0 = std::get<75>(this->_data); - DataType& lookup_read_counts_1 = std::get<76>(this->_data); - DataType& z_perm = std::get<77>(this->_data); - DataType& lookup_inverses = std::get<78>(this->_data); - DataType& transcript_mul_shift = std::get<79>(this->_data); - DataType& transcript_msm_count_shift = std::get<80>(this->_data); - DataType& transcript_accumulator_x_shift = std::get<81>(this->_data); - DataType& transcript_accumulator_y_shift = std::get<82>(this->_data); - DataType& precompute_scalar_sum_shift = std::get<83>(this->_data); - DataType& precompute_s1hi_shift = std::get<84>(this->_data); - DataType& precompute_dx_shift = std::get<85>(this->_data); - DataType& precompute_dy_shift = std::get<86>(this->_data); - DataType& precompute_tx_shift = std::get<87>(this->_data); - DataType& precompute_ty_shift = std::get<88>(this->_data); - DataType& msm_transition_shift = std::get<89>(this->_data); - DataType& msm_add_shift = std::get<90>(this->_data); - DataType& msm_double_shift = std::get<91>(this->_data); - DataType& msm_skew_shift = std::get<92>(this->_data); - DataType& msm_accumulator_x_shift = std::get<93>(this->_data); - DataType& msm_accumulator_y_shift = std::get<94>(this->_data); - DataType& msm_count_shift = std::get<95>(this->_data); - DataType& msm_round_shift = std::get<96>(this->_data); - DataType& msm_add1_shift = std::get<97>(this->_data); - DataType& msm_pc_shift = std::get<98>(this->_data); - DataType& precompute_pc_shift = std::get<99>(this->_data); - DataType& transcript_pc_shift = std::get<100>(this->_data); - DataType& precompute_round_shift = std::get<101>(this->_data); - DataType& transcript_accumulator_empty_shift = std::get<102>(this->_data); - DataType& precompute_select_shift = std::get<103>(this->_data); - DataType& z_perm_shift = std::get<104>(this->_data); + DataType lagrange_first; // column 0 + DataType lagrange_second; // column 1 + DataType lagrange_last; // column 2 + DataType transcript_add; // column 3 + DataType transcript_mul; // column 4 + DataType transcript_eq; // column 5 + DataType transcript_collision_check; // column 6 + DataType transcript_msm_transition; // column 7 + DataType transcript_pc; // column 8 + DataType transcript_msm_count; // column 9 + DataType transcript_x; // column 10 + DataType transcript_y; // column 11 + DataType transcript_z1; // column 12 + DataType transcript_z2; // column 13 + DataType transcript_z1zero; // column 14 + DataType transcript_z2zero; // column 15 + DataType transcript_op; // column 16 + DataType transcript_accumulator_x; // column 17 + DataType transcript_accumulator_y; // column 18 + DataType transcript_msm_x; // column 19 + DataType transcript_msm_y; // column 20 + DataType precompute_pc; // column 21 + DataType precompute_point_transition; // column 22 + DataType precompute_round; // column 23 + DataType precompute_scalar_sum; // column 24 + DataType precompute_s1hi; // column 25 + DataType precompute_s1lo; // column 26 + DataType precompute_s2hi; // column 27 + DataType precompute_s2lo; // column 28 + DataType precompute_s3hi; // column 29 + DataType precompute_s3lo; // column 30 + DataType precompute_s4hi; // column 31 + DataType precompute_s4lo; // column 32 + DataType precompute_skew; // column 33 + DataType precompute_dx; // column 34 + DataType precompute_dy; // column 35 + DataType precompute_tx; // column 36 + DataType precompute_ty; // column 37 + DataType msm_transition; // column 38 + DataType msm_add; // column 39 + DataType msm_double; // column 40 + DataType msm_skew; // column 41 + DataType msm_accumulator_x; // column 42 + DataType msm_accumulator_y; // column 43 + DataType msm_pc; // column 44 + DataType msm_size_of_msm; // column 45 + DataType msm_count; // column 46 + DataType msm_round; // column 47 + DataType msm_add1; // column 48 + DataType msm_add2; // column 49 + DataType msm_add3; // column 50 + DataType msm_add4; // column 51 + DataType msm_x1; // column 52 + DataType msm_y1; // column 53 + DataType msm_x2; // column 54 + DataType msm_y2; // column 55 + DataType msm_x3; // column 56 + DataType msm_y3; // column 57 + DataType msm_x4; // column 58 + DataType msm_y4; // column 59 + DataType msm_collision_x1; // column 60 + DataType msm_collision_x2; // column 61 + DataType msm_collision_x3; // column 62 + DataType msm_collision_x4; // column 63 + DataType msm_lambda1; // column 64 + DataType msm_lambda2; // column 65 + DataType msm_lambda3; // column 66 + DataType msm_lambda4; // column 67 + DataType msm_slice1; // column 68 + DataType msm_slice2; // column 69 + DataType msm_slice3; // column 70 + DataType msm_slice4; // column 71 + DataType transcript_accumulator_empty; // column 72 + DataType transcript_reset_accumulator; // column 73 + DataType precompute_select; // column 74 + DataType lookup_read_counts_0; // column 75 + DataType lookup_read_counts_1; // column 76 + DataType z_perm; // column 77 + DataType lookup_inverses; // column 78 + DataType transcript_mul_shift; // column 79 + DataType transcript_msm_count_shift; // column 80 + DataType transcript_accumulator_x_shift; // column 81 + DataType transcript_accumulator_y_shift; // column 82 + DataType precompute_scalar_sum_shift; // column 83 + DataType precompute_s1hi_shift; // column 84 + DataType precompute_dx_shift; // column 85 + DataType precompute_dy_shift; // column 86 + DataType precompute_tx_shift; // column 87 + DataType precompute_ty_shift; // column 88 + DataType msm_transition_shift; // column 89 + DataType msm_add_shift; // column 90 + DataType msm_double_shift; // column 91 + DataType msm_skew_shift; // column 92 + DataType msm_accumulator_x_shift; // column 93 + DataType msm_accumulator_y_shift; // column 94 + DataType msm_count_shift; // column 95 + DataType msm_round_shift; // column 96 + DataType msm_add1_shift; // column 97 + DataType msm_pc_shift; // column 98 + DataType precompute_pc_shift; // column 99 + DataType transcript_pc_shift; // column 100 + DataType precompute_round_shift; // column 101 + DataType transcript_accumulator_empty_shift; // column 102 + DataType precompute_select_shift; // column 103 + DataType z_perm_shift; // column 104 - template - [[nodiscard]] const DataType& lookup_read_counts() const + template [[nodiscard]] const DataType& lookup_read_counts() const { - static_assert(index == 0 || index == 1); - return std::get<75 + index>(this->_data); + if constexpr (index == 0) { + return lookup_read_counts_0; + } else { + static_assert(index == 1); + return lookup_read_counts_1; + } } - // clang-format on // defines a method pointer_view that returns the following, with const and non-const variants DEFINE_POINTER_VIEW(NUM_ALL_ENTITIES, @@ -702,31 +780,6 @@ template class ECCVMBa z_perm_shift, }; }; - - AllEntities() = default; - - AllEntities(const AllEntities& other) - : AllEntities_(other){}; - - AllEntities(AllEntities&& other) noexcept - : AllEntities_(other){}; - - AllEntities& operator=(const AllEntities& other) - { - if (this == &other) { - return *this; - } - AllEntities_::operator=(other); - return *this; - } - - AllEntities& operator=(AllEntities&& other) noexcept - { - AllEntities_::operator=(other); - return *this; - } - - ~AllEntities() override = default; }; public: @@ -813,8 +866,8 @@ template class ECCVMBa PartiallyEvaluatedMultivariates(const size_t circuit_size) { // Storage is only needed after the first partial evaluation, hence polynomials of size (n / 2) - for (auto& poly : this->_data) { - poly = Polynomial(circuit_size / 2); + for (auto* poly : this->pointer_view()) { + *poly = Polynomial(circuit_size / 2); } } }; diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index 7f044f495e0..61106f14bb4 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -75,21 +75,20 @@ namespace proof_system::honk::flavor { -template static auto _assert_array_size(std::array&& array) -{ - static_assert(N == ExpectedSize, - "Expected array size to match given size (first parameter) in DEFINE_POINTER_VIEW"); - return array; -} - #define DEFINE_POINTER_VIEW(ExpectedSize, ...) \ [[nodiscard]] auto pointer_view() \ { \ - return _assert_array_size(std::array{ __VA_ARGS__ }); \ + std::array view{ __VA_ARGS__ }; \ + static_assert(view.size() == ExpectedSize, \ + "Expected array size to match given size (first parameter) in DEFINE_POINTER_VIEW"); \ + return view; \ } \ [[nodiscard]] auto pointer_view() const \ { \ - return _assert_array_size(std::array{ __VA_ARGS__ }); \ + std::array view{ __VA_ARGS__ }; \ + static_assert(view.size() == ExpectedSize, \ + "Expected array size to match given size (first parameter) in DEFINE_POINTER_VIEW"); \ + return view; \ } /** @@ -101,13 +100,7 @@ template static auto _asse */ template class Entities_ { public: - using ArrayType = std::array; - ArrayType _data; - virtual ~Entities_() = default; - // TODO(AD): remove these with the backing array - typename ArrayType::iterator begin() { return _data.begin(); }; - typename ArrayType::iterator end() { return _data.end(); }; constexpr size_t size() { return NUM_ENTITIES; }; }; @@ -154,13 +147,11 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { using Polynomial = typename PrecomputedPolynomials::DataType; using FF = typename Polynomial::FF; - typename PrecomputedPolynomials::ArrayType& _precomputed_polynomials = PrecomputedPolynomials::_data; - typename WitnessPolynomials::ArrayType& _witness_polynomials = WitnessPolynomials::_data; - bool contains_recursive_proof; std::vector recursive_proof_public_input_indices; barretenberg::EvaluationDomain evaluation_domain; + auto precomputed_polynomials_pointer_view() { return PrecomputedPolynomials::pointer_view(); } ProvingKey_() = default; ProvingKey_(const size_t circuit_size, const size_t num_public_inputs) { @@ -169,12 +160,12 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { this->log_circuit_size = numeric::get_msb(circuit_size); this->num_public_inputs = num_public_inputs; // Allocate memory for precomputed polynomials - for (auto& poly : _precomputed_polynomials) { - poly = Polynomial(circuit_size); + for (auto* poly : PrecomputedPolynomials::pointer_view()) { + *poly = Polynomial(circuit_size); } // Allocate memory for witness polynomials - for (auto& poly : _witness_polynomials) { - poly = Polynomial(circuit_size); + for (auto* poly : WitnessPolynomials::pointer_view()) { + *poly = Polynomial(circuit_size); } }; }; diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp index 167bc9db017..92d5c2a980c 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp @@ -140,9 +140,8 @@ TEST(Flavor, GetRow) }); Flavor::ProverPolynomials prover_polynomials; size_t poly_idx = 0; - for (auto& poly : prover_polynomials) { - poly = data[poly_idx]; - poly_idx++; + for (auto [poly, entry] : zip_view(prover_polynomials.pointer_view(), data)) { + *poly = entry; } auto row0 = prover_polynomials.get_row(0); auto row1 = prover_polynomials.get_row(1); diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index 136d60e6cc5..0bd927302ff 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -339,14 +339,22 @@ template class GoblinTranslator_ { */ class PrecomputedEntities : public PrecomputedEntities_ { public: - DataType& lagrange_first = std::get<0>(this->_data); - DataType& lagrange_last = std::get<1>(this->_data); + DataType lagrange_first; // column 0 + DataType lagrange_last; // column 1 // TODO(#758): Check if one of these can be replaced by shifts - DataType& lagrange_odd_in_minicircuit = std::get<2>(this->_data); - DataType& lagrange_even_in_minicircuit = std::get<3>(this->_data); - DataType& lagrange_second = std::get<4>(this->_data); - DataType& lagrange_second_to_last_in_minicircuit = std::get<5>(this->_data); - DataType& ordered_extra_range_constraints_numerator = std::get<6>(this->_data); + DataType lagrange_odd_in_minicircuit; // column 2 + DataType lagrange_even_in_minicircuit; // column 3 + DataType lagrange_second; // column 4 + DataType lagrange_second_to_last_in_minicircuit; // column 5 + DataType ordered_extra_range_constraints_numerator; // column 6 + DEFINE_POINTER_VIEW(NUM_PRECOMPUTED_ENTITIES, + &lagrange_first, + &lagrange_last, + &lagrange_odd_in_minicircuit, + &lagrange_even_in_minicircuit, + &lagrange_second, + &lagrange_second_to_last_in_minicircuit, + &ordered_extra_range_constraints_numerator); std::vector get_selectors() { return {}; }; std::vector get_sigma_polynomials() { return {}; }; std::vector get_id_polynomials() { return {}; }; @@ -359,97 +367,190 @@ template class GoblinTranslator_ { template class WitnessEntities : public WitnessEntities_ { public: - DataType& op = std::get<0>(this->_data); - DataType& x_lo_y_hi = std::get<1>(this->_data); - DataType& x_hi_z_1 = std::get<2>(this->_data); - DataType& y_lo_z_2 = std::get<3>(this->_data); - DataType& p_x_low_limbs = std::get<4>(this->_data); - DataType& p_x_low_limbs_range_constraint_0 = std::get<5>(this->_data); - DataType& p_x_low_limbs_range_constraint_1 = std::get<6>(this->_data); - DataType& p_x_low_limbs_range_constraint_2 = std::get<7>(this->_data); - DataType& p_x_low_limbs_range_constraint_3 = std::get<8>(this->_data); - DataType& p_x_low_limbs_range_constraint_4 = std::get<9>(this->_data); - DataType& p_x_low_limbs_range_constraint_tail = std::get<10>(this->_data); - DataType& p_x_high_limbs = std::get<11>(this->_data); - DataType& p_x_high_limbs_range_constraint_0 = std::get<12>(this->_data); - DataType& p_x_high_limbs_range_constraint_1 = std::get<13>(this->_data); - DataType& p_x_high_limbs_range_constraint_2 = std::get<14>(this->_data); - DataType& p_x_high_limbs_range_constraint_3 = std::get<15>(this->_data); - DataType& p_x_high_limbs_range_constraint_4 = std::get<16>(this->_data); - DataType& p_x_high_limbs_range_constraint_tail = std::get<17>(this->_data); - DataType& p_y_low_limbs = std::get<18>(this->_data); - DataType& p_y_low_limbs_range_constraint_0 = std::get<19>(this->_data); - DataType& p_y_low_limbs_range_constraint_1 = std::get<20>(this->_data); - DataType& p_y_low_limbs_range_constraint_2 = std::get<21>(this->_data); - DataType& p_y_low_limbs_range_constraint_3 = std::get<22>(this->_data); - DataType& p_y_low_limbs_range_constraint_4 = std::get<23>(this->_data); - DataType& p_y_low_limbs_range_constraint_tail = std::get<24>(this->_data); - DataType& p_y_high_limbs = std::get<25>(this->_data); - DataType& p_y_high_limbs_range_constraint_0 = std::get<26>(this->_data); - DataType& p_y_high_limbs_range_constraint_1 = std::get<27>(this->_data); - DataType& p_y_high_limbs_range_constraint_2 = std::get<28>(this->_data); - DataType& p_y_high_limbs_range_constraint_3 = std::get<29>(this->_data); - DataType& p_y_high_limbs_range_constraint_4 = std::get<30>(this->_data); - DataType& p_y_high_limbs_range_constraint_tail = std::get<31>(this->_data); - DataType& z_low_limbs = std::get<32>(this->_data); - DataType& z_low_limbs_range_constraint_0 = std::get<33>(this->_data); - DataType& z_low_limbs_range_constraint_1 = std::get<34>(this->_data); - DataType& z_low_limbs_range_constraint_2 = std::get<35>(this->_data); - DataType& z_low_limbs_range_constraint_3 = std::get<36>(this->_data); - DataType& z_low_limbs_range_constraint_4 = std::get<37>(this->_data); - DataType& z_low_limbs_range_constraint_tail = std::get<38>(this->_data); - DataType& z_high_limbs = std::get<39>(this->_data); - DataType& z_high_limbs_range_constraint_0 = std::get<40>(this->_data); - DataType& z_high_limbs_range_constraint_1 = std::get<41>(this->_data); - DataType& z_high_limbs_range_constraint_2 = std::get<42>(this->_data); - DataType& z_high_limbs_range_constraint_3 = std::get<43>(this->_data); - DataType& z_high_limbs_range_constraint_4 = std::get<44>(this->_data); - DataType& z_high_limbs_range_constraint_tail = std::get<45>(this->_data); - DataType& accumulators_binary_limbs_0 = std::get<46>(this->_data); - DataType& accumulators_binary_limbs_1 = std::get<47>(this->_data); - DataType& accumulators_binary_limbs_2 = std::get<48>(this->_data); - DataType& accumulators_binary_limbs_3 = std::get<49>(this->_data); - DataType& accumulator_low_limbs_range_constraint_0 = std::get<50>(this->_data); - DataType& accumulator_low_limbs_range_constraint_1 = std::get<51>(this->_data); - DataType& accumulator_low_limbs_range_constraint_2 = std::get<52>(this->_data); - DataType& accumulator_low_limbs_range_constraint_3 = std::get<53>(this->_data); - DataType& accumulator_low_limbs_range_constraint_4 = std::get<54>(this->_data); - DataType& accumulator_low_limbs_range_constraint_tail = std::get<55>(this->_data); - DataType& accumulator_high_limbs_range_constraint_0 = std::get<56>(this->_data); - DataType& accumulator_high_limbs_range_constraint_1 = std::get<57>(this->_data); - DataType& accumulator_high_limbs_range_constraint_2 = std::get<58>(this->_data); - DataType& accumulator_high_limbs_range_constraint_3 = std::get<59>(this->_data); - DataType& accumulator_high_limbs_range_constraint_4 = std::get<60>(this->_data); - DataType& accumulator_high_limbs_range_constraint_tail = std::get<61>(this->_data); - DataType& quotient_low_binary_limbs = std::get<62>(this->_data); - DataType& quotient_high_binary_limbs = std::get<63>(this->_data); - DataType& quotient_low_limbs_range_constraint_0 = std::get<64>(this->_data); - DataType& quotient_low_limbs_range_constraint_1 = std::get<65>(this->_data); - DataType& quotient_low_limbs_range_constraint_2 = std::get<66>(this->_data); - DataType& quotient_low_limbs_range_constraint_3 = std::get<67>(this->_data); - DataType& quotient_low_limbs_range_constraint_4 = std::get<68>(this->_data); - DataType& quotient_low_limbs_range_constraint_tail = std::get<69>(this->_data); - DataType& quotient_high_limbs_range_constraint_0 = std::get<70>(this->_data); - DataType& quotient_high_limbs_range_constraint_1 = std::get<71>(this->_data); - DataType& quotient_high_limbs_range_constraint_2 = std::get<72>(this->_data); - DataType& quotient_high_limbs_range_constraint_3 = std::get<73>(this->_data); - DataType& quotient_high_limbs_range_constraint_4 = std::get<74>(this->_data); - DataType& quotient_high_limbs_range_constraint_tail = std::get<75>(this->_data); - DataType& relation_wide_limbs = std::get<76>(this->_data); - DataType& relation_wide_limbs_range_constraint_0 = std::get<77>(this->_data); - DataType& relation_wide_limbs_range_constraint_1 = std::get<78>(this->_data); - DataType& relation_wide_limbs_range_constraint_2 = std::get<79>(this->_data); - DataType& relation_wide_limbs_range_constraint_3 = std::get<80>(this->_data); - DataType& concatenated_range_constraints_0 = std::get<81>(this->_data); - DataType& concatenated_range_constraints_1 = std::get<82>(this->_data); - DataType& concatenated_range_constraints_2 = std::get<83>(this->_data); - DataType& concatenated_range_constraints_3 = std::get<84>(this->_data); - DataType& ordered_range_constraints_0 = std::get<85>(this->_data); - DataType& ordered_range_constraints_1 = std::get<86>(this->_data); - DataType& ordered_range_constraints_2 = std::get<87>(this->_data); - DataType& ordered_range_constraints_3 = std::get<88>(this->_data); - DataType& ordered_range_constraints_4 = std::get<89>(this->_data); - DataType& z_perm = std::get<90>(this->_data); + DataType op; // column 0 + DataType x_lo_y_hi; // column 1 + DataType x_hi_z_1; // column 2 + DataType y_lo_z_2; // column 3 + DataType p_x_low_limbs; // column 4 + DataType p_x_low_limbs_range_constraint_0; // column 5 + DataType p_x_low_limbs_range_constraint_1; // column 6 + DataType p_x_low_limbs_range_constraint_2; // column 7 + DataType p_x_low_limbs_range_constraint_3; // column 8 + DataType p_x_low_limbs_range_constraint_4; // column 9 + DataType p_x_low_limbs_range_constraint_tail; // column 10 + DataType p_x_high_limbs; // column 11 + DataType p_x_high_limbs_range_constraint_0; // column 12 + DataType p_x_high_limbs_range_constraint_1; // column 13 + DataType p_x_high_limbs_range_constraint_2; // column 14 + DataType p_x_high_limbs_range_constraint_3; // column 15 + DataType p_x_high_limbs_range_constraint_4; // column 16 + DataType p_x_high_limbs_range_constraint_tail; // column 17 + DataType p_y_low_limbs; // column 18 + DataType p_y_low_limbs_range_constraint_0; // column 19 + DataType p_y_low_limbs_range_constraint_1; // column 20 + DataType p_y_low_limbs_range_constraint_2; // column 21 + DataType p_y_low_limbs_range_constraint_3; // column 22 + DataType p_y_low_limbs_range_constraint_4; // column 23 + DataType p_y_low_limbs_range_constraint_tail; // column 24 + DataType p_y_high_limbs; // column 25 + DataType p_y_high_limbs_range_constraint_0; // column 26 + DataType p_y_high_limbs_range_constraint_1; // column 27 + DataType p_y_high_limbs_range_constraint_2; // column 28 + DataType p_y_high_limbs_range_constraint_3; // column 29 + DataType p_y_high_limbs_range_constraint_4; // column 30 + DataType p_y_high_limbs_range_constraint_tail; // column 31 + DataType z_low_limbs; // column 32 + DataType z_low_limbs_range_constraint_0; // column 33 + DataType z_low_limbs_range_constraint_1; // column 34 + DataType z_low_limbs_range_constraint_2; // column 35 + DataType z_low_limbs_range_constraint_3; // column 36 + DataType z_low_limbs_range_constraint_4; // column 37 + DataType z_low_limbs_range_constraint_tail; // column 38 + DataType z_high_limbs; // column 39 + DataType z_high_limbs_range_constraint_0; // column 40 + DataType z_high_limbs_range_constraint_1; // column 41 + DataType z_high_limbs_range_constraint_2; // column 42 + DataType z_high_limbs_range_constraint_3; // column 43 + DataType z_high_limbs_range_constraint_4; // column 44 + DataType z_high_limbs_range_constraint_tail; // column 45 + DataType accumulators_binary_limbs_0; // column 46 + DataType accumulators_binary_limbs_1; // column 47 + DataType accumulators_binary_limbs_2; // column 48 + DataType accumulators_binary_limbs_3; // column 49 + DataType accumulator_low_limbs_range_constraint_0; // column 50 + DataType accumulator_low_limbs_range_constraint_1; // column 51 + DataType accumulator_low_limbs_range_constraint_2; // column 52 + DataType accumulator_low_limbs_range_constraint_3; // column 53 + DataType accumulator_low_limbs_range_constraint_4; // column 54 + DataType accumulator_low_limbs_range_constraint_tail; // column 55 + DataType accumulator_high_limbs_range_constraint_0; // column 56 + DataType accumulator_high_limbs_range_constraint_1; // column 57 + DataType accumulator_high_limbs_range_constraint_2; // column 58 + DataType accumulator_high_limbs_range_constraint_3; // column 59 + DataType accumulator_high_limbs_range_constraint_4; // column 60 + DataType accumulator_high_limbs_range_constraint_tail; // column 61 + DataType quotient_low_binary_limbs; // column 62 + DataType quotient_high_binary_limbs; // column 63 + DataType quotient_low_limbs_range_constraint_0; // column 64 + DataType quotient_low_limbs_range_constraint_1; // column 65 + DataType quotient_low_limbs_range_constraint_2; // column 66 + DataType quotient_low_limbs_range_constraint_3; // column 67 + DataType quotient_low_limbs_range_constraint_4; // column 68 + DataType quotient_low_limbs_range_constraint_tail; // column 69 + DataType quotient_high_limbs_range_constraint_0; // column 70 + DataType quotient_high_limbs_range_constraint_1; // column 71 + DataType quotient_high_limbs_range_constraint_2; // column 72 + DataType quotient_high_limbs_range_constraint_3; // column 73 + DataType quotient_high_limbs_range_constraint_4; // column 74 + DataType quotient_high_limbs_range_constraint_tail; // column 75 + DataType relation_wide_limbs; // column 76 + DataType relation_wide_limbs_range_constraint_0; // column 77 + DataType relation_wide_limbs_range_constraint_1; // column 78 + DataType relation_wide_limbs_range_constraint_2; // column 79 + DataType relation_wide_limbs_range_constraint_3; // column 80 + DataType concatenated_range_constraints_0; // column 81 + DataType concatenated_range_constraints_1; // column 82 + DataType concatenated_range_constraints_2; // column 83 + DataType concatenated_range_constraints_3; // column 84 + DataType ordered_range_constraints_0; // column 85 + DataType ordered_range_constraints_1; // column 86 + DataType ordered_range_constraints_2; // column 87 + DataType ordered_range_constraints_3; // column 88 + DataType ordered_range_constraints_4; // column 89 + DataType z_perm; // column 90 + + DEFINE_POINTER_VIEW(NUM_WITNESS_ENTITIES, + &op, + &x_lo_y_hi, + &x_hi_z_1, + &y_lo_z_2, + &p_x_low_limbs, + &p_x_low_limbs_range_constraint_0, + &p_x_low_limbs_range_constraint_1, + &p_x_low_limbs_range_constraint_2, + &p_x_low_limbs_range_constraint_3, + &p_x_low_limbs_range_constraint_4, + &p_x_low_limbs_range_constraint_tail, + &p_x_high_limbs, + &p_x_high_limbs_range_constraint_0, + &p_x_high_limbs_range_constraint_1, + &p_x_high_limbs_range_constraint_2, + &p_x_high_limbs_range_constraint_3, + &p_x_high_limbs_range_constraint_4, + &p_x_high_limbs_range_constraint_tail, + &p_y_low_limbs, + &p_y_low_limbs_range_constraint_0, + &p_y_low_limbs_range_constraint_1, + &p_y_low_limbs_range_constraint_2, + &p_y_low_limbs_range_constraint_3, + &p_y_low_limbs_range_constraint_4, + &p_y_low_limbs_range_constraint_tail, + &p_y_high_limbs, + &p_y_high_limbs_range_constraint_0, + &p_y_high_limbs_range_constraint_1, + &p_y_high_limbs_range_constraint_2, + &p_y_high_limbs_range_constraint_3, + &p_y_high_limbs_range_constraint_4, + &p_y_high_limbs_range_constraint_tail, + &z_low_limbs, + &z_low_limbs_range_constraint_0, + &z_low_limbs_range_constraint_1, + &z_low_limbs_range_constraint_2, + &z_low_limbs_range_constraint_3, + &z_low_limbs_range_constraint_4, + &z_low_limbs_range_constraint_tail, + &z_high_limbs, + &z_high_limbs_range_constraint_0, + &z_high_limbs_range_constraint_1, + &z_high_limbs_range_constraint_2, + &z_high_limbs_range_constraint_3, + &z_high_limbs_range_constraint_4, + &z_high_limbs_range_constraint_tail, + &accumulators_binary_limbs_0, + &accumulators_binary_limbs_1, + &accumulators_binary_limbs_2, + &accumulators_binary_limbs_3, + &accumulator_low_limbs_range_constraint_0, + &accumulator_low_limbs_range_constraint_1, + &accumulator_low_limbs_range_constraint_2, + &accumulator_low_limbs_range_constraint_3, + &accumulator_low_limbs_range_constraint_4, + &accumulator_low_limbs_range_constraint_tail, + &accumulator_high_limbs_range_constraint_0, + &accumulator_high_limbs_range_constraint_1, + &accumulator_high_limbs_range_constraint_2, + &accumulator_high_limbs_range_constraint_3, + &accumulator_high_limbs_range_constraint_4, + &accumulator_high_limbs_range_constraint_tail, + "ient_low_binary_limbs, + "ient_high_binary_limbs, + "ient_low_limbs_range_constraint_0, + "ient_low_limbs_range_constraint_1, + "ient_low_limbs_range_constraint_2, + "ient_low_limbs_range_constraint_3, + "ient_low_limbs_range_constraint_4, + "ient_low_limbs_range_constraint_tail, + "ient_high_limbs_range_constraint_0, + "ient_high_limbs_range_constraint_1, + "ient_high_limbs_range_constraint_2, + "ient_high_limbs_range_constraint_3, + "ient_high_limbs_range_constraint_4, + "ient_high_limbs_range_constraint_tail, + &relation_wide_limbs, + &relation_wide_limbs_range_constraint_0, + &relation_wide_limbs_range_constraint_1, + &relation_wide_limbs_range_constraint_2, + &relation_wide_limbs_range_constraint_3, + &concatenated_range_constraints_0, + &concatenated_range_constraints_1, + &concatenated_range_constraints_2, + &concatenated_range_constraints_3, + &ordered_range_constraints_0, + &ordered_range_constraints_1, + &ordered_range_constraints_2, + &ordered_range_constraints_3, + &ordered_range_constraints_4, + &z_perm, ) std::vector get_wires() override { @@ -650,190 +751,190 @@ template class GoblinTranslator_ { template class AllEntities : public AllEntities_ { public: - DataType& op = std::get<0>(this->_data); - DataType& x_lo_y_hi = std::get<1>(this->_data); - DataType& x_hi_z_1 = std::get<2>(this->_data); - DataType& y_lo_z_2 = std::get<3>(this->_data); - DataType& p_x_low_limbs = std::get<4>(this->_data); - DataType& p_x_low_limbs_range_constraint_0 = std::get<5>(this->_data); - DataType& p_x_low_limbs_range_constraint_1 = std::get<6>(this->_data); - DataType& p_x_low_limbs_range_constraint_2 = std::get<7>(this->_data); - DataType& p_x_low_limbs_range_constraint_3 = std::get<8>(this->_data); - DataType& p_x_low_limbs_range_constraint_4 = std::get<9>(this->_data); - DataType& p_x_low_limbs_range_constraint_tail = std::get<10>(this->_data); - DataType& p_x_high_limbs = std::get<11>(this->_data); - DataType& p_x_high_limbs_range_constraint_0 = std::get<12>(this->_data); - DataType& p_x_high_limbs_range_constraint_1 = std::get<13>(this->_data); - DataType& p_x_high_limbs_range_constraint_2 = std::get<14>(this->_data); - DataType& p_x_high_limbs_range_constraint_3 = std::get<15>(this->_data); - DataType& p_x_high_limbs_range_constraint_4 = std::get<16>(this->_data); - DataType& p_x_high_limbs_range_constraint_tail = std::get<17>(this->_data); - DataType& p_y_low_limbs = std::get<18>(this->_data); - DataType& p_y_low_limbs_range_constraint_0 = std::get<19>(this->_data); - DataType& p_y_low_limbs_range_constraint_1 = std::get<20>(this->_data); - DataType& p_y_low_limbs_range_constraint_2 = std::get<21>(this->_data); - DataType& p_y_low_limbs_range_constraint_3 = std::get<22>(this->_data); - DataType& p_y_low_limbs_range_constraint_4 = std::get<23>(this->_data); - DataType& p_y_low_limbs_range_constraint_tail = std::get<24>(this->_data); - DataType& p_y_high_limbs = std::get<25>(this->_data); - DataType& p_y_high_limbs_range_constraint_0 = std::get<26>(this->_data); - DataType& p_y_high_limbs_range_constraint_1 = std::get<27>(this->_data); - DataType& p_y_high_limbs_range_constraint_2 = std::get<28>(this->_data); - DataType& p_y_high_limbs_range_constraint_3 = std::get<29>(this->_data); - DataType& p_y_high_limbs_range_constraint_4 = std::get<30>(this->_data); - DataType& p_y_high_limbs_range_constraint_tail = std::get<31>(this->_data); - DataType& z_low_limbs = std::get<32>(this->_data); - DataType& z_low_limbs_range_constraint_0 = std::get<33>(this->_data); - DataType& z_low_limbs_range_constraint_1 = std::get<34>(this->_data); - DataType& z_low_limbs_range_constraint_2 = std::get<35>(this->_data); - DataType& z_low_limbs_range_constraint_3 = std::get<36>(this->_data); - DataType& z_low_limbs_range_constraint_4 = std::get<37>(this->_data); - DataType& z_low_limbs_range_constraint_tail = std::get<38>(this->_data); - DataType& z_high_limbs = std::get<39>(this->_data); - DataType& z_high_limbs_range_constraint_0 = std::get<40>(this->_data); - DataType& z_high_limbs_range_constraint_1 = std::get<41>(this->_data); - DataType& z_high_limbs_range_constraint_2 = std::get<42>(this->_data); - DataType& z_high_limbs_range_constraint_3 = std::get<43>(this->_data); - DataType& z_high_limbs_range_constraint_4 = std::get<44>(this->_data); - DataType& z_high_limbs_range_constraint_tail = std::get<45>(this->_data); - DataType& accumulators_binary_limbs_0 = std::get<46>(this->_data); - DataType& accumulators_binary_limbs_1 = std::get<47>(this->_data); - DataType& accumulators_binary_limbs_2 = std::get<48>(this->_data); - DataType& accumulators_binary_limbs_3 = std::get<49>(this->_data); - DataType& accumulator_low_limbs_range_constraint_0 = std::get<50>(this->_data); - DataType& accumulator_low_limbs_range_constraint_1 = std::get<51>(this->_data); - DataType& accumulator_low_limbs_range_constraint_2 = std::get<52>(this->_data); - DataType& accumulator_low_limbs_range_constraint_3 = std::get<53>(this->_data); - DataType& accumulator_low_limbs_range_constraint_4 = std::get<54>(this->_data); - DataType& accumulator_low_limbs_range_constraint_tail = std::get<55>(this->_data); - DataType& accumulator_high_limbs_range_constraint_0 = std::get<56>(this->_data); - DataType& accumulator_high_limbs_range_constraint_1 = std::get<57>(this->_data); - DataType& accumulator_high_limbs_range_constraint_2 = std::get<58>(this->_data); - DataType& accumulator_high_limbs_range_constraint_3 = std::get<59>(this->_data); - DataType& accumulator_high_limbs_range_constraint_4 = std::get<60>(this->_data); - DataType& accumulator_high_limbs_range_constraint_tail = std::get<61>(this->_data); - DataType& quotient_low_binary_limbs = std::get<62>(this->_data); - DataType& quotient_high_binary_limbs = std::get<63>(this->_data); - DataType& quotient_low_limbs_range_constraint_0 = std::get<64>(this->_data); - DataType& quotient_low_limbs_range_constraint_1 = std::get<65>(this->_data); - DataType& quotient_low_limbs_range_constraint_2 = std::get<66>(this->_data); - DataType& quotient_low_limbs_range_constraint_3 = std::get<67>(this->_data); - DataType& quotient_low_limbs_range_constraint_4 = std::get<68>(this->_data); - DataType& quotient_low_limbs_range_constraint_tail = std::get<69>(this->_data); - DataType& quotient_high_limbs_range_constraint_0 = std::get<70>(this->_data); - DataType& quotient_high_limbs_range_constraint_1 = std::get<71>(this->_data); - DataType& quotient_high_limbs_range_constraint_2 = std::get<72>(this->_data); - DataType& quotient_high_limbs_range_constraint_3 = std::get<73>(this->_data); - DataType& quotient_high_limbs_range_constraint_4 = std::get<74>(this->_data); - DataType& quotient_high_limbs_range_constraint_tail = std::get<75>(this->_data); - DataType& relation_wide_limbs = std::get<76>(this->_data); - DataType& relation_wide_limbs_range_constraint_0 = std::get<77>(this->_data); - DataType& relation_wide_limbs_range_constraint_1 = std::get<78>(this->_data); - DataType& relation_wide_limbs_range_constraint_2 = std::get<79>(this->_data); - DataType& relation_wide_limbs_range_constraint_3 = std::get<80>(this->_data); - DataType& concatenated_range_constraints_0 = std::get<81>(this->_data); - DataType& concatenated_range_constraints_1 = std::get<82>(this->_data); - DataType& concatenated_range_constraints_2 = std::get<83>(this->_data); - DataType& concatenated_range_constraints_3 = std::get<84>(this->_data); - DataType& ordered_range_constraints_0 = std::get<85>(this->_data); - DataType& ordered_range_constraints_1 = std::get<86>(this->_data); - DataType& ordered_range_constraints_2 = std::get<87>(this->_data); - DataType& ordered_range_constraints_3 = std::get<88>(this->_data); - DataType& ordered_range_constraints_4 = std::get<89>(this->_data); - DataType& z_perm = std::get<90>(this->_data); - DataType& x_lo_y_hi_shift = std::get<91>(this->_data); - DataType& x_hi_z_1_shift = std::get<92>(this->_data); - DataType& y_lo_z_2_shift = std::get<93>(this->_data); - DataType& p_x_low_limbs_shift = std::get<94>(this->_data); - DataType& p_x_low_limbs_range_constraint_0_shift = std::get<95>(this->_data); - DataType& p_x_low_limbs_range_constraint_1_shift = std::get<96>(this->_data); - DataType& p_x_low_limbs_range_constraint_2_shift = std::get<97>(this->_data); - DataType& p_x_low_limbs_range_constraint_3_shift = std::get<98>(this->_data); - DataType& p_x_low_limbs_range_constraint_4_shift = std::get<99>(this->_data); - DataType& p_x_low_limbs_range_constraint_tail_shift = std::get<100>(this->_data); - DataType& p_x_high_limbs_shift = std::get<101>(this->_data); - DataType& p_x_high_limbs_range_constraint_0_shift = std::get<102>(this->_data); - DataType& p_x_high_limbs_range_constraint_1_shift = std::get<103>(this->_data); - DataType& p_x_high_limbs_range_constraint_2_shift = std::get<104>(this->_data); - DataType& p_x_high_limbs_range_constraint_3_shift = std::get<105>(this->_data); - DataType& p_x_high_limbs_range_constraint_4_shift = std::get<106>(this->_data); - DataType& p_x_high_limbs_range_constraint_tail_shift = std::get<107>(this->_data); - DataType& p_y_low_limbs_shift = std::get<108>(this->_data); - DataType& p_y_low_limbs_range_constraint_0_shift = std::get<109>(this->_data); - DataType& p_y_low_limbs_range_constraint_1_shift = std::get<110>(this->_data); - DataType& p_y_low_limbs_range_constraint_2_shift = std::get<111>(this->_data); - DataType& p_y_low_limbs_range_constraint_3_shift = std::get<112>(this->_data); - DataType& p_y_low_limbs_range_constraint_4_shift = std::get<113>(this->_data); - DataType& p_y_low_limbs_range_constraint_tail_shift = std::get<114>(this->_data); - DataType& p_y_high_limbs_shift = std::get<115>(this->_data); - DataType& p_y_high_limbs_range_constraint_0_shift = std::get<116>(this->_data); - DataType& p_y_high_limbs_range_constraint_1_shift = std::get<117>(this->_data); - DataType& p_y_high_limbs_range_constraint_2_shift = std::get<118>(this->_data); - DataType& p_y_high_limbs_range_constraint_3_shift = std::get<119>(this->_data); - DataType& p_y_high_limbs_range_constraint_4_shift = std::get<120>(this->_data); - DataType& p_y_high_limbs_range_constraint_tail_shift = std::get<121>(this->_data); - DataType& z_low_limbs_shift = std::get<122>(this->_data); - DataType& z_low_limbs_range_constraint_0_shift = std::get<123>(this->_data); - DataType& z_low_limbs_range_constraint_1_shift = std::get<124>(this->_data); - DataType& z_low_limbs_range_constraint_2_shift = std::get<125>(this->_data); - DataType& z_low_limbs_range_constraint_3_shift = std::get<126>(this->_data); - DataType& z_low_limbs_range_constraint_4_shift = std::get<127>(this->_data); - DataType& z_low_limbs_range_constraint_tail_shift = std::get<128>(this->_data); - DataType& z_high_limbs_shift = std::get<129>(this->_data); - DataType& z_high_limbs_range_constraint_0_shift = std::get<130>(this->_data); - DataType& z_high_limbs_range_constraint_1_shift = std::get<131>(this->_data); - DataType& z_high_limbs_range_constraint_2_shift = std::get<132>(this->_data); - DataType& z_high_limbs_range_constraint_3_shift = std::get<133>(this->_data); - DataType& z_high_limbs_range_constraint_4_shift = std::get<134>(this->_data); - DataType& z_high_limbs_range_constraint_tail_shift = std::get<135>(this->_data); - DataType& accumulators_binary_limbs_0_shift = std::get<136>(this->_data); - DataType& accumulators_binary_limbs_1_shift = std::get<137>(this->_data); - DataType& accumulators_binary_limbs_2_shift = std::get<138>(this->_data); - DataType& accumulators_binary_limbs_3_shift = std::get<139>(this->_data); - DataType& accumulator_low_limbs_range_constraint_0_shift = std::get<140>(this->_data); - DataType& accumulator_low_limbs_range_constraint_1_shift = std::get<141>(this->_data); - DataType& accumulator_low_limbs_range_constraint_2_shift = std::get<142>(this->_data); - DataType& accumulator_low_limbs_range_constraint_3_shift = std::get<143>(this->_data); - DataType& accumulator_low_limbs_range_constraint_4_shift = std::get<144>(this->_data); - DataType& accumulator_low_limbs_range_constraint_tail_shift = std::get<145>(this->_data); - DataType& accumulator_high_limbs_range_constraint_0_shift = std::get<146>(this->_data); - DataType& accumulator_high_limbs_range_constraint_1_shift = std::get<147>(this->_data); - DataType& accumulator_high_limbs_range_constraint_2_shift = std::get<148>(this->_data); - DataType& accumulator_high_limbs_range_constraint_3_shift = std::get<149>(this->_data); - DataType& accumulator_high_limbs_range_constraint_4_shift = std::get<150>(this->_data); - DataType& accumulator_high_limbs_range_constraint_tail_shift = std::get<151>(this->_data); - DataType& quotient_low_binary_limbs_shift = std::get<152>(this->_data); - DataType& quotient_high_binary_limbs_shift = std::get<153>(this->_data); - DataType& quotient_low_limbs_range_constraint_0_shift = std::get<154>(this->_data); - DataType& quotient_low_limbs_range_constraint_1_shift = std::get<155>(this->_data); - DataType& quotient_low_limbs_range_constraint_2_shift = std::get<156>(this->_data); - DataType& quotient_low_limbs_range_constraint_3_shift = std::get<157>(this->_data); - DataType& quotient_low_limbs_range_constraint_4_shift = std::get<158>(this->_data); - DataType& quotient_low_limbs_range_constraint_tail_shift = std::get<159>(this->_data); - DataType& quotient_high_limbs_range_constraint_0_shift = std::get<160>(this->_data); - DataType& quotient_high_limbs_range_constraint_1_shift = std::get<161>(this->_data); - DataType& quotient_high_limbs_range_constraint_2_shift = std::get<162>(this->_data); - DataType& quotient_high_limbs_range_constraint_3_shift = std::get<163>(this->_data); - DataType& quotient_high_limbs_range_constraint_4_shift = std::get<164>(this->_data); - DataType& quotient_high_limbs_range_constraint_tail_shift = std::get<165>(this->_data); - DataType& relation_wide_limbs_shift = std::get<166>(this->_data); - DataType& relation_wide_limbs_range_constraint_0_shift = std::get<167>(this->_data); - DataType& relation_wide_limbs_range_constraint_1_shift = std::get<168>(this->_data); - DataType& relation_wide_limbs_range_constraint_2_shift = std::get<169>(this->_data); - DataType& relation_wide_limbs_range_constraint_3_shift = std::get<170>(this->_data); - DataType& ordered_range_constraints_0_shift = std::get<171>(this->_data); - DataType& ordered_range_constraints_1_shift = std::get<172>(this->_data); - DataType& ordered_range_constraints_2_shift = std::get<173>(this->_data); - DataType& ordered_range_constraints_3_shift = std::get<174>(this->_data); - DataType& ordered_range_constraints_4_shift = std::get<175>(this->_data); - DataType& z_perm_shift = std::get<176>(this->_data); - DataType& lagrange_first = std::get<177>(this->_data); - DataType& lagrange_last = std::get<178>(this->_data); - DataType& lagrange_odd_in_minicircuit = std::get<179>(this->_data); - DataType& lagrange_even_in_minicircuit = std::get<180>(this->_data); - DataType& lagrange_second = std::get<181>(this->_data); - DataType& lagrange_second_to_last_in_minicircuit = std::get<182>(this->_data); - DataType& ordered_extra_range_constraints_numerator = std::get<183>(this->_data); + DataType op; // column 0 + DataType x_lo_y_hi; // column 1 + DataType x_hi_z_1; // column 2 + DataType y_lo_z_2; // column 3 + DataType p_x_low_limbs; // column 4 + DataType p_x_low_limbs_range_constraint_0; // column 5 + DataType p_x_low_limbs_range_constraint_1; // column 6 + DataType p_x_low_limbs_range_constraint_2; // column 7 + DataType p_x_low_limbs_range_constraint_3; // column 8 + DataType p_x_low_limbs_range_constraint_4; // column 9 + DataType p_x_low_limbs_range_constraint_tail; // column 10 + DataType p_x_high_limbs; // column 11 + DataType p_x_high_limbs_range_constraint_0; // column 12 + DataType p_x_high_limbs_range_constraint_1; // column 13 + DataType p_x_high_limbs_range_constraint_2; // column 14 + DataType p_x_high_limbs_range_constraint_3; // column 15 + DataType p_x_high_limbs_range_constraint_4; // column 16 + DataType p_x_high_limbs_range_constraint_tail; // column 17 + DataType p_y_low_limbs; // column 18 + DataType p_y_low_limbs_range_constraint_0; // column 19 + DataType p_y_low_limbs_range_constraint_1; // column 20 + DataType p_y_low_limbs_range_constraint_2; // column 21 + DataType p_y_low_limbs_range_constraint_3; // column 22 + DataType p_y_low_limbs_range_constraint_4; // column 23 + DataType p_y_low_limbs_range_constraint_tail; // column 24 + DataType p_y_high_limbs; // column 25 + DataType p_y_high_limbs_range_constraint_0; // column 26 + DataType p_y_high_limbs_range_constraint_1; // column 27 + DataType p_y_high_limbs_range_constraint_2; // column 28 + DataType p_y_high_limbs_range_constraint_3; // column 29 + DataType p_y_high_limbs_range_constraint_4; // column 30 + DataType p_y_high_limbs_range_constraint_tail; // column 31 + DataType z_low_limbs; // column 32 + DataType z_low_limbs_range_constraint_0; // column 33 + DataType z_low_limbs_range_constraint_1; // column 34 + DataType z_low_limbs_range_constraint_2; // column 35 + DataType z_low_limbs_range_constraint_3; // column 36 + DataType z_low_limbs_range_constraint_4; // column 37 + DataType z_low_limbs_range_constraint_tail; // column 38 + DataType z_high_limbs; // column 39 + DataType z_high_limbs_range_constraint_0; // column 40 + DataType z_high_limbs_range_constraint_1; // column 41 + DataType z_high_limbs_range_constraint_2; // column 42 + DataType z_high_limbs_range_constraint_3; // column 43 + DataType z_high_limbs_range_constraint_4; // column 44 + DataType z_high_limbs_range_constraint_tail; // column 45 + DataType accumulators_binary_limbs_0; // column 46 + DataType accumulators_binary_limbs_1; // column 47 + DataType accumulators_binary_limbs_2; // column 48 + DataType accumulators_binary_limbs_3; // column 49 + DataType accumulator_low_limbs_range_constraint_0; // column 50 + DataType accumulator_low_limbs_range_constraint_1; // column 51 + DataType accumulator_low_limbs_range_constraint_2; // column 52 + DataType accumulator_low_limbs_range_constraint_3; // column 53 + DataType accumulator_low_limbs_range_constraint_4; // column 54 + DataType accumulator_low_limbs_range_constraint_tail; // column 55 + DataType accumulator_high_limbs_range_constraint_0; // column 56 + DataType accumulator_high_limbs_range_constraint_1; // column 57 + DataType accumulator_high_limbs_range_constraint_2; // column 58 + DataType accumulator_high_limbs_range_constraint_3; // column 59 + DataType accumulator_high_limbs_range_constraint_4; // column 60 + DataType accumulator_high_limbs_range_constraint_tail; // column 61 + DataType quotient_low_binary_limbs; // column 62 + DataType quotient_high_binary_limbs; // column 63 + DataType quotient_low_limbs_range_constraint_0; // column 64 + DataType quotient_low_limbs_range_constraint_1; // column 65 + DataType quotient_low_limbs_range_constraint_2; // column 66 + DataType quotient_low_limbs_range_constraint_3; // column 67 + DataType quotient_low_limbs_range_constraint_4; // column 68 + DataType quotient_low_limbs_range_constraint_tail; // column 69 + DataType quotient_high_limbs_range_constraint_0; // column 70 + DataType quotient_high_limbs_range_constraint_1; // column 71 + DataType quotient_high_limbs_range_constraint_2; // column 72 + DataType quotient_high_limbs_range_constraint_3; // column 73 + DataType quotient_high_limbs_range_constraint_4; // column 74 + DataType quotient_high_limbs_range_constraint_tail; // column 75 + DataType relation_wide_limbs; // column 76 + DataType relation_wide_limbs_range_constraint_0; // column 77 + DataType relation_wide_limbs_range_constraint_1; // column 78 + DataType relation_wide_limbs_range_constraint_2; // column 79 + DataType relation_wide_limbs_range_constraint_3; // column 80 + DataType concatenated_range_constraints_0; // column 81 + DataType concatenated_range_constraints_1; // column 82 + DataType concatenated_range_constraints_2; // column 83 + DataType concatenated_range_constraints_3; // column 84 + DataType ordered_range_constraints_0; // column 85 + DataType ordered_range_constraints_1; // column 86 + DataType ordered_range_constraints_2; // column 87 + DataType ordered_range_constraints_3; // column 88 + DataType ordered_range_constraints_4; // column 89 + DataType z_perm; // column 90 + DataType x_lo_y_hi_shift; // column 91 + DataType x_hi_z_1_shift; // column 92 + DataType y_lo_z_2_shift; // column 93 + DataType p_x_low_limbs_shift; // column 94 + DataType p_x_low_limbs_range_constraint_0_shift; // column 95 + DataType p_x_low_limbs_range_constraint_1_shift; // column 96 + DataType p_x_low_limbs_range_constraint_2_shift; // column 97 + DataType p_x_low_limbs_range_constraint_3_shift; // column 98 + DataType p_x_low_limbs_range_constraint_4_shift; // column 99 + DataType p_x_low_limbs_range_constraint_tail_shift; // column 100 + DataType p_x_high_limbs_shift; // column 101 + DataType p_x_high_limbs_range_constraint_0_shift; // column 102 + DataType p_x_high_limbs_range_constraint_1_shift; // column 103 + DataType p_x_high_limbs_range_constraint_2_shift; // column 104 + DataType p_x_high_limbs_range_constraint_3_shift; // column 105 + DataType p_x_high_limbs_range_constraint_4_shift; // column 106 + DataType p_x_high_limbs_range_constraint_tail_shift; // column 107 + DataType p_y_low_limbs_shift; // column 108 + DataType p_y_low_limbs_range_constraint_0_shift; // column 109 + DataType p_y_low_limbs_range_constraint_1_shift; // column 110 + DataType p_y_low_limbs_range_constraint_2_shift; // column 111 + DataType p_y_low_limbs_range_constraint_3_shift; // column 112 + DataType p_y_low_limbs_range_constraint_4_shift; // column 113 + DataType p_y_low_limbs_range_constraint_tail_shift; // column 114 + DataType p_y_high_limbs_shift; // column 115 + DataType p_y_high_limbs_range_constraint_0_shift; // column 116 + DataType p_y_high_limbs_range_constraint_1_shift; // column 117 + DataType p_y_high_limbs_range_constraint_2_shift; // column 118 + DataType p_y_high_limbs_range_constraint_3_shift; // column 119 + DataType p_y_high_limbs_range_constraint_4_shift; // column 120 + DataType p_y_high_limbs_range_constraint_tail_shift; // column 121 + DataType z_low_limbs_shift; // column 122 + DataType z_low_limbs_range_constraint_0_shift; // column 123 + DataType z_low_limbs_range_constraint_1_shift; // column 124 + DataType z_low_limbs_range_constraint_2_shift; // column 125 + DataType z_low_limbs_range_constraint_3_shift; // column 126 + DataType z_low_limbs_range_constraint_4_shift; // column 127 + DataType z_low_limbs_range_constraint_tail_shift; // column 128 + DataType z_high_limbs_shift; // column 129 + DataType z_high_limbs_range_constraint_0_shift; // column 130 + DataType z_high_limbs_range_constraint_1_shift; // column 131 + DataType z_high_limbs_range_constraint_2_shift; // column 132 + DataType z_high_limbs_range_constraint_3_shift; // column 133 + DataType z_high_limbs_range_constraint_4_shift; // column 134 + DataType z_high_limbs_range_constraint_tail_shift; // column 135 + DataType accumulators_binary_limbs_0_shift; // column 136 + DataType accumulators_binary_limbs_1_shift; // column 137 + DataType accumulators_binary_limbs_2_shift; // column 138 + DataType accumulators_binary_limbs_3_shift; // column 139 + DataType accumulator_low_limbs_range_constraint_0_shift; // column 140 + DataType accumulator_low_limbs_range_constraint_1_shift; // column 141 + DataType accumulator_low_limbs_range_constraint_2_shift; // column 142 + DataType accumulator_low_limbs_range_constraint_3_shift; // column 143 + DataType accumulator_low_limbs_range_constraint_4_shift; // column 144 + DataType accumulator_low_limbs_range_constraint_tail_shift; // column 145 + DataType accumulator_high_limbs_range_constraint_0_shift; // column 146 + DataType accumulator_high_limbs_range_constraint_1_shift; // column 147 + DataType accumulator_high_limbs_range_constraint_2_shift; // column 148 + DataType accumulator_high_limbs_range_constraint_3_shift; // column 149 + DataType accumulator_high_limbs_range_constraint_4_shift; // column 150 + DataType accumulator_high_limbs_range_constraint_tail_shift; // column 151 + DataType quotient_low_binary_limbs_shift; // column 152 + DataType quotient_high_binary_limbs_shift; // column 153 + DataType quotient_low_limbs_range_constraint_0_shift; // column 154 + DataType quotient_low_limbs_range_constraint_1_shift; // column 155 + DataType quotient_low_limbs_range_constraint_2_shift; // column 156 + DataType quotient_low_limbs_range_constraint_3_shift; // column 157 + DataType quotient_low_limbs_range_constraint_4_shift; // column 158 + DataType quotient_low_limbs_range_constraint_tail_shift; // column 159 + DataType quotient_high_limbs_range_constraint_0_shift; // column 160 + DataType quotient_high_limbs_range_constraint_1_shift; // column 161 + DataType quotient_high_limbs_range_constraint_2_shift; // column 162 + DataType quotient_high_limbs_range_constraint_3_shift; // column 163 + DataType quotient_high_limbs_range_constraint_4_shift; // column 164 + DataType quotient_high_limbs_range_constraint_tail_shift; // column 165 + DataType relation_wide_limbs_shift; // column 166 + DataType relation_wide_limbs_range_constraint_0_shift; // column 167 + DataType relation_wide_limbs_range_constraint_1_shift; // column 168 + DataType relation_wide_limbs_range_constraint_2_shift; // column 169 + DataType relation_wide_limbs_range_constraint_3_shift; // column 170 + DataType ordered_range_constraints_0_shift; // column 171 + DataType ordered_range_constraints_1_shift; // column 172 + DataType ordered_range_constraints_2_shift; // column 173 + DataType ordered_range_constraints_3_shift; // column 174 + DataType ordered_range_constraints_4_shift; // column 175 + DataType z_perm_shift; // column 176 + DataType lagrange_first; // column 177 + DataType lagrange_last; // column 178 + DataType lagrange_odd_in_minicircuit; // column 179 + DataType lagrange_even_in_minicircuit; // column 180 + DataType lagrange_second; // column 181 + DataType lagrange_second_to_last_in_minicircuit; // column 182 + DataType ordered_extra_range_constraints_numerator; // column 183 // defines a method pointer_view that returns the following, with const and non-const variants DEFINE_POINTER_VIEW(NUM_ALL_ENTITIES, @@ -1526,30 +1627,6 @@ template class GoblinTranslator_ { return result; } - AllEntities() = default; - - AllEntities(const AllEntities& other) - : AllEntities_(other){}; - - AllEntities(AllEntities&& other) noexcept - : AllEntities_(other){}; - - AllEntities& operator=(const AllEntities& other) - { - if (this == &other) { - return *this; - } - AllEntities_::operator=(other); - return *this; - } - - AllEntities& operator=(AllEntities&& other) noexcept - { - AllEntities_::operator=(other); - return *this; - } - - ~AllEntities() = default; friend std::ostream& operator<<(std::ostream& os, const AllEntities& a) { os << "{ "; diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 120ff0badfc..5b83ffc3154 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -79,33 +79,62 @@ class GoblinUltra { */ class PrecomputedEntities : public PrecomputedEntities_ { public: - DataType& q_m = std::get<0>(this->_data); - DataType& q_c = std::get<1>(this->_data); - DataType& q_l = std::get<2>(this->_data); - DataType& q_r = std::get<3>(this->_data); - DataType& q_o = std::get<4>(this->_data); - DataType& q_4 = std::get<5>(this->_data); - DataType& q_arith = std::get<6>(this->_data); - DataType& q_sort = std::get<7>(this->_data); - DataType& q_elliptic = std::get<8>(this->_data); - DataType& q_aux = std::get<9>(this->_data); - DataType& q_lookup = std::get<10>(this->_data); - DataType& q_busread = std::get<11>(this->_data); - DataType& sigma_1 = std::get<12>(this->_data); - DataType& sigma_2 = std::get<13>(this->_data); - DataType& sigma_3 = std::get<14>(this->_data); - DataType& sigma_4 = std::get<15>(this->_data); - DataType& id_1 = std::get<16>(this->_data); - DataType& id_2 = std::get<17>(this->_data); - DataType& id_3 = std::get<18>(this->_data); - DataType& id_4 = std::get<19>(this->_data); - DataType& table_1 = std::get<20>(this->_data); - DataType& table_2 = std::get<21>(this->_data); - DataType& table_3 = std::get<22>(this->_data); - DataType& table_4 = std::get<23>(this->_data); - DataType& lagrange_first = std::get<24>(this->_data); - DataType& lagrange_last = std::get<25>(this->_data); - DataType& lagrange_ecc_op = std::get<26>(this->_data); // indicator poly for ecc op gates + DataType q_m; // column 0 + DataType q_c; // column 1 + DataType q_l; // column 2 + DataType q_r; // column 3 + DataType q_o; // column 4 + DataType q_4; // column 5 + DataType q_arith; // column 6 + DataType q_sort; // column 7 + DataType q_elliptic; // column 8 + DataType q_aux; // column 9 + DataType q_lookup; // column 10 + DataType q_busread; // column 11 + DataType sigma_1; // column 12 + DataType sigma_2; // column 13 + DataType sigma_3; // column 14 + DataType sigma_4; // column 15 + DataType id_1; // column 16 + DataType id_2; // column 17 + DataType id_3; // column 18 + DataType id_4; // column 19 + DataType table_1; // column 20 + DataType table_2; // column 21 + DataType table_3; // column 22 + DataType table_4; // column 23 + DataType lagrange_first; // column 24 + DataType lagrange_last; // column 25 + DataType lagrange_ecc_op; // column 26 // indicator poly for ecc op gates + + DEFINE_POINTER_VIEW(NUM_PRECOMPUTED_ENTITIES, + &q_m, + &q_c, + &q_l, + &q_r, + &q_o, + &q_4, + &q_arith, + &q_sort, + &q_elliptic, + &q_aux, + &q_lookup, + &q_busread, + &sigma_1, + &sigma_2, + &sigma_3, + &sigma_4, + &id_1, + &id_2, + &id_3, + &id_4, + &table_1, + &table_2, + &table_3, + &table_4, + &lagrange_first, + &lagrange_last, + &lagrange_ecc_op) static constexpr CircuitType CIRCUIT_TYPE = CircuitBuilder::CIRCUIT_TYPE; @@ -126,23 +155,42 @@ class GoblinUltra { template class WitnessEntities : public WitnessEntities_ { public: - DataType& w_l = std::get<0>(this->_data); - DataType& w_r = std::get<1>(this->_data); - DataType& w_o = std::get<2>(this->_data); - DataType& w_4 = std::get<3>(this->_data); - DataType& sorted_1 = std::get<4>(this->_data); - DataType& sorted_2 = std::get<5>(this->_data); - DataType& sorted_3 = std::get<6>(this->_data); - DataType& sorted_4 = std::get<7>(this->_data); - DataType& sorted_accum = std::get<8>(this->_data); - DataType& z_perm = std::get<9>(this->_data); - DataType& z_lookup = std::get<10>(this->_data); - DataType& ecc_op_wire_1 = std::get<11>(this->_data); - DataType& ecc_op_wire_2 = std::get<12>(this->_data); - DataType& ecc_op_wire_3 = std::get<13>(this->_data); - DataType& ecc_op_wire_4 = std::get<14>(this->_data); - DataType& calldata = std::get<15>(this->_data); - DataType& calldata_read_counts = std::get<16>(this->_data); + DataType w_l; // column 0 + DataType w_r; // column 1 + DataType w_o; // column 2 + DataType w_4; // column 3 + DataType sorted_1; // column 4 + DataType sorted_2; // column 5 + DataType sorted_3; // column 6 + DataType sorted_4; // column 7 + DataType sorted_accum; // column 8 + DataType z_perm; // column 9 + DataType z_lookup; // column 10 + DataType ecc_op_wire_1; // column 11 + DataType ecc_op_wire_2; // column 12 + DataType ecc_op_wire_3; // column 13 + DataType ecc_op_wire_4; // column 14 + DataType calldata; // column 15 + DataType calldata_read_counts; // column 16 + + DEFINE_POINTER_VIEW(NUM_WITNESS_ENTITIES, + &w_l, + &w_r, + &w_o, + &w_4, + &sorted_1, + &sorted_2, + &sorted_3, + &sorted_4, + &sorted_accum, + &z_perm, + &z_lookup, + &ecc_op_wire_1, + &ecc_op_wire_2, + &ecc_op_wire_3, + &ecc_op_wire_4, + &calldata, + &calldata_read_counts) std::vector get_wires() override { return { w_l, w_r, w_o, w_4 }; }; std::vector get_ecc_op_wires() @@ -165,57 +213,57 @@ class GoblinUltra { template class AllEntities : public AllEntities_ { public: - DataType& q_c = std::get<0>(this->_data); - DataType& q_l = std::get<1>(this->_data); - DataType& q_r = std::get<2>(this->_data); - DataType& q_o = std::get<3>(this->_data); - DataType& q_4 = std::get<4>(this->_data); - DataType& q_m = std::get<5>(this->_data); - DataType& q_arith = std::get<6>(this->_data); - DataType& q_sort = std::get<7>(this->_data); - DataType& q_elliptic = std::get<8>(this->_data); - DataType& q_aux = std::get<9>(this->_data); - DataType& q_lookup = std::get<10>(this->_data); - DataType& q_busread = std::get<11>(this->_data); - DataType& sigma_1 = std::get<12>(this->_data); - DataType& sigma_2 = std::get<13>(this->_data); - DataType& sigma_3 = std::get<14>(this->_data); - DataType& sigma_4 = std::get<15>(this->_data); - DataType& id_1 = std::get<16>(this->_data); - DataType& id_2 = std::get<17>(this->_data); - DataType& id_3 = std::get<18>(this->_data); - DataType& id_4 = std::get<19>(this->_data); - DataType& table_1 = std::get<20>(this->_data); - DataType& table_2 = std::get<21>(this->_data); - DataType& table_3 = std::get<22>(this->_data); - DataType& table_4 = std::get<23>(this->_data); - DataType& lagrange_first = std::get<24>(this->_data); - DataType& lagrange_last = std::get<25>(this->_data); - DataType& lagrange_ecc_op = std::get<26>(this->_data); - DataType& w_l = std::get<27>(this->_data); - DataType& w_r = std::get<28>(this->_data); - DataType& w_o = std::get<29>(this->_data); - DataType& w_4 = std::get<30>(this->_data); - DataType& sorted_accum = std::get<31>(this->_data); - DataType& z_perm = std::get<32>(this->_data); - DataType& z_lookup = std::get<33>(this->_data); - DataType& ecc_op_wire_1 = std::get<34>(this->_data); - DataType& ecc_op_wire_2 = std::get<35>(this->_data); - DataType& ecc_op_wire_3 = std::get<36>(this->_data); - DataType& ecc_op_wire_4 = std::get<37>(this->_data); - DataType& calldata = std::get<38>(this->_data); - DataType& calldata_read_counts = std::get<39>(this->_data); - DataType& table_1_shift = std::get<40>(this->_data); - DataType& table_2_shift = std::get<41>(this->_data); - DataType& table_3_shift = std::get<42>(this->_data); - DataType& table_4_shift = std::get<43>(this->_data); - DataType& w_l_shift = std::get<44>(this->_data); - DataType& w_r_shift = std::get<45>(this->_data); - DataType& w_o_shift = std::get<46>(this->_data); - DataType& w_4_shift = std::get<47>(this->_data); - DataType& sorted_accum_shift = std::get<48>(this->_data); - DataType& z_perm_shift = std::get<49>(this->_data); - DataType& z_lookup_shift = std::get<50>(this->_data); + DataType q_c; // column 0 + DataType q_l; // column 1 + DataType q_r; // column 2 + DataType q_o; // column 3 + DataType q_4; // column 4 + DataType q_m; // column 5 + DataType q_arith; // column 6 + DataType q_sort; // column 7 + DataType q_elliptic; // column 8 + DataType q_aux; // column 9 + DataType q_lookup; // column 10 + DataType q_busread; // column 11 + DataType sigma_1; // column 12 + DataType sigma_2; // column 13 + DataType sigma_3; // column 14 + DataType sigma_4; // column 15 + DataType id_1; // column 16 + DataType id_2; // column 17 + DataType id_3; // column 18 + DataType id_4; // column 19 + DataType table_1; // column 20 + DataType table_2; // column 21 + DataType table_3; // column 22 + DataType table_4; // column 23 + DataType lagrange_first; // column 24 + DataType lagrange_last; // column 25 + DataType lagrange_ecc_op; // column 26 + DataType w_l; // column 27 + DataType w_r; // column 28 + DataType w_o; // column 29 + DataType w_4; // column 30 + DataType sorted_accum; // column 31 + DataType z_perm; // column 32 + DataType z_lookup; // column 33 + DataType ecc_op_wire_1; // column 34 + DataType ecc_op_wire_2; // column 35 + DataType ecc_op_wire_3; // column 36 + DataType ecc_op_wire_4; // column 37 + DataType calldata; // column 38 + DataType calldata_read_counts; // column 39 + DataType table_1_shift; // column 40 + DataType table_2_shift; // column 41 + DataType table_3_shift; // column 42 + DataType table_4_shift; // column 43 + DataType w_l_shift; // column 44 + DataType w_r_shift; // column 45 + DataType w_o_shift; // column 46 + DataType w_4_shift; // column 47 + DataType sorted_accum_shift; // column 48 + DataType z_perm_shift; // column 49 + DataType z_lookup_shift; // column 50 // defines a method pointer_view that returns the following, with const and non-const variants DEFINE_POINTER_VIEW(NUM_ALL_ENTITIES, @@ -329,31 +377,6 @@ class GoblinUltra { return { table_1_shift, table_2_shift, table_3_shift, table_4_shift, w_l_shift, w_r_shift, w_o_shift, w_4_shift, sorted_accum_shift, z_perm_shift, z_lookup_shift }; }; - - AllEntities() = default; - - AllEntities(const AllEntities& other) - : AllEntities_(other){}; - - AllEntities(AllEntities&& other) - : AllEntities_(other){}; - - AllEntities& operator=(const AllEntities& other) - { - if (this == &other) { - return *this; - } - AllEntities_::operator=(other); - return *this; - } - - AllEntities& operator=(AllEntities&& other) - { - AllEntities_::operator=(other); - return *this; - } - - ~AllEntities() = default; }; public: @@ -399,8 +422,8 @@ class GoblinUltra { PartiallyEvaluatedMultivariates(const size_t circuit_size) { // Storage is only needed after the first partial evaluation, hence polynomials of size (n / 2) - for (auto& poly : this->_data) { - poly = Polynomial(circuit_size / 2); + for (auto* poly : pointer_view()) { + *poly = Polynomial(circuit_size / 2); } } }; @@ -425,7 +448,6 @@ class GoblinUltra { public: using Base = AllEntities; using Base::Base; - AllValues(std::array _data_in) { this->_data = _data_in; } }; /** diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp index 0e452c3ff62..e85e9578ce2 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp @@ -98,33 +98,33 @@ template class GoblinUltraRecursive_ { */ class PrecomputedEntities : public PrecomputedEntities_ { public: - DataType& q_m = std::get<0>(this->_data); - DataType& q_c = std::get<1>(this->_data); - DataType& q_l = std::get<2>(this->_data); - DataType& q_r = std::get<3>(this->_data); - DataType& q_o = std::get<4>(this->_data); - DataType& q_4 = std::get<5>(this->_data); - DataType& q_arith = std::get<6>(this->_data); - DataType& q_sort = std::get<7>(this->_data); - DataType& q_elliptic = std::get<8>(this->_data); - DataType& q_aux = std::get<9>(this->_data); - DataType& q_lookup = std::get<10>(this->_data); - DataType& q_busread = std::get<11>(this->_data); - DataType& sigma_1 = std::get<12>(this->_data); - DataType& sigma_2 = std::get<13>(this->_data); - DataType& sigma_3 = std::get<14>(this->_data); - DataType& sigma_4 = std::get<15>(this->_data); - DataType& id_1 = std::get<16>(this->_data); - DataType& id_2 = std::get<17>(this->_data); - DataType& id_3 = std::get<18>(this->_data); - DataType& id_4 = std::get<19>(this->_data); - DataType& table_1 = std::get<20>(this->_data); - DataType& table_2 = std::get<21>(this->_data); - DataType& table_3 = std::get<22>(this->_data); - DataType& table_4 = std::get<23>(this->_data); - DataType& lagrange_first = std::get<24>(this->_data); - DataType& lagrange_last = std::get<25>(this->_data); - DataType& lagrange_ecc_op = std::get<26>(this->_data); // indicator poly for ecc op gates + DataType q_m; // column 0 + DataType q_c; // column 1 + DataType q_l; // column 2 + DataType q_r; // column 3 + DataType q_o; // column 4 + DataType q_4; // column 5 + DataType q_arith; // column 6 + DataType q_sort; // column 7 + DataType q_elliptic; // column 8 + DataType q_aux; // column 9 + DataType q_lookup; // column 10 + DataType q_busread; // column 11 + DataType sigma_1; // column 12 + DataType sigma_2; // column 13 + DataType sigma_3; // column 14 + DataType sigma_4; // column 15 + DataType id_1; // column 16 + DataType id_2; // column 17 + DataType id_3; // column 18 + DataType id_4; // column 19 + DataType table_1; // column 20 + DataType table_2; // column 21 + DataType table_3; // column 22 + DataType table_4; // column 23 + DataType lagrange_first; // column 24 + DataType lagrange_last; // column 25 + DataType lagrange_ecc_op; // column 26 // indicator poly for ecc op gates static constexpr CircuitType CIRCUIT_TYPE = CircuitBuilder::CIRCUIT_TYPE; @@ -145,23 +145,42 @@ template class GoblinUltraRecursive_ { template class WitnessEntities : public WitnessEntities_ { public: - DataType& w_l = std::get<0>(this->_data); - DataType& w_r = std::get<1>(this->_data); - DataType& w_o = std::get<2>(this->_data); - DataType& w_4 = std::get<3>(this->_data); - DataType& sorted_1 = std::get<4>(this->_data); - DataType& sorted_2 = std::get<5>(this->_data); - DataType& sorted_3 = std::get<6>(this->_data); - DataType& sorted_4 = std::get<7>(this->_data); - DataType& sorted_accum = std::get<8>(this->_data); - DataType& z_perm = std::get<9>(this->_data); - DataType& z_lookup = std::get<10>(this->_data); - DataType& ecc_op_wire_1 = std::get<11>(this->_data); - DataType& ecc_op_wire_2 = std::get<12>(this->_data); - DataType& ecc_op_wire_3 = std::get<13>(this->_data); - DataType& ecc_op_wire_4 = std::get<14>(this->_data); - DataType& calldata = std::get<15>(this->_data); - DataType& calldata_read_counts = std::get<16>(this->_data); + DataType w_l; // column 0 + DataType w_r; // column 1 + DataType w_o; // column 2 + DataType w_4; // column 3 + DataType sorted_1; // column 4 + DataType sorted_2; // column 5 + DataType sorted_3; // column 6 + DataType sorted_4; // column 7 + DataType sorted_accum; // column 8 + DataType z_perm; // column 9 + DataType z_lookup; // column 10 + DataType ecc_op_wire_1; // column 11 + DataType ecc_op_wire_2; // column 12 + DataType ecc_op_wire_3; // column 13 + DataType ecc_op_wire_4; // column 14 + DataType calldata; // column 15 + DataType calldata_read_counts; // column 16 + + DEFINE_POINTER_VIEW(NUM_WITNESS_ENTITIES, + &w_l, + &w_r, + &w_o, + &w_4, + &sorted_1, + &sorted_2, + &sorted_3, + &sorted_4, + &sorted_accum, + &z_perm, + &z_lookup, + &ecc_op_wire_1, + &ecc_op_wire_2, + &ecc_op_wire_3, + &ecc_op_wire_4, + &calldata, + &calldata_read_counts) std::vector get_wires() override { return { w_l, w_r, w_o, w_4 }; }; std::vector get_ecc_op_wires() @@ -184,57 +203,110 @@ template class GoblinUltraRecursive_ { template class AllEntities : public AllEntities_ { public: - DataType& q_c = std::get<0>(this->_data); - DataType& q_l = std::get<1>(this->_data); - DataType& q_r = std::get<2>(this->_data); - DataType& q_o = std::get<3>(this->_data); - DataType& q_4 = std::get<4>(this->_data); - DataType& q_m = std::get<5>(this->_data); - DataType& q_arith = std::get<6>(this->_data); - DataType& q_sort = std::get<7>(this->_data); - DataType& q_elliptic = std::get<8>(this->_data); - DataType& q_aux = std::get<9>(this->_data); - DataType& q_lookup = std::get<10>(this->_data); - DataType& q_busread = std::get<11>(this->_data); - DataType& sigma_1 = std::get<12>(this->_data); - DataType& sigma_2 = std::get<13>(this->_data); - DataType& sigma_3 = std::get<14>(this->_data); - DataType& sigma_4 = std::get<15>(this->_data); - DataType& id_1 = std::get<16>(this->_data); - DataType& id_2 = std::get<17>(this->_data); - DataType& id_3 = std::get<18>(this->_data); - DataType& id_4 = std::get<19>(this->_data); - DataType& table_1 = std::get<20>(this->_data); - DataType& table_2 = std::get<21>(this->_data); - DataType& table_3 = std::get<22>(this->_data); - DataType& table_4 = std::get<23>(this->_data); - DataType& lagrange_first = std::get<24>(this->_data); - DataType& lagrange_last = std::get<25>(this->_data); - DataType& lagrange_ecc_op = std::get<26>(this->_data); - DataType& w_l = std::get<27>(this->_data); - DataType& w_r = std::get<28>(this->_data); - DataType& w_o = std::get<29>(this->_data); - DataType& w_4 = std::get<30>(this->_data); - DataType& sorted_accum = std::get<31>(this->_data); - DataType& z_perm = std::get<32>(this->_data); - DataType& z_lookup = std::get<33>(this->_data); - DataType& ecc_op_wire_1 = std::get<34>(this->_data); - DataType& ecc_op_wire_2 = std::get<35>(this->_data); - DataType& ecc_op_wire_3 = std::get<36>(this->_data); - DataType& ecc_op_wire_4 = std::get<37>(this->_data); - DataType& calldata = std::get<38>(this->_data); - DataType& calldata_read_counts = std::get<39>(this->_data); - DataType& table_1_shift = std::get<40>(this->_data); - DataType& table_2_shift = std::get<41>(this->_data); - DataType& table_3_shift = std::get<42>(this->_data); - DataType& table_4_shift = std::get<43>(this->_data); - DataType& w_l_shift = std::get<44>(this->_data); - DataType& w_r_shift = std::get<45>(this->_data); - DataType& w_o_shift = std::get<46>(this->_data); - DataType& w_4_shift = std::get<47>(this->_data); - DataType& sorted_accum_shift = std::get<48>(this->_data); - DataType& z_perm_shift = std::get<49>(this->_data); - DataType& z_lookup_shift = std::get<50>(this->_data); + DataType q_c; // column 0 + DataType q_l; // column 1 + DataType q_r; // column 2 + DataType q_o; // column 3 + DataType q_4; // column 4 + DataType q_m; // column 5 + DataType q_arith; // column 6 + DataType q_sort; // column 7 + DataType q_elliptic; // column 8 + DataType q_aux; // column 9 + DataType q_lookup; // column 10 + DataType q_busread; // column 11 + DataType sigma_1; // column 12 + DataType sigma_2; // column 13 + DataType sigma_3; // column 14 + DataType sigma_4; // column 15 + DataType id_1; // column 16 + DataType id_2; // column 17 + DataType id_3; // column 18 + DataType id_4; // column 19 + DataType table_1; // column 20 + DataType table_2; // column 21 + DataType table_3; // column 22 + DataType table_4; // column 23 + DataType lagrange_first; // column 24 + DataType lagrange_last; // column 25 + DataType lagrange_ecc_op; // column 26 + DataType w_l; // column 27 + DataType w_r; // column 28 + DataType w_o; // column 29 + DataType w_4; // column 30 + DataType sorted_accum; // column 31 + DataType z_perm; // column 32 + DataType z_lookup; // column 33 + DataType ecc_op_wire_1; // column 34 + DataType ecc_op_wire_2; // column 35 + DataType ecc_op_wire_3; // column 36 + DataType ecc_op_wire_4; // column 37 + DataType calldata; // column 38 + DataType calldata_read_counts; // column 39 + DataType table_1_shift; // column 40 + DataType table_2_shift; // column 41 + DataType table_3_shift; // column 42 + DataType table_4_shift; // column 43 + DataType w_l_shift; // column 44 + DataType w_r_shift; // column 45 + DataType w_o_shift; // column 46 + DataType w_4_shift; // column 47 + DataType sorted_accum_shift; // column 48 + DataType z_perm_shift; // column 49 + DataType z_lookup_shift; // column 50 + + DEFINE_POINTER_VIEW(NUM_ALL_ENTITIES, + &q_c, + &q_l, + &q_r, + &q_o, + &q_4, + &q_m, + &q_arith, + &q_sort, + &q_elliptic, + &q_aux, + &q_lookup, + &q_busread, + &sigma_1, + &sigma_2, + &sigma_3, + &sigma_4, + &id_1, + &id_2, + &id_3, + &id_4, + &table_1, + &table_2, + &table_3, + &table_4, + &lagrange_first, + &lagrange_last, + &lagrange_ecc_op, + &w_l, + &w_r, + &w_o, + &w_4, + &sorted_accum, + &z_perm, + &z_lookup, + &ecc_op_wire_1, + &ecc_op_wire_2, + &ecc_op_wire_3, + &ecc_op_wire_4, + &calldata, + &calldata_read_counts, + &table_1_shift, + &table_2_shift, + &table_3_shift, + &table_4_shift, + &w_l_shift, + &w_r_shift, + &w_o_shift, + &w_4_shift, + &sorted_accum_shift, + &z_perm_shift, + &z_lookup_shift) std::vector get_wires() override { return { w_l, w_r, w_o, w_4 }; }; std::vector get_ecc_op_wires() @@ -294,31 +366,6 @@ template class GoblinUltraRecursive_ { return { table_1_shift, table_2_shift, table_3_shift, table_4_shift, w_l_shift, w_r_shift, w_o_shift, w_4_shift, sorted_accum_shift, z_perm_shift, z_lookup_shift }; }; - - AllEntities() = default; - - AllEntities(const AllEntities& other) - : AllEntities_(other){}; - - AllEntities(AllEntities&& other) - : AllEntities_(other){}; - - AllEntities& operator=(const AllEntities& other) - { - if (this == &other) { - return *this; - } - AllEntities_::operator=(other); - return *this; - } - - AllEntities& operator=(AllEntities&& other) - { - AllEntities_::operator=(other); - return *this; - } - - ~AllEntities() = default; }; public: diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index f596b20d890..d347c45cc83 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -81,31 +81,58 @@ class Ultra { */ class PrecomputedEntities : public PrecomputedEntities_ { public: - DataType& q_m = std::get<0>(this->_data); - DataType& q_c = std::get<1>(this->_data); - DataType& q_l = std::get<2>(this->_data); - DataType& q_r = std::get<3>(this->_data); - DataType& q_o = std::get<4>(this->_data); - DataType& q_4 = std::get<5>(this->_data); - DataType& q_arith = std::get<6>(this->_data); - DataType& q_sort = std::get<7>(this->_data); - DataType& q_elliptic = std::get<8>(this->_data); - DataType& q_aux = std::get<9>(this->_data); - DataType& q_lookup = std::get<10>(this->_data); - DataType& sigma_1 = std::get<11>(this->_data); - DataType& sigma_2 = std::get<12>(this->_data); - DataType& sigma_3 = std::get<13>(this->_data); - DataType& sigma_4 = std::get<14>(this->_data); - DataType& id_1 = std::get<15>(this->_data); - DataType& id_2 = std::get<16>(this->_data); - DataType& id_3 = std::get<17>(this->_data); - DataType& id_4 = std::get<18>(this->_data); - DataType& table_1 = std::get<19>(this->_data); - DataType& table_2 = std::get<20>(this->_data); - DataType& table_3 = std::get<21>(this->_data); - DataType& table_4 = std::get<22>(this->_data); - DataType& lagrange_first = std::get<23>(this->_data); - DataType& lagrange_last = std::get<24>(this->_data); + DataType q_m; // column 0 + DataType q_c; // column 1 + DataType q_l; // column 2 + DataType q_r; // column 3 + DataType q_o; // column 4 + DataType q_4; // column 5 + DataType q_arith; // column 6 + DataType q_sort; // column 7 + DataType q_elliptic; // column 8 + DataType q_aux; // column 9 + DataType q_lookup; // column 10 + DataType sigma_1; // column 11 + DataType sigma_2; // column 12 + DataType sigma_3; // column 13 + DataType sigma_4; // column 14 + DataType id_1; // column 15 + DataType id_2; // column 16 + DataType id_3; // column 17 + DataType id_4; // column 18 + DataType table_1; // column 19 + DataType table_2; // column 20 + DataType table_3; // column 21 + DataType table_4; // column 22 + DataType lagrange_first; // column 23 + DataType lagrange_last; // column 24 + + DEFINE_POINTER_VIEW(NUM_PRECOMPUTED_ENTITIES, + &q_m, + &q_c, + &q_l, + &q_r, + &q_o, + &q_4, + &q_arith, + &q_sort, + &q_elliptic, + &q_aux, + &q_lookup, + &sigma_1, + &sigma_2, + &sigma_3, + &sigma_4, + &id_1, + &id_2, + &id_3, + &id_4, + &table_1, + &table_2, + &table_3, + &table_4, + &lagrange_first, + &lagrange_last) static constexpr CircuitType CIRCUIT_TYPE = CircuitBuilder::CIRCUIT_TYPE; @@ -126,17 +153,30 @@ class Ultra { template class WitnessEntities : public WitnessEntities_ { public: - DataType& w_l = std::get<0>(this->_data); - DataType& w_r = std::get<1>(this->_data); - DataType& w_o = std::get<2>(this->_data); - DataType& w_4 = std::get<3>(this->_data); - DataType& sorted_1 = std::get<4>(this->_data); - DataType& sorted_2 = std::get<5>(this->_data); - DataType& sorted_3 = std::get<6>(this->_data); - DataType& sorted_4 = std::get<7>(this->_data); - DataType& sorted_accum = std::get<8>(this->_data); - DataType& z_perm = std::get<9>(this->_data); - DataType& z_lookup = std::get<10>(this->_data); + DataType w_l; // column 0 + DataType w_r; // column 1 + DataType w_o; // column 2 + DataType w_4; // column 3 + DataType sorted_1; // column 4 + DataType sorted_2; // column 5 + DataType sorted_3; // column 6 + DataType sorted_4; // column 7 + DataType sorted_accum; // column 8 + DataType z_perm; // column 9 + DataType z_lookup; // column 10 + + DEFINE_POINTER_VIEW(NUM_WITNESS_ENTITIES, + &w_l, + &w_r, + &w_o, + &w_4, + &sorted_1, + &sorted_2, + &sorted_3, + &sorted_4, + &sorted_accum, + &z_perm, + &z_lookup) std::vector get_wires() override { return { w_l, w_r, w_o, w_4 }; }; // The sorted concatenations of table and witness data needed for plookup. @@ -155,49 +195,49 @@ class Ultra { template class AllEntities : public AllEntities_ { public: - DataType& q_c = std::get<0>(this->_data); - DataType& q_l = std::get<1>(this->_data); - DataType& q_r = std::get<2>(this->_data); - DataType& q_o = std::get<3>(this->_data); - DataType& q_4 = std::get<4>(this->_data); - DataType& q_m = std::get<5>(this->_data); - DataType& q_arith = std::get<6>(this->_data); - DataType& q_sort = std::get<7>(this->_data); - DataType& q_elliptic = std::get<8>(this->_data); - DataType& q_aux = std::get<9>(this->_data); - DataType& q_lookup = std::get<10>(this->_data); - DataType& sigma_1 = std::get<11>(this->_data); - DataType& sigma_2 = std::get<12>(this->_data); - DataType& sigma_3 = std::get<13>(this->_data); - DataType& sigma_4 = std::get<14>(this->_data); - DataType& id_1 = std::get<15>(this->_data); - DataType& id_2 = std::get<16>(this->_data); - DataType& id_3 = std::get<17>(this->_data); - DataType& id_4 = std::get<18>(this->_data); - DataType& table_1 = std::get<19>(this->_data); - DataType& table_2 = std::get<20>(this->_data); - DataType& table_3 = std::get<21>(this->_data); - DataType& table_4 = std::get<22>(this->_data); - DataType& lagrange_first = std::get<23>(this->_data); - DataType& lagrange_last = std::get<24>(this->_data); - DataType& w_l = std::get<25>(this->_data); - DataType& w_r = std::get<26>(this->_data); - DataType& w_o = std::get<27>(this->_data); - DataType& w_4 = std::get<28>(this->_data); - DataType& sorted_accum = std::get<29>(this->_data); - DataType& z_perm = std::get<30>(this->_data); - DataType& z_lookup = std::get<31>(this->_data); - DataType& table_1_shift = std::get<32>(this->_data); - DataType& table_2_shift = std::get<33>(this->_data); - DataType& table_3_shift = std::get<34>(this->_data); - DataType& table_4_shift = std::get<35>(this->_data); - DataType& w_l_shift = std::get<36>(this->_data); - DataType& w_r_shift = std::get<37>(this->_data); - DataType& w_o_shift = std::get<38>(this->_data); - DataType& w_4_shift = std::get<39>(this->_data); - DataType& sorted_accum_shift = std::get<40>(this->_data); - DataType& z_perm_shift = std::get<41>(this->_data); - DataType& z_lookup_shift = std::get<42>(this->_data); + DataType q_c; // column 0 + DataType q_l; // column 1 + DataType q_r; // column 2 + DataType q_o; // column 3 + DataType q_4; // column 4 + DataType q_m; // column 5 + DataType q_arith; // column 6 + DataType q_sort; // column 7 + DataType q_elliptic; // column 8 + DataType q_aux; // column 9 + DataType q_lookup; // column 10 + DataType sigma_1; // column 11 + DataType sigma_2; // column 12 + DataType sigma_3; // column 13 + DataType sigma_4; // column 14 + DataType id_1; // column 15 + DataType id_2; // column 16 + DataType id_3; // column 17 + DataType id_4; // column 18 + DataType table_1; // column 19 + DataType table_2; // column 20 + DataType table_3; // column 21 + DataType table_4; // column 22 + DataType lagrange_first; // column 23 + DataType lagrange_last; // column 24 + DataType w_l; // column 25 + DataType w_r; // column 26 + DataType w_o; // column 27 + DataType w_4; // column 28 + DataType sorted_accum; // column 29 + DataType z_perm; // column 30 + DataType z_lookup; // column 31 + DataType table_1_shift; // column 32 + DataType table_2_shift; // column 33 + DataType table_3_shift; // column 34 + DataType table_4_shift; // column 35 + DataType w_l_shift; // column 36 + DataType w_r_shift; // column 37 + DataType w_o_shift; // column 38 + DataType w_4_shift; // column 39 + DataType sorted_accum_shift; // column 40 + DataType z_perm_shift; // column 41 + DataType z_lookup_shift; // column 42 // defines a method pointer_view that returns the following, with const and non-const variants DEFINE_POINTER_VIEW(NUM_ALL_ENTITIES, @@ -264,31 +304,6 @@ class Ultra { return { table_1_shift, table_2_shift, table_3_shift, table_4_shift, w_l_shift, w_r_shift, w_o_shift, w_4_shift, sorted_accum_shift, z_perm_shift, z_lookup_shift }; }; - - AllEntities() = default; - - AllEntities(const AllEntities& other) - : AllEntities_(other){}; - - AllEntities(AllEntities&& other) - : AllEntities_(other){}; - - AllEntities& operator=(const AllEntities& other) - { - if (this == &other) { - return *this; - } - AllEntities_::operator=(other); - return *this; - } - - AllEntities& operator=(AllEntities&& other) - { - AllEntities_::operator=(other); - return *this; - } - - ~AllEntities() = default; }; public: @@ -330,7 +345,6 @@ class Ultra { public: using Base = AllEntities; using Base::Base; - AllValues(std::array _data_in) { this->_data = _data_in; } }; /** @@ -359,8 +373,8 @@ class Ultra { PartiallyEvaluatedMultivariates(const size_t circuit_size) { // Storage is only needed after the first partial evaluation, hence polynomials of size (n / 2) - for (auto& poly : this->_data) { - poly = Polynomial(circuit_size / 2); + for (auto* poly : pointer_view()) { + *poly = Polynomial(circuit_size / 2); } } }; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp index d4fbf11941d..e780007eb36 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp @@ -96,31 +96,31 @@ template class UltraRecursive_ { */ class PrecomputedEntities : public PrecomputedEntities_ { public: - DataType& q_m = std::get<0>(this->_data); - DataType& q_c = std::get<1>(this->_data); - DataType& q_l = std::get<2>(this->_data); - DataType& q_r = std::get<3>(this->_data); - DataType& q_o = std::get<4>(this->_data); - DataType& q_4 = std::get<5>(this->_data); - DataType& q_arith = std::get<6>(this->_data); - DataType& q_sort = std::get<7>(this->_data); - DataType& q_elliptic = std::get<8>(this->_data); - DataType& q_aux = std::get<9>(this->_data); - DataType& q_lookup = std::get<10>(this->_data); - DataType& sigma_1 = std::get<11>(this->_data); - DataType& sigma_2 = std::get<12>(this->_data); - DataType& sigma_3 = std::get<13>(this->_data); - DataType& sigma_4 = std::get<14>(this->_data); - DataType& id_1 = std::get<15>(this->_data); - DataType& id_2 = std::get<16>(this->_data); - DataType& id_3 = std::get<17>(this->_data); - DataType& id_4 = std::get<18>(this->_data); - DataType& table_1 = std::get<19>(this->_data); - DataType& table_2 = std::get<20>(this->_data); - DataType& table_3 = std::get<21>(this->_data); - DataType& table_4 = std::get<22>(this->_data); - DataType& lagrange_first = std::get<23>(this->_data); - DataType& lagrange_last = std::get<24>(this->_data); + DataType q_m; // column 0 + DataType q_c; // column 1 + DataType q_l; // column 2 + DataType q_r; // column 3 + DataType q_o; // column 4 + DataType q_4; // column 5 + DataType q_arith; // column 6 + DataType q_sort; // column 7 + DataType q_elliptic; // column 8 + DataType q_aux; // column 9 + DataType q_lookup; // column 10 + DataType sigma_1; // column 11 + DataType sigma_2; // column 12 + DataType sigma_3; // column 13 + DataType sigma_4; // column 14 + DataType id_1; // column 15 + DataType id_2; // column 16 + DataType id_3; // column 17 + DataType id_4; // column 18 + DataType table_1; // column 19 + DataType table_2; // column 20 + DataType table_3; // column 21 + DataType table_4; // column 22 + DataType lagrange_first; // column 23 + DataType lagrange_last; // column 24 std::vector get_selectors() override { @@ -139,17 +139,30 @@ template class UltraRecursive_ { template class WitnessEntities : public WitnessEntities_ { public: - DataType& w_l = std::get<0>(this->_data); - DataType& w_r = std::get<1>(this->_data); - DataType& w_o = std::get<2>(this->_data); - DataType& w_4 = std::get<3>(this->_data); - DataType& sorted_1 = std::get<4>(this->_data); - DataType& sorted_2 = std::get<5>(this->_data); - DataType& sorted_3 = std::get<6>(this->_data); - DataType& sorted_4 = std::get<7>(this->_data); - DataType& sorted_accum = std::get<8>(this->_data); - DataType& z_perm = std::get<9>(this->_data); - DataType& z_lookup = std::get<10>(this->_data); + DataType w_l; // column 0 + DataType w_r; // column 1 + DataType w_o; // column 2 + DataType w_4; // column 3 + DataType sorted_1; // column 4 + DataType sorted_2; // column 5 + DataType sorted_3; // column 6 + DataType sorted_4; // column 7 + DataType sorted_accum; // column 8 + DataType z_perm; // column 9 + DataType z_lookup; // column 10 + + DEFINE_POINTER_VIEW(NUM_WITNESS_ENTITIES, + &w_l, + &w_r, + &w_o, + &w_4, + &sorted_1, + &sorted_2, + &sorted_3, + &sorted_4, + &sorted_accum, + &z_perm, + &z_lookup, ) std::vector get_wires() override { return { w_l, w_r, w_o, w_4 }; }; // The sorted concatenations of table and witness data needed for plookup. @@ -168,49 +181,94 @@ template class UltraRecursive_ { template class AllEntities : public AllEntities_ { public: - DataType& q_c = std::get<0>(this->_data); - DataType& q_l = std::get<1>(this->_data); - DataType& q_r = std::get<2>(this->_data); - DataType& q_o = std::get<3>(this->_data); - DataType& q_4 = std::get<4>(this->_data); - DataType& q_m = std::get<5>(this->_data); - DataType& q_arith = std::get<6>(this->_data); - DataType& q_sort = std::get<7>(this->_data); - DataType& q_elliptic = std::get<8>(this->_data); - DataType& q_aux = std::get<9>(this->_data); - DataType& q_lookup = std::get<10>(this->_data); - DataType& sigma_1 = std::get<11>(this->_data); - DataType& sigma_2 = std::get<12>(this->_data); - DataType& sigma_3 = std::get<13>(this->_data); - DataType& sigma_4 = std::get<14>(this->_data); - DataType& id_1 = std::get<15>(this->_data); - DataType& id_2 = std::get<16>(this->_data); - DataType& id_3 = std::get<17>(this->_data); - DataType& id_4 = std::get<18>(this->_data); - DataType& table_1 = std::get<19>(this->_data); - DataType& table_2 = std::get<20>(this->_data); - DataType& table_3 = std::get<21>(this->_data); - DataType& table_4 = std::get<22>(this->_data); - DataType& lagrange_first = std::get<23>(this->_data); - DataType& lagrange_last = std::get<24>(this->_data); - DataType& w_l = std::get<25>(this->_data); - DataType& w_r = std::get<26>(this->_data); - DataType& w_o = std::get<27>(this->_data); - DataType& w_4 = std::get<28>(this->_data); - DataType& sorted_accum = std::get<29>(this->_data); - DataType& z_perm = std::get<30>(this->_data); - DataType& z_lookup = std::get<31>(this->_data); - DataType& table_1_shift = std::get<32>(this->_data); - DataType& table_2_shift = std::get<33>(this->_data); - DataType& table_3_shift = std::get<34>(this->_data); - DataType& table_4_shift = std::get<35>(this->_data); - DataType& w_l_shift = std::get<36>(this->_data); - DataType& w_r_shift = std::get<37>(this->_data); - DataType& w_o_shift = std::get<38>(this->_data); - DataType& w_4_shift = std::get<39>(this->_data); - DataType& sorted_accum_shift = std::get<40>(this->_data); - DataType& z_perm_shift = std::get<41>(this->_data); - DataType& z_lookup_shift = std::get<42>(this->_data); + DataType q_c; // column 0 + DataType q_l; // column 1 + DataType q_r; // column 2 + DataType q_o; // column 3 + DataType q_4; // column 4 + DataType q_m; // column 5 + DataType q_arith; // column 6 + DataType q_sort; // column 7 + DataType q_elliptic; // column 8 + DataType q_aux; // column 9 + DataType q_lookup; // column 10 + DataType sigma_1; // column 11 + DataType sigma_2; // column 12 + DataType sigma_3; // column 13 + DataType sigma_4; // column 14 + DataType id_1; // column 15 + DataType id_2; // column 16 + DataType id_3; // column 17 + DataType id_4; // column 18 + DataType table_1; // column 19 + DataType table_2; // column 20 + DataType table_3; // column 21 + DataType table_4; // column 22 + DataType lagrange_first; // column 23 + DataType lagrange_last; // column 24 + DataType w_l; // column 25 + DataType w_r; // column 26 + DataType w_o; // column 27 + DataType w_4; // column 28 + DataType sorted_accum; // column 29 + DataType z_perm; // column 30 + DataType z_lookup; // column 31 + DataType table_1_shift; // column 32 + DataType table_2_shift; // column 33 + DataType table_3_shift; // column 34 + DataType table_4_shift; // column 35 + DataType w_l_shift; // column 36 + DataType w_r_shift; // column 37 + DataType w_o_shift; // column 38 + DataType w_4_shift; // column 39 + DataType sorted_accum_shift; // column 40 + DataType z_perm_shift; // column 41 + DataType z_lookup_shift; // column 42 + + DEFINE_POINTER_VIEW(NUM_ALL_ENTITIES, + &q_c, + &q_l, + &q_r, + &q_o, + &q_4, + &q_m, + &q_arith, + &q_sort, + &q_elliptic, + &q_aux, + &q_lookup, + &sigma_1, + &sigma_2, + &sigma_3, + &sigma_4, + &id_1, + &id_2, + &id_3, + &id_4, + &table_1, + &table_2, + &table_3, + &table_4, + &lagrange_first, + &lagrange_last, + &w_l, + &w_r, + &w_o, + &w_4, + &sorted_accum, + &z_perm, + &z_lookup, + &table_1_shift, + &table_2_shift, + &table_3_shift, + &table_4_shift, + &w_l_shift, + &w_r_shift, + &w_o_shift, + &w_4_shift, + &sorted_accum_shift, + &z_perm_shift, + &z_lookup_shift) std::vector get_wires() override { return { w_l, w_r, w_o, w_4 }; }; // Gemini-specific getters. @@ -232,31 +290,6 @@ template class UltraRecursive_ { return { table_1_shift, table_2_shift, table_3_shift, table_4_shift, w_l_shift, w_r_shift, w_o_shift, w_4_shift, sorted_accum_shift, z_perm_shift, z_lookup_shift }; }; - - AllEntities() = default; - - AllEntities(const AllEntities& other) - : AllEntities_(other){}; - - AllEntities(AllEntities&& other) - : AllEntities_(other){}; - - AllEntities& operator=(const AllEntities& other) - { - if (this == &other) { - return *this; - } - AllEntities_::operator=(other); - return *this; - } - - AllEntities& operator=(AllEntities&& other) - { - AllEntities_::operator=(other); - return *this; - } - - ~AllEntities() = default; }; public: diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/composer_lib.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/composer_lib.hpp deleted file mode 100644 index 1219b2a586b..00000000000 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/composer_lib.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp" -#include "barretenberg/plonk/proof_system/verification_key/verification_key.hpp" - -namespace proof_system::honk { - -/** - * @brief Computes the verification key. - * @details Does the following - * (1) commitments to the selector, permutation, and lagrange (first/last) polynomials, - * (2) sets the polynomial manifest using the data from proving key. - * - * @tparam Flavor - * @param proving_key A completely construted proving key. - * @param vrs The reference string used by the verifier - * @return std::shared_ptr - */ -// TODO(Cody): This function is not in use? -template -std::shared_ptr compute_verification_key_common( - std::shared_ptr const& proving_key, - std::shared_ptr> const& vrs) -{ - auto verification_key = std::make_shared( - proving_key->circuit_size, proving_key->num_public_inputs, vrs); - - auto commitment_key = typename Flavor::CommitmentKey(proving_key->circuit_size, proving_key->crs); - - size_t poly_idx = 0; // TODO(https://github.com/AztecProtocol/barretenberg/issues/391) zip - for (auto& polynomial : proving_key) { - verification_key[poly_idx] = commitment_key.commit(polynomial); - ++polynomial_idx; - } - - return verification_key; -} - -} // namespace proof_system::honk diff --git a/barretenberg/cpp/src/barretenberg/honk/utils/testing.test.cpp b/barretenberg/cpp/src/barretenberg/honk/utils/testing.test.cpp index bcab2e59490..01e816c5fb8 100644 --- a/barretenberg/cpp/src/barretenberg/honk/utils/testing.test.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/utils/testing.test.cpp @@ -9,8 +9,9 @@ TEST(HonkTestingUtils, ProverPolynomials) using Flavor = proof_system::honk::flavor::Ultra; auto [storage, prover_polynomials] = proof_system::honk::get_sequential_prover_polynomials(/*log_circuit_size=*/2, /*starting_value=*/0); - EXPECT_EQ(storage[0][0], prover_polynomials._data[0][0]); - EXPECT_EQ(storage[0][1], prover_polynomials._data[0][1]); + auto& first_polynomial = *prover_polynomials.pointer_view()[0]; + EXPECT_EQ(storage[0][0], first_polynomial[0]); + EXPECT_EQ(storage[0][1], first_polynomial[1]); }; } // namespace barretenberg::test_testing_utils diff --git a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp index 138917654bc..b898642be5e 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp @@ -60,7 +60,7 @@ template class Univariate size_t size() { return evaluations.size(); }; // Write the Univariate evaluations to a buffer - std::vector to_buffer() const { return ::to_buffer(evaluations); } + [[nodiscard]] std::vector to_buffer() const { return ::to_buffer(evaluations); } // Static method for creating a Univariate from a buffer // IMPROVEMENT: Could be made to identically match equivalent methods in e.g. field.hpp. Currently bypasses diff --git a/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp b/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp index 07e400b3774..8d3366f2256 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp @@ -39,25 +39,35 @@ void construct_selector_polynomials(const typename Flavor::CircuitBuilder& circu } // TODO(#398): Loose coupling here! Would rather build up pk from arithmetization - size_t selector_idx = 0; // TODO(https://github.com/AztecProtocol/barretenberg/issues/391) zip - for (auto& selector_values : circuit_constructor.selectors.get()) { - ASSERT(proving_key->circuit_size >= selector_values.size()); - - // Copy the selector values for all gates, keeping the rows at which we store public inputs as 0. - // Initializing the polynomials in this way automatically applies 0-padding to the selectors. - typename Flavor::Polynomial selector_poly_lagrange(proving_key->circuit_size); - for (size_t i = 0; i < selector_values.size(); ++i) { - selector_poly_lagrange[i + gate_offset] = selector_values[i]; + if constexpr (IsHonkFlavor) { + for (auto [poly_ptr, selector_values] : + zip_view(proving_key->precomputed_polynomials_pointer_view(), circuit_constructor.selectors.get())) { + ASSERT(proving_key->circuit_size >= selector_values.size()); + + // Copy the selector values for all gates, keeping the rows at which we store public inputs as 0. + // Initializing the polynomials in this way automatically applies 0-padding to the selectors. + typename Flavor::Polynomial selector_poly_lagrange(proving_key->circuit_size); + for (size_t i = 0; i < selector_values.size(); ++i) { + selector_poly_lagrange[i + gate_offset] = selector_values[i]; + } + *poly_ptr = selector_poly_lagrange; } - if constexpr (IsHonkFlavor) { - // TODO(#398): Loose coupling here of arithmetization and flavor. - proving_key->_precomputed_polynomials[selector_idx] = selector_poly_lagrange; - } else if constexpr (IsPlonkFlavor) { + } else if constexpr (IsPlonkFlavor) { + size_t selector_idx = 0; + for (auto& selector_values : circuit_constructor.selectors.get()) { + ASSERT(proving_key->circuit_size >= selector_values.size()); + + // Copy the selector values for all gates, keeping the rows at which we store public inputs as 0. + // Initializing the polynomials in this way automatically applies 0-padding to the selectors. + typename Flavor::Polynomial selector_poly_lagrange(proving_key->circuit_size); + for (size_t i = 0; i < selector_values.size(); ++i) { + selector_poly_lagrange[i + gate_offset] = selector_values[i]; + } // TODO(Cody): Loose coupling here of selector_names and selector_properties. proving_key->polynomial_store.put(circuit_constructor.selector_names[selector_idx] + "_lagrange", std::move(selector_poly_lagrange)); + ++selector_idx; } - ++selector_idx; } } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp index 304b031e8b3..a11e70120c3 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp @@ -98,7 +98,7 @@ template class ProtoGalaxyProver_ { const FF& alpha, const RelationParameters& relation_parameters) { - auto instance_size = std::get<0>(instance_polynomials._data).size(); + auto instance_size = instance_polynomials.get_polynomial_size(); std::vector full_honk_evaluations(instance_size); for (size_t row = 0; row < instance_size; row++) { @@ -208,11 +208,10 @@ template class ProtoGalaxyProver_ { const ProverInstances& instances, const size_t row_idx) { - size_t poly_idx = 0; - for (auto* extended_univariate : extended_univariates.pointer_view()) { - auto base_univariate = instances.row_to_univariate(poly_idx, row_idx); + auto base_univariates = instances.row_to_univariates(row_idx); + for (auto [extended_univariate, base_univariate] : + zip_view(extended_univariates.pointer_view(), base_univariates)) { *extended_univariate = base_univariate.template extend_to(); - poly_idx++; } } @@ -241,7 +240,7 @@ template class ProtoGalaxyProver_ { const std::vector& pow_betas_star, const FF& alpha) { - size_t common_circuit_size = instances[0]->prover_polynomials._data[0].size(); + size_t common_circuit_size = instances[0]->prover_polynomials.get_polynomial_size(); // Determine number of threads for multithreading. // Note: Multithreading is "on" for every round but we reduce the number of threads from the max available based @@ -352,4 +351,4 @@ template class ProtoGalaxyProver_ { extern template class ProtoGalaxyProver_>; extern template class ProtoGalaxyProver_>; -} // namespace proof_system::honk \ No newline at end of file +} // namespace proof_system::honk diff --git a/barretenberg/cpp/src/barretenberg/relations/ecc_vm/ecc_lookup_relation.cpp b/barretenberg/cpp/src/barretenberg/relations/ecc_vm/ecc_lookup_relation.cpp index 66f2b4108e4..903da2a7056 100644 --- a/barretenberg/cpp/src/barretenberg/relations/ecc_vm/ecc_lookup_relation.cpp +++ b/barretenberg/cpp/src/barretenberg/relations/ecc_vm/ecc_lookup_relation.cpp @@ -23,7 +23,7 @@ template ::accumulate(ContainerOverSubrelations& accumulator, const AllEntities& in, const Parameters& params, - [[maybe_unused]] const FF& scaling_factor) + const FF& scaling_factor) { lookup_library::accumulate_logderivative_lookup_subrelation_contributions>( accumulator, in, params, scaling_factor); diff --git a/barretenberg/cpp/src/barretenberg/relations/translator_vm/goblin_translator_relation_consistency.test.cpp b/barretenberg/cpp/src/barretenberg/relations/translator_vm/goblin_translator_relation_consistency.test.cpp index 02710913aba..4752810a600 100644 --- a/barretenberg/cpp/src/barretenberg/relations/translator_vm/goblin_translator_relation_consistency.test.cpp +++ b/barretenberg/cpp/src/barretenberg/relations/translator_vm/goblin_translator_relation_consistency.test.cpp @@ -25,7 +25,9 @@ using InputElements = typename Flavor::AllValues; InputElements get_random_input() { InputElements result; - std::generate(result._data.begin(), result._data.end(), [] { return FF::random_element(); }); + for (FF* element : result.pointer_view()) { + *element = FF::random_element(); + } return result; } @@ -33,10 +35,10 @@ InputElements get_special_input() // use non-random values { InputElements result; FF idx = 0; - std::generate(result._data.begin(), result._data.end(), [&] { + for (FF* element : result.pointer_view()) { idx += FF(1); - return idx; - }); + *element = idx; + } return result; } diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/instances.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/instances.hpp index 10fae3acc59..0f73a98d6a8 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/instances.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/instances.hpp @@ -6,6 +6,7 @@ namespace proof_system::honk { template struct ProverInstances_ { public: + static_assert(NUM_ > 0, "Must have at least one prover instance"); using Flavor = Flavor_; using FF = typename Flavor::FF; static constexpr size_t NUM = NUM_; @@ -32,33 +33,52 @@ template struct ProverInstances_ { }; /** - * @brief For a prover polynomial label and a fixed row index, construct a uninvariate from the corresponding value + * @brief For a fixed row index and each polynomial, construct univariates from the corresponding value * from each instance. * - * @example if the prover polynomia index is 1 and the row index is 2, and there are 4 instances visually we have + * @example if the row index is 2, and there are 4 instances visually we have * * Instance 0 Instance 1 Instance 2 Instance 3 * q_c q_l q_r ... q_c q_l q_r ... q_c q_l q_r ... q_c q_l q_r ... * * * * * * * * * * * * * * * * * * - * * a * b * c * d + * a_1 a_2 a_3 ... b_1 b_2 b_3 ... c_1 c_2 c_3 ... d_1 d_2 d_3 ... * * * * * * * * * * - * and the function returns the univariate {a, b, c, d} + * and the function returns the univariates [{a_1, b_1, c_1, d_1}, {a_2, b_2, c_2, d_2}, ...] * - * @param entity_idx A fixed column position in several execution traces. - * @param row_idx A fixed row position in several execution - * @return Univariate The univariate whose extensions will be used to construct the combiner. + * @param row_idx A fixed row position in several execution traces + * @return The univariates whose extensions will be used to construct the combiner. */ - Univariate row_to_univariate(const size_t prover_polynomial_idx, const size_t row_idx) const + std::vector> row_to_univariates(size_t row_idx) const { - Univariate result; + auto instance_polynomial_views = get_polynomial_pointer_views(); + std::vector> results; + // Initialize to our amount of columns + results.resize(instance_polynomial_views[0].size()); size_t instance_idx = 0; - for (auto& instance : _data) { - result.evaluations[instance_idx] = instance->prover_polynomials._data[prover_polynomial_idx][row_idx]; + // Iterate instances + for (auto& pointer_view : instance_polynomial_views) { + // Iterate columns + for (auto [result, poly_ptr] : zip_view(results, pointer_view)) { + // Assign row for each instance + result.evaluations[instance_idx] = (*poly_ptr)[row_idx]; + } instance_idx++; } - return result; + return results; + } + + private: + auto get_polynomial_pointer_views() const + { + // As a practical measure, get the first instance's pointer view to deduce the vector type + std::vector pointer_views{ _data[0]->prover_polynomials.pointer_view() }; + // complete the views, starting from the second item + for (size_t i = 1; i < NUM; i++) { + pointer_views.push_back(_data[i]->prover_polynomials.pointer_view()); + } + return pointer_views; } }; @@ -84,4 +104,4 @@ template struct VerifierInstances_ { } }; }; -} // namespace proof_system::honk \ No newline at end of file +} // namespace proof_system::honk diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index d64ae7629aa..c1341dcf24e 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -509,4 +509,4 @@ std::shared_ptr ProverInstance_::compu template class ProverInstance_; template class ProverInstance_; -} // namespace proof_system::honk \ No newline at end of file +} // namespace proof_system::honk diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp index 4bfc6d8f5f5..3d44d60b4db 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp @@ -115,7 +115,7 @@ template class SumcheckProver { zip_view(multivariate_evaluations.pointer_view(), partially_evaluated_polynomials.pointer_view())) { *eval = (*poly)[0]; } - transcript.send_to_verifier("Sumcheck:evaluations", multivariate_evaluations._data); + transcript.send_to_verifier("Sumcheck:evaluations", multivariate_evaluations); return { multivariate_challenge, multivariate_evaluations }; }; @@ -235,11 +235,16 @@ template class SumcheckVerifier { } // Final round - ClaimedEvaluations purported_evaluations = + ClaimedEvaluations purported_evaluations; + auto transcript_evaluations = transcript.template receive_from_prover>("Sumcheck:evaluations"); + for (auto [eval_ptr, transcript_eval] : + zip_view(purported_evaluations.pointer_view(), transcript_evaluations)) { + *eval_ptr = transcript_eval; + } FF full_honk_relation_purported_value = round.compute_full_honk_relation_purported_value( - purported_evaluations._data, relation_parameters, pow_univariate, alpha); + purported_evaluations, relation_parameters, pow_univariate, alpha); bool checked = false; if constexpr (IsRecursiveFlavor) { diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp index a641599f5fb..2918ea0e246 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp @@ -180,7 +180,8 @@ TEST_F(SumcheckTests, Prover) FF u_0 = output.challenge[0]; FF u_1 = output.challenge[1]; std::vector expected_values; - for (auto& polynomial : full_polynomials) { + for (auto* polynomial_ptr : full_polynomials.pointer_view()) { + auto& polynomial = *polynomial_ptr; // using knowledge of inputs here to derive the evaluation FF expected_lo = polynomial[0] * (FF(1) - u_0) + polynomial[1] * u_0; expected_lo *= (FF(1) - u_1);