Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
circuit_builder_base.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
15#include <utility>
16
17#include <unordered_map>
18
19namespace bb {
20static constexpr uint32_t DUMMY_TAG = 0;
21
22template <typename FF_> class CircuitBuilderBase {
23 public:
24 using FF = FF_;
26
27 private:
28 // A container for all of the witness values used by the circuit
29 std::vector<FF> variables;
30
31 std::vector<uint32_t> public_inputs_;
32
33 bool public_inputs_finalized_ = false; // Addition of new public inputs disallowed after this is set to true.
34
35 // true if we have dummy witnesses (in the write_vk case)
37
38 // index of next variable in equivalence class (=REAL_VARIABLE if you're last)
39 std::vector<uint32_t> next_var_index;
40 // index of previous variable in equivalence class (=FIRST if you're in a cycle alone)
41 std::vector<uint32_t> prev_var_index;
42
43 bool _failed = false;
44 std::string _err;
45
46 static constexpr uint32_t REAL_VARIABLE = UINT32_MAX - 1;
47 static constexpr uint32_t FIRST_VARIABLE_IN_CLASS = UINT32_MAX - 2;
48
49 // Index at which we store a witness constrained to be equal to 0
50 uint32_t _zero_idx = 0;
51
52 protected:
53 std::unordered_map<uint32_t, std::string> variable_names;
54
55 void set_zero_idx(uint32_t value) { _zero_idx = value; }
56
57 public:
58 size_t num_gates = 0;
59
60 // The permutation on variable tags. See
61 // https://github.com/AztecProtocol/plonk-with-lookups-private/blob/new-stuff/GenPermuations.pdf
62 // DOCTODO(#231): replace with the relevant wiki link.
63 std::map<uint32_t, uint32_t> tau;
64
65 // The "real_variable_index" acts as a map from a "witness index" (e.g. the one stored by a stdlib object) to an
66 // index into the variables array. This extra layer of indirection is used to support copy constraints by allowing,
67 // for example, two witnesses with differing witness indices to have the same "real variable index" and thus the
68 // same witness value. If the witness is not involved in any copy constraints, then real_variable_index[index] ==
69 // index, i.e. it is the identity map.
70 std::vector<uint32_t> real_variable_index;
71 std::vector<uint32_t> real_variable_tags;
72 uint32_t current_tag = DUMMY_TAG;
73
74 public:
75 CircuitBuilderBase(size_t size_hint = 0, bool has_dummy_witnesses = false);
76
77 CircuitBuilderBase(const CircuitBuilderBase& other) = default;
78 CircuitBuilderBase(CircuitBuilderBase&& other) noexcept = default;
80 CircuitBuilderBase& operator=(CircuitBuilderBase&& other) noexcept = default;
81 virtual ~CircuitBuilderBase() = default;
82
84 bool operator==(const CircuitBuilderBase& other) const = default;
85
86 virtual size_t get_num_finalized_gates() const;
87 virtual size_t get_estimated_num_finalized_gates() const;
88 virtual void print_num_estimated_finalized_gates() const;
89 virtual size_t get_num_variables() const;
90
91 // Non-owning getter for the index at which a fixed witness 0 is stored
92 uint32_t zero_idx() const { return _zero_idx; }
93
94 virtual void create_add_gate(const add_triple_<FF>& in) = 0;
95 virtual void create_mul_gate(const mul_triple_<FF>& in) = 0;
96 virtual void create_bool_gate(const uint32_t a) = 0;
97 virtual void create_poly_gate(const poly_triple_<FF>& in) = 0;
98 virtual size_t get_num_constant_gates() const = 0;
99
100 const std::vector<FF>& get_variables() const { return variables; }
101
109 uint32_t get_first_variable_in_class(uint32_t index) const;
116 void update_real_variable_indices(uint32_t index, uint32_t new_real_index);
117
124 inline FF get_variable(const uint32_t index) const
125 {
127 return variables[real_variable_index[index]];
128 }
129
141 inline void set_variable(const uint32_t index, const FF& value)
142 {
145 }
146
155 inline const FF& get_variable_reference(const uint32_t index) const
156 {
157 ASSERT_DEBUG(variables.size() > index);
158 return variables[real_variable_index[index]];
159 }
160
161 uint32_t get_public_input_index(const uint32_t witness_index) const;
162
163 FF get_public_input(const uint32_t index) const;
164
165 const std::vector<uint32_t>& public_inputs() const { return public_inputs_; };
166
173
180 void initialize_public_inputs(const std::vector<uint32_t>& public_inputs) { this->public_inputs_ = public_inputs; }
181
188 virtual uint32_t add_variable(const FF& in);
189
197 virtual void set_variable_name(uint32_t index, const std::string& name);
198
204 virtual msgpack::sbuffer export_circuit();
205
215 virtual uint32_t add_public_variable(const FF& in);
216
223 virtual uint32_t set_public_input(uint32_t witness_index);
224 virtual void assert_equal(uint32_t a_idx, uint32_t b_idx, std::string const& msg = "assert_equal");
225
226 size_t get_circuit_subgroup_size(size_t num_gates) const;
227
228 size_t num_public_inputs() const { return public_inputs_.size(); }
229
230 // Check whether each variable index points to a witness in the composer
231 //
232 // Any variable whose index does not point to witness value is deemed invalid.
233 //
234 // This implicitly checks whether a variable index
235 // is equal to IS_CONSTANT; assuming that we will never have
236 // uint32::MAX number of variables
237 void assert_valid_variables(const std::vector<uint32_t>& variable_indices);
238
239 bool failed() const;
240 const std::string& err() const;
241
242 void failure(std::string msg);
243};
244
296} // namespace bb
297
298// TODO(#217)(Cody): This will need updating based on the approach we take to ensure no multivariate is zero.
#define ASSERT_DEBUG(expression,...)
Definition assert.hpp:54
std::vector< uint32_t > public_inputs_
virtual size_t get_num_finalized_gates() const
uint32_t get_public_input_index(const uint32_t witness_index) const
void set_variable(const uint32_t index, const FF &value)
Set the value of the variable pointed to by a witness index.
const std::string & err() const
virtual uint32_t add_variable(const FF &in)
virtual void create_add_gate(const add_triple_< FF > &in)=0
virtual void create_mul_gate(const mul_triple_< FF > &in)=0
CircuitBuilderBase(const CircuitBuilderBase &other)=default
void initialize_public_inputs(const std::vector< uint32_t > &public_inputs)
Directly initialize the public inputs vector.
CircuitBuilderBase & operator=(const CircuitBuilderBase &other)=default
virtual msgpack::sbuffer export_circuit()
bool operator==(const CircuitBuilderBase &other) const =default
static constexpr uint32_t FIRST_VARIABLE_IN_CLASS
virtual void create_poly_gate(const poly_triple_< FF > &in)=0
virtual uint32_t set_public_input(uint32_t witness_index)
Make a witness variable public.
const std::vector< uint32_t > & public_inputs() const
std::unordered_map< uint32_t, std::string > variable_names
void finalize_public_inputs()
Set the public_inputs_finalized_ to true to prevent any new public inputs from being added.
std::vector< uint32_t > prev_var_index
virtual size_t get_estimated_num_finalized_gates() const
void assert_valid_variables(const std::vector< uint32_t > &variable_indices)
CircuitBuilderBase & operator=(CircuitBuilderBase &&other) noexcept=default
FF get_public_input(const uint32_t index) const
const std::vector< FF > & get_variables() const
std::vector< uint32_t > next_var_index
std::vector< uint32_t > real_variable_tags
virtual void assert_equal(uint32_t a_idx, uint32_t b_idx, std::string const &msg="assert_equal")
virtual size_t get_num_variables() const
FF get_variable(const uint32_t index) const
Get the value of the variable v_{index}.
virtual ~CircuitBuilderBase()=default
virtual void print_num_estimated_finalized_gates() const
virtual size_t get_num_constant_gates() const =0
virtual void create_bool_gate(const uint32_t a)=0
virtual void set_variable_name(uint32_t index, const std::string &name)
CircuitBuilderBase(CircuitBuilderBase &&other) noexcept=default
uint32_t get_first_variable_in_class(uint32_t index) const
void update_real_variable_indices(uint32_t index, uint32_t new_real_index)
const FF & get_variable_reference(const uint32_t index) const
static constexpr uint32_t REAL_VARIABLE
std::map< uint32_t, uint32_t > tau
std::vector< uint32_t > real_variable_index
virtual uint32_t add_public_variable(const FF &in)
void set_zero_idx(uint32_t value)
size_t get_circuit_subgroup_size(size_t num_gates) const
FF a
Entry point for Barretenberg command-line interface.
typename Flavor::FF FF
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Serialized state of a circuit.
std::vector< std::vector< std::vector< FF > > > selectors
std::vector< uint32_t > real_variable_index
std::unordered_map< uint32_t, uint64_t > range_tags
std::unordered_map< uint32_t, std::string > vars_of_interest
std::vector< std::vector< uint32_t > > ram_states
std::vector< std::vector< std::array< uint32_t, 2 > > > rom_states
MSGPACK_FIELDS(modulus, public_inps, vars_of_interest, variables, selectors, wires, real_variable_index, lookup_tables, real_variable_tags, range_tags, rom_records, rom_states, ram_records, ram_states, circuit_finalized)
std::vector< std::vector< std::vector< uint32_t > > > ram_records
std::vector< std::vector< std::vector< uint32_t > > > rom_records
std::vector< std::vector< std::vector< FF > > > lookup_tables
std::vector< uint32_t > real_variable_tags
std::vector< uint32_t > public_inps
std::vector< std::vector< std::vector< uint32_t > > > wires