Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
smt_polynomials.test.cpp
Go to the documentation of this file.
3
6
7#include <gtest/gtest.h>
8
9using namespace bb;
10using namespace smt_circuit;
11
16
17msgpack::sbuffer create_polynomial_evaluation_circuit(size_t n, bool pub_coeffs)
18{
20
22 for (size_t i = 0; i < n; i++) {
23 if (pub_coeffs) {
24 coeffs.emplace_back(pub_witness_t(&builder, fr::random_element()));
25 } else {
26 coeffs.emplace_back(witness_t(&builder, fr::random_element()));
27 }
28 builder.set_variable_name(coeffs.back().get_witness_index(), "coeff_" + std::to_string(i));
29 }
30
31 field_t z(witness_t(&builder, 10));
32 builder.set_variable_name(z.get_witness_index(), "point");
33
35
36 for (size_t i = 0; i < n; i++) {
37 res = res * z + coeffs[i];
38 }
39 builder.set_variable_name(res.get_witness_index(), "result");
40
41 info("evaluation at point ", z, ": ", res);
42 info("gates: ", builder.num_gates);
43 info("variables: ", builder.get_num_variables());
44 info("public inputs: ", builder.num_public_inputs());
45
46 return builder.export_circuit();
47}
48
50{
51 STerm point = c["point"];
52 STerm result = c["result"];
53 STerm ev = c["zero"];
54 for (size_t i = 0; i < n; i++) {
55 ev = ev * point + c["coeff_" + std::to_string(i)];
56 }
57 return ev;
58}
59
60void model_variables(UltraCircuit& c, Solver* s, STerm& evaluation)
61{
63 terms.insert({ "point", c["point"] });
64 terms.insert({ "result", c["result"] });
65 terms.insert({ "evaluation", evaluation });
66
67 auto values = s->model(terms);
68
69 info("point = ", values["point"]);
70 info("circuit_result = ", values["result"]);
71 info("function_evaluation = ", values["evaluation"]);
72}
73
74TEST(PolynomialEvaluation, public)
75{
76 size_t n = 40;
78
79 CircuitSchema circuit_info = unpack_from_buffer(buf);
80 Solver s(circuit_info.modulus);
81 UltraCircuit circuit(circuit_info, &s, TermType::FFTerm);
82 STerm ev = direct_polynomial_evaluation(circuit, n);
83 ev != circuit["result"];
84
85 bool res = smt_timer(&s);
86 ASSERT_FALSE(res);
87}
88
89TEST(PolynomialEvaluation, private)
90{
91 size_t n = 40;
93
94 CircuitSchema circuit_info = unpack_from_buffer(buf);
95 Solver s(circuit_info.modulus);
96 UltraCircuit circuit(circuit_info, &s, TermType::FFTerm);
97 STerm ev = direct_polynomial_evaluation(circuit, n);
98 ev != circuit["result"];
99
100 bool res = smt_timer(&s);
101 ASSERT_FALSE(res);
102 info("Gates: ", circuit.get_num_gates());
103 info("Result: ", s.getResult());
104}
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:59
uint32_t get_witness_index() const
Get the witness index of the current field element.
Definition field.hpp:461
Symbolic Circuit class for Standard Circuit Builder.
size_t get_num_gates() const
Get the num gates object.
Class for the solver.
Definition solver.hpp:80
const char * getResult() const
Definition solver.hpp:162
std::unordered_map< std::string, std::string > model(std::unordered_map< std::string, cvc5::Term > &terms) const
Definition solver.cpp:80
Symbolic term element class.
Definition term.hpp:114
void info(Args... args)
Definition log.hpp:70
AluTraceBuilder builder
Definition alu.test.cpp:123
uint8_t const * buf
Definition data_store.hpp:9
Entry point for Barretenberg command-line interface.
TEST(MegaCircuitBuilder, CopyConstructor)
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
CircuitSchema unpack_from_buffer(const msgpack::sbuffer &buf)
Get the CircuitSchema object.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
msgpack::sbuffer create_polynomial_evaluation_circuit(size_t n, bool pub_coeffs)
stdlib::witness_t< Builder > witness_t
stdlib::public_witness_t< Builder > pub_witness_t
void model_variables(UltraCircuit &c, Solver *s, STerm &evaluation)
STerm direct_polynomial_evaluation(UltraCircuit &c, size_t n)
bool smt_timer(smt_solver::Solver *s)
Get the solver result and amount of time that it took to solve.
Definition smt_util.cpp:297
static field random_element(numeric::RNG *engine=nullptr) noexcept
Serialized state of a circuit.