Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
circuit_base.cpp
Go to the documentation of this file.
1#include "circuit_base.hpp"
2
3namespace smt_circuit {
4
5CircuitBase::CircuitBase(std::unordered_map<uint32_t, std::string>& variable_names,
6 std::vector<bb::fr>& variables,
7 std::vector<uint32_t>& public_inps,
8 std::vector<uint32_t>& real_variable_index,
9 std::vector<uint32_t>& real_variable_tags,
10 Solver* solver,
11 TermType type,
12 const std::string& tag,
13 bool enable_optimizations)
14 : variables(variables)
15 , variable_names(variable_names)
16 , real_variable_index(real_variable_index)
17 , real_variable_tags(real_variable_tags)
18 , enable_optimizations(enable_optimizations)
19 , solver(solver)
20 , type(type)
21 , tag(tag)
22{
23 if (!this->tag.empty() && tag[0] != '_') {
24 this->tag = "_" + this->tag;
25 }
26
27 for (auto& x : variable_names) {
28 variable_names_inverse.insert({ x.second, x.first });
29 }
30
31 this->init();
32
33 for (const auto& i : public_inps) {
34 this->symbolic_vars[this->real_variable_index[i]] == this->variables[i];
35 this->public_inps.insert(i);
36 }
37}
38
45{
46 size_t num_vars = this->variables.size();
47
48 for (uint32_t i = 0; i < num_vars; i++) {
49 uint32_t real_idx = this->real_variable_index[i];
50 if (this->symbolic_vars.contains(real_idx)) {
51 continue;
52 }
53
54 std::string name = variable_names.contains(real_idx) ? variable_names[real_idx] : "var_" + std::to_string(i);
55 name += this->tag;
56 symbolic_vars.insert({ real_idx, STerm::Var(name, this->solver, this->type) });
57
58 optimized.insert({ real_idx, true });
59 }
60
61 this->symbolic_vars[this->variable_names_inverse["zero"]] == bb::fr::zero();
62}
63
70STerm CircuitBase::operator[](const std::string& name)
71{
72 if (!this->variable_names_inverse.contains(name)) {
73 throw std::invalid_argument("No such an item `" + name + "` in vars or it vas not declared as interesting");
74 }
75 uint32_t idx = this->variable_names_inverse[name];
76 return this->symbolic_vars[idx];
77}
78
79} // namespace smt_circuit
std::vector< uint32_t > real_variable_index
std::unordered_set< uint32_t > public_inps
std::unordered_map< uint32_t, bool > optimized
std::vector< bb::fr > variables
STerm operator[](const std::string &name)
Returns a previously named symbolic variable.
std::unordered_map< uint32_t, std::string > variable_names
CircuitBase(std::unordered_map< uint32_t, std::string > &variable_names, std::vector< bb::fr > &variables, std::vector< uint32_t > &public_inps, std::vector< uint32_t > &real_variable_index, std::vector< uint32_t > &real_variable_tags, Solver *solver, TermType type, const std::string &tag="", bool enable_optimizations=true)
std::unordered_map< std::string, uint32_t > variable_names_inverse
std::unordered_map< uint32_t, STerm > symbolic_vars
Class for the solver.
Definition solver.hpp:80
Symbolic term element class.
Definition term.hpp:114
static STerm Var(const std::string &name, Solver *slv, TermType type=TermType::FFTerm)
Definition term.cpp:14
TermType
Allows to define three types of symbolic terms STerm - Symbolic Variables acting like a Finte Field e...
Definition term.hpp:15
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
static constexpr field zero()