isomatch
circuitTree.h
Go to the documentation of this file.
1 #pragma once
2 #include <exception>
3 #include <ostream>
4 #include <iterator>
5 #include <typeinfo>
6 
7 #include "signatureConstants.h"
8 #include "wireId.h"
9 
10 class CircuitTree {
11  protected:
13  class InnerIoIter :
14  public std::iterator<std::forward_iterator_tag, WireId*>
15  {
16  public:
17  virtual ~InnerIoIter() {};
18  virtual void operator++() {};
19  bool operator==(InnerIoIter& oth) {
20  return typeid(*this) == typeid(oth) && equal(oth);
21  }
22  bool operator!=(InnerIoIter& oth) {
23  return !(operator==(oth));
24  }
25  virtual WireId* operator*() { return nullptr; }
26  virtual InnerIoIter* clone() const {
27  return new InnerIoIter(*this);
28  }
29  protected:
34  virtual bool equal(const InnerIoIter&) const {
35  return true;
36  }
37  };
38 
39  public:
40  enum CircType {
46  };
47 
49  class IoIter {
50  public:
51  IoIter() : inner(nullptr) {}
52  IoIter(InnerIoIter* ptr) : inner(ptr) {}
53  ~IoIter() { delete inner; }
54 
55  IoIter(const IoIter& oth) :
56  inner(oth.inner->clone()) {}
57  IoIter& operator=(const IoIter& oth) {
58  delete inner;
59  inner = oth.inner->clone();
60  return *this;
61  }
62 
64  ++(*inner);
65  return *this;
66  }
68  IoIter out(*this);
69  operator++();
70  return out;
71  }
72  WireId* operator*() const { return *(*inner); }
73 
74  bool operator==(const IoIter& oth) const {
75  return inner == oth.inner || (*inner) == (*oth.inner);
76  }
77 
78  bool operator!=(const IoIter& oth) const {
79  return !(operator==(oth));
80  }
81 
82  private:
83  InnerIoIter* inner;
84  };
85 
86  CircuitTree();
87  virtual ~CircuitTree();
88 
92  virtual CircType circType() const = 0;
93 
101  sign_t sign(int level=2);
102 
108  bool equals(CircuitTree* oth);
109 
113  bool operator==(const CircuitTree& oth) const {
114  return circuitId == oth.circuitId;
115  }
116 
120 
122  size_t id() const { return circuitId; }
123 
125  virtual IoIter inp_begin() const = 0;
126 
128  IoIter inp_end() const { return out_begin(); }
129 
131  virtual IoIter out_begin() const = 0;
132 
134  virtual IoIter out_end() const = 0;
135 
137  IoIter io_begin() const { return inp_begin(); }
138 
140  IoIter io_end() const { return out_end(); }
141 
143  virtual size_t inputCount() const = 0;
144 
146  virtual size_t outputCount() const = 0;
147 
149  virtual WireId* nth_input(size_t circId) const = 0;
150 
152  virtual WireId* nth_output(size_t circId) const = 0;
153 
155 
160  virtual void unplug();
161 
164  virtual void toDot(std::basic_ostream<char>& out, int indent=0) = 0;
165 
173  void alter(bool uprec = true);
174 
175  protected:
180  virtual sign_t computeSignature(int level);
181 
184  virtual sign_t innerSignature() const = 0;
185 
188  virtual bool innerEqual(CircuitTree* othTree) = 0;
189 
191  void unplug_common();
192 
193  // == Memoization bookkeeping
194  typedef size_t memo_ts_t;
195 
197  memo_ts_t curHistoryTime;
198 
200 
201  struct MemoSign {
202  MemoSign(memo_ts_t t, sign_t sig) : timestamp(t), sig(sig) {}
203  memo_ts_t timestamp;
205  };
206 
207  std::vector<MemoSign> memoSig;
208 
211 
212  private:
213  static size_t nextCircuitId;
214  size_t circuitId;
215 
216  friend class CircuitGroup;
217 };
218 
size_t id() const
Definition: circuitTree.h:122
sign_t sign(int level=2)
Definition: circuitTree.cpp:20
virtual InnerIoIter * clone() const
Definition: circuitTree.h:26
virtual IoIter out_end() const =0
Definition: circuitTree.h:41
bool equals(CircuitTree *oth)
Definition: circuitTree.cpp:32
IoIter operator++(int)
Definition: circuitTree.h:67
virtual bool innerEqual(CircuitTree *othTree)=0
Definition: circuitTree.h:42
bool operator==(const IoIter &oth) const
Definition: circuitTree.h:74
sign_t sig
Definition: circuitTree.h:204
virtual WireId * nth_input(size_t circId) const =0
Get the nth input.
void alter(bool uprec=true)
Definition: circuitTree.cpp:92
virtual void unplug()
Unplug the circuit from its ancestor.
Definition: circuitTree.cpp:38
Definition: circuitTree.h:13
memo_ts_t timestamp
Definition: circuitTree.h:203
IoIter()
Definition: circuitTree.h:51
virtual sign_t innerSignature() const =0
bool operator==(const CircuitTree &oth) const
Definition: circuitTree.h:113
virtual void toDot(std::basic_ostream< char > &out, int indent=0)=0
bool operator!=(const IoIter &oth) const
Definition: circuitTree.h:78
Definition: wireId.h:21
Definition: circuitTree.h:45
virtual IoIter out_begin() const =0
virtual WireId * operator*()
Definition: circuitTree.h:25
virtual bool equal(const InnerIoIter &) const
Definition: circuitTree.h:34
CircuitGroup * ancestor()
Definition: circuitTree.h:119
std::ostream & indent(std::ostream &stream, int indent)
Definition: dotPrint.cpp:21
virtual CircType circType() const =0
virtual size_t inputCount() const =0
Get the number of inputs.
void unplug_common()
Common steps for every overridden implementation of unplug
Definition: circuitTree.cpp:85
MemoSign(memo_ts_t t, sign_t sig)
Definition: circuitTree.h:202
virtual void operator++()
Definition: circuitTree.h:18
Definition: circuitGroup.h:47
WireId * operator*() const
Definition: circuitTree.h:72
IoIter(InnerIoIter *ptr)
Definition: circuitTree.h:52
IoIter io_begin() const
Definition: circuitTree.h:137
virtual size_t outputCount() const =0
Get the number of outputs.
virtual sign_t computeSignature(int level)
Definition: circuitTree.cpp:46
virtual ~InnerIoIter()
Definition: circuitTree.h:17
virtual IoIter inp_begin() const =0
IoIter io_end() const
Definition: circuitTree.h:140
virtual ~CircuitTree()
Definition: circuitTree.cpp:17
memo_ts_t lastAlterationTime
Definition: circuitTree.h:199
memo_ts_t curHistoryTime
Current history "timestamp" for this circuit, used for memoization.
Definition: circuitTree.h:197
virtual WireId * nth_output(size_t circId) const =0
Get the nth input.
IoIter & operator++()
Definition: circuitTree.h:63
IoIter inp_end() const
Definition: circuitTree.h:128
CircuitGroup * ancestor_
Definition: circuitTree.h:210
bool operator!=(InnerIoIter &oth)
Definition: circuitTree.h:22
size_t memo_ts_t
Definition: circuitTree.h:194
IoIter & operator=(const IoIter &oth)
Definition: circuitTree.h:57
Definition: circuitTree.h:49
IoIter(const IoIter &oth)
Definition: circuitTree.h:55
CircuitTree()
Definition: circuitTree.cpp:10
Definition: circuitTree.h:43
std::vector< MemoSign > memoSig
Definition: circuitTree.h:207
Definition: circuitTree.h:44
Definition: circuitTree.h:10
~IoIter()
Definition: circuitTree.h:53
Definition: circuitTree.h:201
uint64_t sign_t
Type of a circuit signature.
Definition: isomatch.h:26
bool operator==(InnerIoIter &oth)
Definition: circuitTree.h:19
CircType
Definition: circuitTree.h:40