Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
Public Member Functions | Public Attributes | Friends | List of all members
libsnark::tbcs_circuit Class Reference

#include <tbcs.hpp>

Public Member Functions

 tbcs_circuit ()
 
size_t num_inputs () const
 
size_t num_gates () const
 
size_t num_wires () const
 
std::vector< size_t > wire_depths () const
 
size_t depth () const
 
bool is_valid () const
 
bool is_satisfied (const tbcs_primary_input &primary_input, const tbcs_auxiliary_input &auxiliary_input) const
 
tbcs_variable_assignment get_all_wires (const tbcs_primary_input &primary_input, const tbcs_auxiliary_input &auxiliary_input) const
 
tbcs_variable_assignment get_all_outputs (const tbcs_primary_input &primary_input, const tbcs_auxiliary_input &auxiliary_input) const
 
void add_gate (const tbcs_gate &g)
 
void add_gate (const tbcs_gate &g, const std::string &annotation)
 
bool operator== (const tbcs_circuit &other) const
 
void print () const
 
void print_info () const
 

Public Attributes

size_t primary_input_size
 
size_t auxiliary_input_size
 
std::vector< tbcs_gategates
 

Friends

std::ostream & operator<< (std::ostream &out, const tbcs_circuit &circuit)
 
std::istream & operator>> (std::istream &in, tbcs_circuit &circuit)
 

Detailed Description

A TBCS circuit is a boolean circuit in which every gate has 2 inputs.

A TBCS circuit is satisfied by a TBCS variable assignment if every output evaluates to zero.

NOTE: The 0-th variable (i.e., "x_{0}") always represents the constant 1. Thus, the 0-th variable is not included in num_variables.

Definition at line 133 of file tbcs.hpp.

Constructor & Destructor Documentation

◆ tbcs_circuit()

libsnark::tbcs_circuit::tbcs_circuit ( )
inline

Definition at line 140 of file tbcs.hpp.

Member Function Documentation

◆ add_gate() [1/2]

void libsnark::tbcs_circuit::add_gate ( const tbcs_gate g)

Definition at line 264 of file tbcs.cpp.

265 {
266  assert(g.output == num_wires() + 1);
267  gates.emplace_back(g);
268 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_gate() [2/2]

void libsnark::tbcs_circuit::add_gate ( const tbcs_gate g,
const std::string &  annotation 
)

Definition at line 270 of file tbcs.cpp.

271 {
272  assert(g.output == num_wires() + 1);
273  gates.emplace_back(g);
274 #ifdef DEBUG
275  gate_annotations[g.output] = annotation;
276 #else
277  libff::UNUSED(annotation);
278 #endif
279 }
Here is the call graph for this function:

◆ depth()

size_t libsnark::tbcs_circuit::depth ( ) const

Definition at line 182 of file tbcs.cpp.

183 {
184  std::vector<size_t> all_depths = this->wire_depths();
185  return *(std::max_element(all_depths.begin(), all_depths.end()));
186 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_all_outputs()

tbcs_variable_assignment libsnark::tbcs_circuit::get_all_outputs ( const tbcs_primary_input primary_input,
const tbcs_auxiliary_input auxiliary_input 
) const

Definition at line 232 of file tbcs.cpp.

235 {
236  const tbcs_variable_assignment all_wires =
237  get_all_wires(primary_input, auxiliary_input);
238  tbcs_variable_assignment all_outputs;
239 
240  for (auto &g : gates) {
241  if (g.is_circuit_output) {
242  all_outputs.push_back(all_wires[g.output - 1]);
243  }
244  }
245 
246  return all_outputs;
247 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_all_wires()

tbcs_variable_assignment libsnark::tbcs_circuit::get_all_wires ( const tbcs_primary_input primary_input,
const tbcs_auxiliary_input auxiliary_input 
) const

Definition at line 211 of file tbcs.cpp.

214 {
215  assert(primary_input.size() == primary_input_size);
216  assert(auxiliary_input.size() == auxiliary_input_size);
217 
219  result.insert(result.end(), primary_input.begin(), primary_input.end());
220  result.insert(result.end(), auxiliary_input.begin(), auxiliary_input.end());
221 
222  assert(result.size() == num_inputs());
223 
224  for (auto &g : gates) {
225  const bool gate_output = g.evaluate(result);
226  result.push_back(gate_output);
227  }
228 
229  return result;
230 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_satisfied()

bool libsnark::tbcs_circuit::is_satisfied ( const tbcs_primary_input primary_input,
const tbcs_auxiliary_input auxiliary_input 
) const

Definition at line 249 of file tbcs.cpp.

252 {
253  const tbcs_variable_assignment all_outputs =
254  get_all_outputs(primary_input, auxiliary_input);
255  for (size_t i = 0; i < all_outputs.size(); ++i) {
256  if (all_outputs[i]) {
257  return false;
258  }
259  }
260 
261  return true;
262 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_valid()

bool libsnark::tbcs_circuit::is_valid ( ) const

The output wire of gates[i] must have index 1+num_inputs+i. (The '1+' accounts for the index of the constant wire.)

Gates must be topologically sorted.

Definition at line 188 of file tbcs.cpp.

189 {
190  for (size_t i = 0; i < num_gates(); ++i) {
195  if (gates[i].output != num_inputs() + i + 1) {
196  return false;
197  }
198 
202  if (gates[i].left_wire >= gates[i].output ||
203  gates[i].right_wire >= gates[i].output) {
204  return false;
205  }
206  }
207 
208  return true;
209 }
Here is the call graph for this function:

◆ num_gates()

size_t libsnark::tbcs_circuit::num_gates ( ) const

Definition at line 178 of file tbcs.cpp.

178 { return gates.size(); }
Here is the caller graph for this function:

◆ num_inputs()

size_t libsnark::tbcs_circuit::num_inputs ( ) const

Definition at line 173 of file tbcs.cpp.

174 {
176 }
Here is the caller graph for this function:

◆ num_wires()

size_t libsnark::tbcs_circuit::num_wires ( ) const

Definition at line 180 of file tbcs.cpp.

180 { return num_inputs() + num_gates(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator==()

bool libsnark::tbcs_circuit::operator== ( const tbcs_circuit other) const

Definition at line 281 of file tbcs.cpp.

282 {
283  return (
284  this->primary_input_size == other.primary_input_size &&
285  this->auxiliary_input_size == other.auxiliary_input_size &&
286  this->gates == other.gates);
287 }

◆ print()

void libsnark::tbcs_circuit::print ( ) const

Definition at line 311 of file tbcs.cpp.

312 {
313  libff::print_indent();
314  printf("General information about the circuit:\n");
315  this->print_info();
316  libff::print_indent();
317  printf("All gates:\n");
318  for (size_t i = 0; i < gates.size(); ++i) {
319  std::string annotation = "no annotation";
320 #ifdef DEBUG
321  auto it = gate_annotations.find(i);
322  if (it != gate_annotations.end()) {
323  annotation = it->second;
324  }
325 #endif
326  printf("Gate %zu (%s):\n", i, annotation.c_str());
327 #ifdef DEBUG
328  gates[i].print(variable_annotations);
329 #else
330  gates[i].print();
331 #endif
332  }
333 }
Here is the call graph for this function:

◆ print_info()

void libsnark::tbcs_circuit::print_info ( ) const

Definition at line 335 of file tbcs.cpp.

336 {
337  libff::print_indent();
338  printf("* Number of inputs: %zu\n", this->num_inputs());
339  libff::print_indent();
340  printf("* Number of gates: %zu\n", this->num_gates());
341  libff::print_indent();
342  printf("* Number of wires: %zu\n", this->num_wires());
343  libff::print_indent();
344  printf("* Depth: %zu\n", this->depth());
345 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wire_depths()

std::vector< size_t > libsnark::tbcs_circuit::wire_depths ( ) const

Definition at line 161 of file tbcs.cpp.

162 {
163  std::vector<size_t> depths(num_inputs(), 1);
164 
165  for (auto &g : gates) {
166  depths.emplace_back(
167  std::max(depths[g.left_wire], depths[g.right_wire]) + 1);
168  }
169 
170  return depths;
171 }
Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Function Documentation

◆ operator<<

std::ostream& operator<< ( std::ostream &  out,
const tbcs_circuit circuit 
)
friend

Definition at line 289 of file tbcs.cpp.

290 {
291  out << circuit.primary_input_size << "\n";
292  out << circuit.auxiliary_input_size << "\n";
293  libff::operator<<(out, circuit.gates);
294  out << OUTPUT_NEWLINE;
295 
296  return out;
297 }

◆ operator>>

std::istream& operator>> ( std::istream &  in,
tbcs_circuit circuit 
)
friend

Definition at line 299 of file tbcs.cpp.

300 {
301  in >> circuit.primary_input_size;
302  libff::consume_newline(in);
303  in >> circuit.auxiliary_input_size;
304  libff::consume_newline(in);
305  libff::operator>>(in, circuit.gates);
306  libff::consume_OUTPUT_NEWLINE(in);
307 
308  return in;
309 }

Member Data Documentation

◆ auxiliary_input_size

size_t libsnark::tbcs_circuit::auxiliary_input_size

Definition at line 137 of file tbcs.hpp.

◆ gates

std::vector<tbcs_gate> libsnark::tbcs_circuit::gates

Definition at line 138 of file tbcs.hpp.

◆ primary_input_size

size_t libsnark::tbcs_circuit::primary_input_size

Definition at line 136 of file tbcs.hpp.


The documentation for this class was generated from the following files:
libsnark::tbcs_circuit::gates
std::vector< tbcs_gate > gates
Definition: tbcs.hpp:138
libsnark::tbcs_circuit::depth
size_t depth() const
Definition: tbcs.cpp:182
libsnark::tbcs_circuit::get_all_outputs
tbcs_variable_assignment get_all_outputs(const tbcs_primary_input &primary_input, const tbcs_auxiliary_input &auxiliary_input) const
Definition: tbcs.cpp:232
libsnark::tbcs_circuit::num_gates
size_t num_gates() const
Definition: tbcs.cpp:178
libsnark::tbcs_circuit::wire_depths
std::vector< size_t > wire_depths() const
Definition: tbcs.cpp:161
libsnark::tbcs_circuit::primary_input_size
size_t primary_input_size
Definition: tbcs.hpp:136
libsnark::tbcs_circuit::num_wires
size_t num_wires() const
Definition: tbcs.cpp:180
libsnark::operator<<
std::ostream & operator<<(std::ostream &out, const tbcs_circuit &circuit)
Definition: tbcs.cpp:289
libsnark::tbcs_circuit::print_info
void print_info() const
Definition: tbcs.cpp:335
libsnark::tbcs_circuit::get_all_wires
tbcs_variable_assignment get_all_wires(const tbcs_primary_input &primary_input, const tbcs_auxiliary_input &auxiliary_input) const
Definition: tbcs.cpp:211
libsnark::tbcs_circuit::num_inputs
size_t num_inputs() const
Definition: tbcs.cpp:173
libsnark::tbcs_circuit::auxiliary_input_size
size_t auxiliary_input_size
Definition: tbcs.hpp:137
libsnark::tbcs_variable_assignment
std::vector< bool > tbcs_variable_assignment
Definition: tbcs.hpp:31
libsnark::operator>>
std::istream & operator>>(std::istream &in, tbcs_circuit &circuit)
Definition: tbcs.cpp:299