7#include <gtest/gtest.h>
20 Fq op_accumulator =
Fq(0);
21 Fq p_x_accumulator =
Fq(0);
22 Fq p_y_accumulator =
Fq(0);
23 Fq z_1_accumulator =
Fq(0);
24 Fq z_2_accumulator =
Fq(0);
27 const auto& ultra_ops = op_queue->get_ultra_ops();
28 for (
const auto& ultra_op : ultra_ops) {
29 if (ultra_op.op_code.is_random_op || ultra_op.op_code.value() == 0) {
32 op_accumulator = op_accumulator * x_inv + ultra_op.op_code.value();
33 const auto [x_fq, y_fq] = ultra_op.get_base_point_standard_form();
34 p_x_accumulator = p_x_accumulator * x_inv + x_fq;
35 p_y_accumulator = p_y_accumulator * x_inv + y_fq;
36 z_1_accumulator = z_1_accumulator * x_inv +
uint256_t(ultra_op.z_1);
37 z_2_accumulator = z_2_accumulator * x_inv +
uint256_t(ultra_op.z_2);
43 Fq total = z_2_accumulator;
44 total *= batching_challenge;
45 total += z_1_accumulator;
46 total *= batching_challenge;
47 total += p_y_accumulator;
48 total *= batching_challenge;
49 total += p_x_accumulator;
50 total *= batching_challenge;
51 total += op_accumulator;
65 auto P1 = point::random_element();
66 auto P2 = point::random_element();
67 auto z = scalar::random_element();
71 op_queue->no_op_ultra_only();
72 op_queue->random_op_ultra_only();
73 op_queue->random_op_ultra_only();
74 op_queue->random_op_ultra_only();
75 op_queue->add_accumulate(P1);
76 op_queue->mul_accumulate(P2, z);
77 op_queue->eq_and_reset();
80 op_queue->add_accumulate(P1);
81 op_queue->mul_accumulate(P2, z);
82 op_queue->add_accumulate(P1);
83 op_queue->mul_accumulate(P2, z);
84 op_queue->eq_and_reset();
87 op_queue->random_op_ultra_only();
88 op_queue->random_op_ultra_only();
109 op_queue->no_op_ultra_only();
110 op_queue->random_op_ultra_only();
111 op_queue->random_op_ultra_only();
112 op_queue->random_op_ultra_only();
113 op_queue->eq_and_reset();
115 op_queue->random_op_ultra_only();
116 op_queue->random_op_ultra_only();
132 auto P1 = point::random_element();
133 auto P2 = point::random_element();
136 op_queue->no_op_ultra_only();
137 op_queue->random_op_ultra_only();
138 op_queue->random_op_ultra_only();
139 op_queue->random_op_ultra_only();
140 op_queue->add_accumulate(P1);
141 op_queue->add_accumulate(P2);
142 op_queue->add_accumulate(P1);
143 op_queue->eq_and_reset();
145 op_queue->random_op_ultra_only();
146 op_queue->random_op_ultra_only();
167 auto P = point::random_element();
168 auto z1 = scalar::random_element();
169 auto z2 = scalar::random_element();
172 op_queue->no_op_ultra_only();
173 op_queue->random_op_ultra_only();
174 op_queue->random_op_ultra_only();
175 op_queue->random_op_ultra_only();
176 op_queue->mul_accumulate(P, z1);
177 op_queue->mul_accumulate(P, z2);
178 op_queue->eq_and_reset();
180 op_queue->random_op_ultra_only();
181 op_queue->random_op_ultra_only();
201 auto P = point::random_element();
204 op_queue->no_op_ultra_only();
205 op_queue->random_op_ultra_only();
206 op_queue->random_op_ultra_only();
207 op_queue->random_op_ultra_only();
208 op_queue->add_accumulate(P);
209 op_queue->no_op_ultra_only();
210 op_queue->no_op_ultra_only();
211 op_queue->add_accumulate(P);
212 op_queue->no_op_ultra_only();
213 op_queue->eq_and_reset();
215 op_queue->random_op_ultra_only();
216 op_queue->random_op_ultra_only();
236 auto P_infinity = point::infinity();
239 op_queue->no_op_ultra_only();
240 op_queue->random_op_ultra_only();
241 op_queue->random_op_ultra_only();
242 op_queue->random_op_ultra_only();
243 op_queue->add_accumulate(P_infinity);
244 op_queue->eq_and_reset();
246 op_queue->random_op_ultra_only();
247 op_queue->random_op_ultra_only();
268 auto P = point::random_element();
269 auto zero = scalar::zero();
272 op_queue->no_op_ultra_only();
273 op_queue->random_op_ultra_only();
274 op_queue->random_op_ultra_only();
275 op_queue->random_op_ultra_only();
276 op_queue->mul_accumulate(P, zero);
277 op_queue->eq_and_reset();
279 op_queue->random_op_ultra_only();
280 op_queue->random_op_ultra_only();
302 op_queue->no_op_ultra_only();
303 op_queue->random_op_ultra_only();
304 op_queue->random_op_ultra_only();
305 op_queue->random_op_ultra_only();
308 for (
size_t i = 0; i < 20; ++i) {
309 auto P = point::random_element();
310 auto z = scalar::random_element();
311 op_queue->add_accumulate(P);
312 op_queue->mul_accumulate(P, z);
315 op_queue->eq_and_reset();
317 op_queue->random_op_ultra_only();
318 op_queue->random_op_ultra_only();
339 auto P = point::random_element();
340 auto z = scalar::random_element();
346 op_queue1->no_op_ultra_only();
347 op_queue1->random_op_ultra_only();
348 op_queue1->random_op_ultra_only();
349 op_queue1->random_op_ultra_only();
350 op_queue1->add_accumulate(P);
351 op_queue1->mul_accumulate(P, z);
352 op_queue1->eq_and_reset();
354 op_queue1->random_op_ultra_only();
355 op_queue1->random_op_ultra_only();
363 op_queue2->no_op_ultra_only();
364 op_queue2->random_op_ultra_only();
365 op_queue2->random_op_ultra_only();
366 op_queue2->random_op_ultra_only();
367 op_queue2->add_accumulate(P);
368 op_queue2->mul_accumulate(P, z);
369 op_queue2->eq_and_reset();
371 op_queue2->random_op_ultra_only();
372 op_queue2->random_op_ultra_only();
378 EXPECT_EQ(result1, result2);
The unified interface for check circuit functionality implemented in the specialized CircuitChecker c...
static const size_t OP_QUEUE_SIZE
TranslatorCircuitBuilder creates a circuit that evaluates the correctness of the evaluation of EccOpQ...
static Fq get_computation_result(const Builder &circuit)
Get the result of accumulation, stored as 4 binary limbs in the first row of the circuit.
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
group_elements::affine_element< Fq, Fr, Params > affine_element
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
field< Bn254FqParams > fq
field< Bn254FrParams > fr
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
curve::BN254::BaseField Fq