1 /*********************************************
2 * ZBDD+ Manipulator (SAPPORO-1.58) - Header *
3 * (C) Shin-ichi MINATO (Nov. 22, 2013) *
4 *********************************************/
21 ZBDD(void) { _zbdd = bddempty; }
22 ZBDD(int v) { _zbdd = (v==0)? bddempty:(v>0)? bddsingle:bddnull; }
23 ZBDD(const ZBDD& f) { _zbdd = bddcopy(f._zbdd); }
25 ~ZBDD(void) { bddfree(_zbdd); }
27 ZBDD& operator=(const ZBDD& f) {
28 if(_zbdd != f._zbdd) { bddfree(_zbdd); _zbdd = bddcopy(f._zbdd); }
32 ZBDD& operator&=(const ZBDD& f)
33 { ZBDD h; h._zbdd = bddintersec(_zbdd, f._zbdd); return *this = h; }
35 ZBDD& operator+=(const ZBDD& f)
36 { ZBDD h; h._zbdd = bddunion(_zbdd, f._zbdd); return *this = h; }
38 ZBDD& operator-=(const ZBDD& f)
39 { ZBDD h; h._zbdd = bddsubtract(_zbdd, f._zbdd); return *this = h; }
41 ZBDD& operator<<=(int s)
42 { ZBDD h; h._zbdd = bddlshift(_zbdd, s); return *this = h; }
44 ZBDD& operator>>=(int s)
45 { ZBDD h; h._zbdd = bddrshift(_zbdd, s); return *this = h; }
47 ZBDD& operator*=(const ZBDD&);
48 ZBDD& operator/=(const ZBDD&);
49 ZBDD& operator%=(const ZBDD&);
51 ZBDD operator<<(int s) const
52 { ZBDD h; h._zbdd = bddlshift(_zbdd, s); return h; }
54 ZBDD operator>>(int s) const
55 { ZBDD h; h._zbdd = bddrshift(_zbdd, s); return h; }
57 int Top(void) const { return bddtop(_zbdd); }
59 ZBDD OffSet(int v) const
60 { ZBDD h; h._zbdd = bddoffset(_zbdd, v); return h; }
62 ZBDD OnSet(int v) const
63 { ZBDD h; h._zbdd = bddonset(_zbdd, v); return h; }
65 ZBDD OnSet0(int v) const
66 { ZBDD h; h._zbdd = bddonset0(_zbdd, v); return h; }
68 ZBDD Change(int v) const
69 { ZBDD h; h._zbdd = bddchange(_zbdd, v); return h; }
71 bddword GetID(void) const { return _zbdd; }
72 bddword Size(void) const { return bddsize(_zbdd); }
73 bddword Card(void) const { return bddcard(_zbdd); }
74 bddword Lit(void) const { return bddlit(_zbdd); }
75 bddword Len(void) const { return bddlen(_zbdd); }
77 void Export(FILE *strm = stdout) const;
78 void XPrint(void) const;
79 void Print(void) const;
80 void PrintPla(void) const;
82 ZBDD Swap(int, int) const;
83 ZBDD Restrict(const ZBDD&) const;
84 ZBDD Permit(const ZBDD&) const;
85 ZBDD PermitSym(int) const;
86 ZBDD Support(void) const
87 { ZBDD h; h._zbdd = bddsupport(_zbdd); return h; }
88 ZBDD Always(void) const;
90 int SymChk(int, int) const;
91 ZBDD SymGrp(void) const;
92 ZBDD SymGrpNaive(void) const;
94 ZBDD SymSet(int) const;
95 int ImplyChk(int, int) const;
96 int CoImplyChk(int, int) const;
97 ZBDD ImplySet(int) const;
98 ZBDD CoImplySet(int) const;
100 int IsPoly(void) const;
101 ZBDD Divisor(void) const;
103 ZBDD ZLev(int lev, int last = 0) const;
104 void SetZSkip(void) const;
105 ZBDD Intersec(const ZBDD&) const;
107 friend ZBDD ZBDD_ID(bddword);
109 //friend class SeqBDD;
112 extern ZBDD operator*(const ZBDD&, const ZBDD&);
113 extern ZBDD operator/(const ZBDD&, const ZBDD&);
114 extern ZBDD ZBDD_Meet(const ZBDD&, const ZBDD&);
115 extern ZBDD ZBDD_Random(int, int density = 50);
116 extern ZBDD ZBDD_Import(FILE *strm = stdin);
118 extern ZBDD ZBDD_LCM_A(char *, int);
119 extern ZBDD ZBDD_LCM_C(char *, int);
120 extern ZBDD ZBDD_LCM_M(char *, int);
122 inline ZBDD ZBDD_ID(bddword zbdd)
123 { ZBDD h; h._zbdd = zbdd; return h; }
125 inline ZBDD BDD_CacheZBDD(char op, bddword fx, bddword gx)
126 { return ZBDD_ID(bddcopy(bddrcache(op, fx, gx))); }
128 inline ZBDD operator&(const ZBDD& f, const ZBDD& g)
129 { return ZBDD_ID(bddintersec(f.GetID(), g.GetID())); }
131 inline ZBDD operator+(const ZBDD& f, const ZBDD& g)
132 { return ZBDD_ID(bddunion(f.GetID(), g.GetID())); }
134 inline ZBDD operator-(const ZBDD& f, const ZBDD& g)
135 { return ZBDD_ID(bddsubtract(f.GetID(), g.GetID())); }
137 inline ZBDD operator%(const ZBDD& f, const ZBDD& p)
138 { return f - (f/p) * p; }
140 inline int operator==(const ZBDD& f, const ZBDD& g)
141 { return f.GetID() == g.GetID(); }
143 inline int operator!=(const ZBDD& f, const ZBDD& g)
144 { return !(f == g); }
146 inline ZBDD& ZBDD::operator*=(const ZBDD& f)
147 { return *this = *this * f; }
149 inline ZBDD& ZBDD::operator/=(const ZBDD& f)
150 { return *this = *this / f; }
152 inline ZBDD& ZBDD::operator%=(const ZBDD& f)
153 { return *this = *this % f; }
161 ZBDDV(void) { _zbdd = 0; }
162 ZBDDV(const ZBDDV& fv) { _zbdd = fv._zbdd; }
163 ZBDDV(const ZBDD& f, int location = 0);
166 ZBDDV& operator=(const ZBDDV& fv) { _zbdd = fv._zbdd; return *this; }
167 ZBDDV& operator&=(const ZBDDV& fv) { _zbdd &= fv._zbdd; return *this; }
168 ZBDDV& operator+=(const ZBDDV& fv) { _zbdd += fv._zbdd; return *this; }
169 ZBDDV& operator-=(const ZBDDV& fv) { _zbdd -= fv._zbdd; return *this; }
170 ZBDDV& operator<<=(int);
171 ZBDDV& operator>>=(int);
173 ZBDDV operator<<(int) const;
174 ZBDDV operator>>(int) const;
176 ZBDDV OffSet(int) const;
177 ZBDDV OnSet(int) const;
178 ZBDDV OnSet0(int) const;
179 ZBDDV Change(int) const;
180 ZBDDV Swap(int, int) const;
183 int Last(void) const;
184 ZBDDV Mask(int start, int length = 1) const;
185 ZBDD GetZBDD(int) const;
187 ZBDD GetMetaZBDD(void) const { return _zbdd; }
188 bddword Size(void) const;
189 void Print(void) const;
190 void Export(FILE *strm = stdout) const;
191 int PrintPla(void) const;
192 void XPrint(void) const;
194 friend ZBDDV operator&(const ZBDDV&, const ZBDDV&);
195 friend ZBDDV operator+(const ZBDDV&, const ZBDDV&);
196 friend ZBDDV operator-(const ZBDDV&, const ZBDDV&);
199 extern ZBDDV ZBDDV_Import(FILE *strm = stdin);
201 inline ZBDDV operator&(const ZBDDV& fv, const ZBDDV& gv)
202 { ZBDDV hv; hv._zbdd = fv._zbdd & gv._zbdd; return hv; }
203 inline ZBDDV operator+(const ZBDDV& fv, const ZBDDV& gv)
204 { ZBDDV hv; hv._zbdd = fv._zbdd + gv._zbdd; return hv; }
205 inline ZBDDV operator-(const ZBDDV& fv, const ZBDDV& gv)
206 { ZBDDV hv; hv._zbdd = fv._zbdd - gv._zbdd; return hv; }
207 inline int operator==(const ZBDDV& fv, const ZBDDV& gv)
208 { return fv.GetMetaZBDD() == gv.GetMetaZBDD(); }
209 inline int operator!=(const ZBDDV& fv, const ZBDDV& gv)
210 { return !(fv == gv); }
212 inline ZBDDV& ZBDDV::operator<<=(int s)
213 { return *this = *this << s; }
215 inline ZBDDV& ZBDDV::operator>>=(int s)
216 { return *this = *this >> s; }
225 ZBDD_Entry(void){ _key = -1; }
232 ZBDD_Entry* GetEntry(ZBDD);
238 void Enter(ZBDD, void *);
240 bddword Amount(void);