Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
solver.test.cpp
Go to the documentation of this file.
1#include "solver.hpp"
3
4#include <gtest/gtest.h>
5
6using namespace smt_terms;
7
8// Find a point of order 3 on y^2 = x^3 + 2 mod 101 curve
9// Terrible when using ffiterm
10TEST(Solver, FFTerm_use_case)
11{
12 Solver s("101", default_solver_config, 10);
13 STerm x = FFVar("x", &s);
14 STerm y = FFVar("y", &s);
15
16 y* y == x* x* x + bb::fr(2);
17 STerm l = (3 * x * x) / (bb::fr(2) * y);
18 STerm xr = l * l - x - x;
19 STerm yr = l * (x - xr) - y;
20 x == xr;
21 y == -yr;
22 bool res = s.check();
23 ASSERT_TRUE(res);
24
25 std::unordered_map<std::string, cvc5::Term> vars = { { "Gx", x }, { "Gy", y } };
27
28 std::vector<cvc5::Term> terms = { x, y };
30 ASSERT_EQ(mvars["Gx"], vvars["x"]);
31 ASSERT_EQ(mvars["Gy"], vvars["y"]);
32}
33
34TEST(Solver, FFITerm_use_case)
35{
36 Solver s("bce4e33b636e0cf38d13a55c3");
37 STerm x = FFIVar("x", &s);
38 STerm y = FFIVar("y", &s);
39
41 x <= bb::fr(2).pow(32);
42 x >= bb::fr(2).pow(10);
43 (x + y) == a;
44 bool res = s.check();
45 ASSERT_TRUE(res);
46
47 std::vector<cvc5::Term> terms = { x, y };
49 info(vvars["x"]);
50 info("+");
51 info(vvars["y"]);
52 info("=");
53 info(s[STerm(a, &s, TermType::FFITerm)]);
54}
55
56TEST(Solver, single_value_model)
57{
58 Solver s("bce4e33b636e0cf38d13a55c3");
59 STerm x = FFIVar("x", &s);
60 STerm y = FFIVar("y", &s);
61 STerm z = x + y;
62 z == bb::fr(3);
63
64 bool res = s.check();
65 ASSERT_TRUE(res);
66
67 info("x: ", s[x]);
68 info("y: ", s[y]);
69 info("z: ", s[z]);
70}
71
72TEST(Solver, human_readable_constraints_FFTerm)
73{
74 Solver s("101", default_solver_config, 10);
75 STerm x = FFVar("x", &s);
76 STerm y = FFVar("y", &s);
77 y* y == x* x* x + bb::fr(2);
78 STerm l = (3 * x * x) / (bb::fr(2) * y);
79 STerm xr = l * l - x - x;
80 STerm yr = l * (x - xr) - y;
81 x == xr;
82 y == -yr;
84}
85
86TEST(Solver, human_readable_constraints_FFITerm)
87{
88 Solver s("101", default_solver_config, 10);
89 STerm x = FFIVar("x", &s);
90 STerm y = FFIVar("y", &s);
91 y* y == x* x* x + bb::fr(2);
92 STerm l = (3 * x * x) / (bb::fr(2) * y);
93 STerm xr = l * l - x - x;
94 STerm yr = l * (x - xr) - y;
95 x == xr;
96 y == -yr;
98}
Class for the solver.
Definition solver.hpp:80
void print_assertions()
Definition solver.cpp:421
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
FF a
field< Bn254FrParams > fr
Definition fr.hpp:174
const SolverConfiguration default_solver_config
Definition solver.hpp:37
STerm FFVar(const std::string &name, Solver *slv)
Definition term.cpp:570
STerm FFIVar(const std::string &name, Solver *slv)
Definition term.cpp:585
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
TEST(Solver, FFTerm_use_case)
BB_INLINE constexpr field pow(const uint256_t &exponent) const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept