8#include <gtest/gtest.h>
22template <
size_t LOG_MINI>
void test_translator_selector_evaluations()
28 constexpr size_t D = Evaluations::LOG_N;
29 constexpr size_t N = 1UL << D;
30 constexpr size_t MINI = 1UL << LOG_MINI;
31 constexpr size_t NUM_MASKED_ROWS_END = Evaluations::NUM_MASKED_ROWS_END;
32 constexpr size_t RESULT_ROW = Evaluations::RESULT_ROW;
33 constexpr size_t RANDOMNESS_START = Evaluations::RANDOMNESS_START;
34 constexpr size_t CONCATENATION_GROUP_SIZE = Evaluations::CONCATENATION_GROUP_SIZE;
35 constexpr size_t MAX_RANDOM_VALUES_PER_ORDERED = Evaluations::MAX_RANDOM_VALUES_PER_ORDERED;
36 constexpr size_t MINI_WITHOUT_MASKING = MINI - NUM_MASKED_ROWS_END;
45 auto evals = Evaluations::compute(u);
48 auto make_and_eval = [&](
auto set_fn) ->
FF {
51 return poly.evaluate_mle(u);
55 EXPECT_EQ(make_and_eval([](Poly& p) { p.at(0) = 1; }), evals.lagrange_first);
58 EXPECT_EQ(make_and_eval([](Poly& p) { p.at(N - 1) = 1; }), evals.lagrange_last);
61 EXPECT_EQ(make_and_eval([](Poly& p) { p.at(RESULT_ROW) = 1; }), evals.lagrange_result_row);
64 EXPECT_EQ(make_and_eval([](Poly& p) { p.at(MINI_WITHOUT_MASKING - 1) = 1; }), evals.lagrange_last_in_minicircuit);
67 EXPECT_EQ(make_and_eval([](Poly& p) { p.at(N - MAX_RANDOM_VALUES_PER_ORDERED - 1) = 1; }),
68 evals.lagrange_real_last);
71 EXPECT_EQ(make_and_eval([](Poly& p) {
72 for (
size_t i = N - MAX_RANDOM_VALUES_PER_ORDERED; i < N; i++) {
76 evals.lagrange_ordered_masking);
79 EXPECT_EQ(make_and_eval([](Poly& p) {
80 for (
size_t j = 0; j < CONCATENATION_GROUP_SIZE; j++) {
81 for (
size_t k = MINI - NUM_MASKED_ROWS_END; k < MINI; k++) {
82 p.at(j * MINI + k) = 1;
86 evals.lagrange_masking);
89 EXPECT_EQ(make_and_eval([](Poly& p) {
90 for (
size_t i = RANDOMNESS_START; i < RESULT_ROW; i++) {
93 for (
size_t i = MINI_WITHOUT_MASKING; i < MINI; i++) {
97 evals.lagrange_mini_masking);
100 EXPECT_EQ(make_and_eval([](Poly& p) {
101 for (
size_t i = RESULT_ROW; i < MINI_WITHOUT_MASKING; i += 2) {
105 evals.lagrange_even_in_minicircuit);
108 EXPECT_EQ(make_and_eval([](Poly& p) {
109 for (
size_t i = RESULT_ROW; i < MINI_WITHOUT_MASKING; i += 2) {
113 evals.lagrange_odd_in_minicircuit);
118TEST(TranslatorSelectors, SmallCircuit)
121 test_translator_selector_evaluations<7>();
124TEST(TranslatorSelectors, RealCircuit)
127 test_translator_selector_evaluations<13>();
143 constexpr size_t D = NativeEvaluations::LOG_N;
148 std::vector<fr> u_native(D);
150 for (
size_t k = 0; k < D; k++) {
156 auto native_evals = NativeEvaluations::compute(u_native);
159 size_t gates_before =
builder.num_gates();
160 auto circuit_evals = CircuitEvaluations::compute(u_circuit);
161 size_t gates_after =
builder.num_gates();
162 size_t gates_added = gates_after - gates_before;
164 info(
"TranslatorSelectorEvaluations in-circuit cost (",
165 Builder::NAME_STRING,
173 EXPECT_EQ(circuit_evals.lagrange_first.get_value(), native_evals.lagrange_first);
174 EXPECT_EQ(circuit_evals.lagrange_last.get_value(), native_evals.lagrange_last);
175 EXPECT_EQ(circuit_evals.lagrange_odd_in_minicircuit.get_value(), native_evals.lagrange_odd_in_minicircuit);
176 EXPECT_EQ(circuit_evals.lagrange_even_in_minicircuit.get_value(), native_evals.lagrange_even_in_minicircuit);
177 EXPECT_EQ(circuit_evals.lagrange_result_row.get_value(), native_evals.lagrange_result_row);
178 EXPECT_EQ(circuit_evals.lagrange_last_in_minicircuit.get_value(), native_evals.lagrange_last_in_minicircuit);
179 EXPECT_EQ(circuit_evals.lagrange_masking.get_value(), native_evals.lagrange_masking);
180 EXPECT_EQ(circuit_evals.lagrange_mini_masking.get_value(), native_evals.lagrange_mini_masking);
181 EXPECT_EQ(circuit_evals.lagrange_real_last.get_value(), native_evals.lagrange_real_last);
182 EXPECT_EQ(circuit_evals.lagrange_ordered_masking.get_value(), native_evals.lagrange_ordered_masking);
185TEST(TranslatorSelectors, CircuitCostUltra)
187 test_translator_selector_circuit_cost<UltraCircuitBuilder, 13>();
190TEST(TranslatorSelectors, CircuitCostMega)
192 test_translator_selector_circuit_cost<MegaCircuitBuilder, 13>();
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
stdlib::witness_t< Builder > witness_ct
stdlib::field_t< Builder > field_ct
Entry point for Barretenberg command-line interface.
field< Bn254FrParams > fr
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Evaluates the 10 structured Translator precomputed selectors at a sumcheck challenge point.
static field random_element(numeric::RNG *engine=nullptr) noexcept
void test_translator_selector_circuit_cost()
Measure the in-circuit cost of computing all 11 Translator selector evaluations.