nysol-zdd 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/ext/zdd_so/BDD.cc +495 -0
  3. data/ext/zdd_so/BDD.h +356 -0
  4. data/ext/zdd_so/BDDDG.cc +1818 -0
  5. data/ext/zdd_so/BDDDG.h +107 -0
  6. data/ext/zdd_so/BDDHASH.cc +91 -0
  7. data/ext/zdd_so/BtoI.cc +503 -0
  8. data/ext/zdd_so/BtoI.h +144 -0
  9. data/ext/zdd_so/CtoI.cc +1072 -0
  10. data/ext/zdd_so/CtoI.h +186 -0
  11. data/ext/zdd_so/MLZBDDV.cc +153 -0
  12. data/ext/zdd_so/MLZBDDV.h +42 -0
  13. data/ext/zdd_so/SOP.cc +608 -0
  14. data/ext/zdd_so/SOP.h +199 -0
  15. data/ext/zdd_so/ZBDD.cc +1035 -0
  16. data/ext/zdd_so/ZBDD.h +243 -0
  17. data/ext/zdd_so/ZBDDDG.cc +1834 -0
  18. data/ext/zdd_so/ZBDDDG.h +105 -0
  19. data/ext/zdd_so/ZBDDHASH.cc +91 -0
  20. data/ext/zdd_so/bddc.c +2816 -0
  21. data/ext/zdd_so/bddc.h +132 -0
  22. data/ext/zdd_so/extconf.rb +25 -0
  23. data/ext/zdd_so/include/aheap.c +211 -0
  24. data/ext/zdd_so/include/aheap.h +111 -0
  25. data/ext/zdd_so/include/base.c +93 -0
  26. data/ext/zdd_so/include/base.h +60 -0
  27. data/ext/zdd_so/include/itemset.c +473 -0
  28. data/ext/zdd_so/include/itemset.h +153 -0
  29. data/ext/zdd_so/include/problem.c +371 -0
  30. data/ext/zdd_so/include/problem.h +160 -0
  31. data/ext/zdd_so/include/queue.c +518 -0
  32. data/ext/zdd_so/include/queue.h +177 -0
  33. data/ext/zdd_so/include/sgraph.c +331 -0
  34. data/ext/zdd_so/include/sgraph.h +170 -0
  35. data/ext/zdd_so/include/stdlib2.c +832 -0
  36. data/ext/zdd_so/include/stdlib2.h +746 -0
  37. data/ext/zdd_so/include/trsact.c +723 -0
  38. data/ext/zdd_so/include/trsact.h +167 -0
  39. data/ext/zdd_so/include/vec.c +583 -0
  40. data/ext/zdd_so/include/vec.h +159 -0
  41. data/ext/zdd_so/lcm-vsop.cc +596 -0
  42. data/ext/zdd_so/print.cc +683 -0
  43. data/ext/zdd_so/table.cc +330 -0
  44. data/ext/zdd_so/vsop.h +88 -0
  45. data/ext/zdd_so/zdd_so.cpp +3277 -0
  46. data/lib/nysol/zdd.rb +31 -0
  47. metadata +131 -0
@@ -0,0 +1,144 @@
1
+ /******************************************
2
+ * Binary-to-Integer function class *
3
+ * (SAPPORO-1.55) - Header *
4
+ * (C) Shin-ichi MINATO (Dec. 11, 2012) *
5
+ ******************************************/
6
+
7
+ class BtoI;
8
+
9
+ #ifndef _BtoI_
10
+ #define _BtoI_
11
+
12
+ #include "BDD.h"
13
+
14
+ class BtoI
15
+ {
16
+ BDDV _bddv;
17
+
18
+ BtoI Shift(int) const;
19
+ BtoI Sup(void) const;
20
+
21
+ public:
22
+ BtoI(void) { _bddv = BDDV(0); }
23
+ BtoI(const BtoI& fv) { _bddv = fv._bddv; }
24
+ BtoI(const BDDV& fv) { _bddv = fv; }
25
+ BtoI(const BDD& f)
26
+ { _bddv = f; if(f != 0 && f != -1) _bddv = _bddv || BDDV(0); }
27
+ BtoI(int);
28
+ ~BtoI(void) { }
29
+
30
+ BtoI& operator=(const BtoI& fv) { _bddv = fv._bddv; return *this; }
31
+ BtoI& operator+=(const BtoI&);
32
+ BtoI& operator-=(const BtoI&);
33
+ BtoI& operator*=(const BtoI&);
34
+ BtoI& operator/=(const BtoI&);
35
+ BtoI& operator%=(const BtoI&);
36
+ BtoI& operator&=(const BtoI&);
37
+ BtoI& operator|=(const BtoI&);
38
+ BtoI& operator^=(const BtoI&);
39
+ BtoI& operator<<=(const BtoI&);
40
+ BtoI& operator>>=(const BtoI&);
41
+
42
+ BtoI operator-(void) const { return 0 - *this; }
43
+ BtoI operator~(void) const { return BtoI(~_bddv); }
44
+ BtoI operator!(void) const;
45
+ BtoI operator<<(const BtoI&) const;
46
+ BtoI operator>>(const BtoI& fv) const { return *this << -fv; }
47
+
48
+ BtoI UpperBound(void) const;
49
+ BtoI UpperBound(const BDD&) const;
50
+ BtoI LowerBound(void) const { return -(- *this).UpperBound(); }
51
+ BtoI LowerBound(const BDD& f) const { return -(- *this).UpperBound(f); }
52
+
53
+ BtoI At0(int v) const {
54
+ if(BDD_LevOfVar(v) > BDD_TopLev())
55
+ BDDerr("BtoI::At0: Invalid VarID.", v);
56
+ return BtoI(_bddv.At0(v)).Sup();
57
+ }
58
+
59
+ BtoI At1(int v) const {
60
+ if(BDD_LevOfVar(v) > BDD_TopLev())
61
+ BDDerr("BtoI::At1: Invalid VarID.", v);
62
+ return BtoI(_bddv.At1(v)).Sup();
63
+ }
64
+
65
+ BtoI Cofact(const BtoI&) const;
66
+
67
+ BtoI Spread(int k) const { return BtoI(_bddv.Spread(k)).Sup(); }
68
+
69
+ int Top(void) const { return _bddv.Top(); }
70
+
71
+ BDD GetSignBDD(void) const { return _bddv.GetBDD(Len() - 1); }
72
+
73
+ BDD GetBDD(int i) const
74
+ { return _bddv.GetBDD((i >= Len())? Len()-1: i); }
75
+
76
+ BDDV GetMetaBDDV(void) const { return _bddv; }
77
+
78
+ int Len(void) const { return _bddv.Len(); }
79
+
80
+ int GetInt(void) const;
81
+ int StrNum10(char *) const;
82
+ int StrNum16(char *) const;
83
+ bddword Size() const;
84
+
85
+ void Print() const;
86
+
87
+ friend int operator==(const BtoI&, const BtoI&);
88
+
89
+ friend BtoI operator+(const BtoI&, const BtoI&);
90
+ friend BtoI operator-(const BtoI&, const BtoI&);
91
+ friend BtoI operator&(const BtoI&, const BtoI&);
92
+ friend BtoI operator|(const BtoI&, const BtoI&);
93
+ friend BtoI operator^(const BtoI&, const BtoI&);
94
+ friend BtoI BtoI_ITE(const BDD&, const BtoI&, const BtoI&);
95
+ };
96
+
97
+ extern BtoI operator+(const BtoI&, const BtoI&);
98
+ extern BtoI operator-(const BtoI&, const BtoI&);
99
+ extern BtoI operator*(const BtoI&, const BtoI&);
100
+ extern BtoI operator/(const BtoI&, const BtoI&);
101
+ extern BtoI operator&(const BtoI&, const BtoI&);
102
+ extern BtoI operator|(const BtoI&, const BtoI&);
103
+ extern BtoI operator^(const BtoI&, const BtoI&);
104
+ extern BtoI BtoI_ITE(const BDD&, const BtoI&, const BtoI&);
105
+
106
+ extern BtoI BtoI_EQ(const BtoI&, const BtoI&);
107
+
108
+ extern BtoI BtoI_atoi(char *);
109
+
110
+ inline int operator==(const BtoI& a, const BtoI& b)
111
+ { return a._bddv == b._bddv; }
112
+
113
+ inline int operator!=(const BtoI& a, const BtoI& b) { return !(a == b); }
114
+
115
+ inline BtoI operator%(const BtoI& a, const BtoI&b )
116
+ { return a - (a / b) * b; }
117
+
118
+ inline BtoI BtoI_ITE(const BtoI& a, const BtoI& b, const BtoI& c)
119
+ { return BtoI_ITE(~(BtoI_EQ(a, 0).GetBDD(0)), b, c); }
120
+
121
+ inline BtoI BtoI_GT(const BtoI& a, const BtoI& b)
122
+ { return BtoI((b - a).GetSignBDD()); }
123
+
124
+ inline BtoI BtoI_LT(const BtoI& a, const BtoI& b)
125
+ { return BtoI((a - b).GetSignBDD()); }
126
+
127
+ inline BtoI BtoI_NE(const BtoI& a, const BtoI& b)
128
+ { return ! BtoI_EQ(a, b); }
129
+
130
+ inline BtoI BtoI_GE(const BtoI& a, const BtoI& b)
131
+ { return ! BtoI_LT(a, b); }
132
+
133
+ inline BtoI BtoI_LE(const BtoI& a, const BtoI& b)
134
+ { return ! BtoI_GT(a, b); }
135
+
136
+ inline BtoI BtoI::operator!(void) const { return BtoI_EQ(*this, 0); }
137
+
138
+ inline BtoI BtoI::Cofact(const BtoI& fv) const {
139
+ BDDV a = BDDV(BtoI_NE(fv, 0).GetBDD(0), Len());
140
+ return BtoI(_bddv.Cofact(a)).Sup();
141
+ }
142
+
143
+ #endif // _BtoI_
144
+
@@ -0,0 +1,1072 @@
1
+ /******************************************
2
+ * Combination-to-Integer function class *
3
+ * (SAPPORO-1.71) - Body *
4
+ * (C) Shin-ichi MINATO (Dec. 15, 2015) *
5
+ ******************************************/
6
+
7
+ #include "CtoI.h"
8
+
9
+ using std::cout;
10
+
11
+ static const char BC_CtoI_MULT = 40;
12
+ static const char BC_CtoI_DIV = 41;
13
+ static const char BC_CtoI_TV = 42;
14
+ static const char BC_CtoI_TVI = 43;
15
+
16
+ static const char BC_CtoI_RI = 44;
17
+ static const char BC_CtoI_FPA = 45;
18
+ static const char BC_CtoI_FPAV = 46;
19
+ static const char BC_CtoI_FPM = 47;
20
+ static const char BC_CtoI_FPC = 48;
21
+ static const char BC_CtoI_MEET = 49;
22
+
23
+ //----------- Macros for operation cache -----------
24
+ #define CtoI_CACHE_CHK_RETURN(op, fx, gx) \
25
+ { ZBDD z = BDD_CacheZBDD(op, fx, gx); \
26
+ if(z != -1) return CtoI(z); \
27
+ BDD_RECUR_INC; }
28
+
29
+ #define CtoI_CACHE_ENT_RETURN(op, fx, gx, h) \
30
+ { BDD_RECUR_DEC; \
31
+ if(h != CtoI_Null()) BDD_CacheEnt(op, fx, gx, h._zbdd.GetID()); \
32
+ return h; }
33
+
34
+ //-------------- Public Methods -----------
35
+ CtoI::CtoI(int n)
36
+ {
37
+ if(n == 0) _zbdd = 0;
38
+ else if(n == 1) _zbdd = 1;
39
+ else if(n < 0)
40
+ {
41
+ if((n = -n) < 0) BDDerr("CtoI::CtoI(): overflow.", n);
42
+ *this = -CtoI(n);
43
+ }
44
+ else
45
+ {
46
+ *this = 0;
47
+ CtoI a = 1;
48
+ while(n)
49
+ {
50
+ if(n & 1) *this += a;
51
+ a += a;
52
+ n >>= 1;
53
+ }
54
+ }
55
+ }
56
+
57
+ int CtoI::TopItem() const
58
+ {
59
+ int v = Top();
60
+ if(BDD_LevOfVar(v) <= BDD_TopLev()) return v;
61
+ int v0 = Factor0(v).TopItem();
62
+ int v1 = Factor1(v).TopItem();
63
+ return (BDD_LevOfVar(v0) > BDD_LevOfVar(v1))? v0: v1;
64
+ }
65
+
66
+ int CtoI::TopDigit() const
67
+ {
68
+ int v = Top();
69
+ if(BDD_LevOfVar(v) <= BDD_TopLev()) return 0;
70
+ int d0 = Factor0(v).TopDigit();
71
+ int d1 = Factor1(v).TopDigit() + (1 << (BDDV_SysVarTop - v));
72
+ return (d0 > d1)? d0: d1;
73
+ }
74
+
75
+ CtoI CtoI::FilterThen(const CtoI& a) const
76
+ {
77
+ if(*this == 0) return 0;
78
+ if(*this == CtoI_Null()) return CtoI_Null();
79
+ CtoI aa = a.IsBool()? a: a.NonZero();
80
+ if(aa == 0) return 0;
81
+ if(IsBool()) return CtoI_Intsec(*this, aa);
82
+ int v = Top();
83
+ return CtoI_Union(Factor0(v).FilterThen(aa),
84
+ Factor1(v).FilterThen(aa).AffixVar(v));
85
+ }
86
+
87
+ CtoI CtoI::FilterElse(const CtoI& a) const
88
+ {
89
+ if(*this == 0) return 0;
90
+ if(*this == CtoI_Null()) return CtoI_Null();
91
+ CtoI aa = a.IsBool()? a: a.NonZero();
92
+ if(aa == 0) return *this;
93
+ if(IsBool()) return CtoI_Diff(*this, aa);
94
+ int v = Top();
95
+ return CtoI_Union(Factor0(v).FilterElse(aa),
96
+ Factor1(v).FilterElse(aa).AffixVar(v));
97
+ }
98
+
99
+ CtoI CtoI::FilterRestrict(const CtoI& a) const
100
+ {
101
+ CtoI th = IsBool()? *this: NonZero();
102
+ CtoI aa = a.IsBool()? a: a.NonZero();
103
+ return FilterThen(CtoI(th._zbdd.Restrict(aa._zbdd)));
104
+ }
105
+
106
+ CtoI CtoI::FilterPermit(const CtoI& a) const
107
+ {
108
+ CtoI th = IsBool()? *this: NonZero();
109
+ CtoI aa = a.IsBool()? a: a.NonZero();
110
+ return FilterThen(CtoI(th._zbdd.Permit(aa._zbdd)));
111
+ }
112
+
113
+ CtoI CtoI::FilterPermitSym(int n) const
114
+ {
115
+ CtoI th = IsBool()? *this: NonZero();
116
+ return FilterThen(CtoI(th._zbdd.PermitSym(n)));
117
+ }
118
+
119
+ CtoI CtoI::NonZero() const
120
+ {
121
+ if(IsBool()) return *this;
122
+ int v = Top();
123
+ return CtoI_Union(Factor0(v).NonZero(), Factor1(v).NonZero());
124
+ }
125
+
126
+ CtoI CtoI::ConstTerm() const
127
+ {
128
+ if(IsBool()) return CtoI_Intsec(*this, 1);
129
+ int v = Top();
130
+ return CtoI_Union(Factor0(v).ConstTerm(),
131
+ Factor1(v).ConstTerm().AffixVar(v));
132
+ }
133
+
134
+ CtoI CtoI::Digit(int index) const
135
+ {
136
+ if(index < 0) BDDerr("CtoI::Digit(): invalid index.", index);
137
+ CtoI a = *this;
138
+ for(int i=0; i<BDDV_SysVarTop; i++)
139
+ {
140
+ if(index == 0) break;
141
+ if(index & 1) a = a.Factor1(BDDV_SysVarTop - i);
142
+ else a = a.Factor0(BDDV_SysVarTop - i);
143
+ if(a == CtoI_Null()) break;
144
+ index >>= 1;
145
+ }
146
+ while(! a.IsBool()) a = a.Factor0(a.Top());
147
+ return a;
148
+ }
149
+
150
+ CtoI CtoI::EQ_Const(const CtoI& a) const
151
+ {
152
+ return CtoI_Diff(NonZero(), NE_Const(a));
153
+ }
154
+
155
+ CtoI CtoI::NE_Const(const CtoI& a) const
156
+ {
157
+ if(a == 0) return CtoI_NE(*this, 0);
158
+ return CtoI_NE(*this, a * NonZero());
159
+ }
160
+
161
+ CtoI CtoI::GT_Const(const CtoI& a) const
162
+ {
163
+ if(a == 0) return CtoI_GT(*this, 0);
164
+ return CtoI_GT(*this, a * NonZero());
165
+ }
166
+
167
+ CtoI CtoI::GE_Const(const CtoI& a) const
168
+ {
169
+ if(a == 0) return CtoI_GE(*this, 0);
170
+ return CtoI_GE(*this, a * NonZero());
171
+ }
172
+
173
+ CtoI CtoI::LT_Const(const CtoI& a) const
174
+ {
175
+ if(a == 0) return CtoI_GT(0, *this);
176
+ return CtoI_GT(a * NonZero(), *this);
177
+ }
178
+
179
+ CtoI CtoI::LE_Const(const CtoI& a) const
180
+ {
181
+ if(a == 0) return CtoI_GE(0, *this);
182
+ return CtoI_GE(a * NonZero(), *this);
183
+ }
184
+
185
+ CtoI CtoI::MaxVal() const
186
+ {
187
+ if(*this == CtoI_Null()) return 0;
188
+ CtoI a = *this;
189
+ CtoI cond = NonZero();
190
+ CtoI c = 0;
191
+ while(a != 0)
192
+ {
193
+ int td = a.TopDigit();
194
+ CtoI d = Digit(td);
195
+ if(td & 1)
196
+ {
197
+ CtoI cond0 = CtoI_Diff(cond, d);
198
+ if(cond0 != 0) cond = cond0;
199
+ else c = CtoI_Union(c, CtoI(1).ShiftDigit(td));
200
+ }
201
+ else
202
+ {
203
+ CtoI cond0 = CtoI_Intsec(cond, d);
204
+ if(cond0 != 0)
205
+ {
206
+ cond = cond0;
207
+ c = CtoI_Union(c, CtoI(1).ShiftDigit(td));
208
+ }
209
+ }
210
+ if(td == 0) break;
211
+ a = CtoI_Diff(a, d.ShiftDigit(td));
212
+ }
213
+ return c;
214
+ }
215
+
216
+ CtoI CtoI::MinVal() const { return - (- *this).MaxVal(); }
217
+
218
+ CtoI CtoI::TimesSysVar(int v) const
219
+ {
220
+ if(v > BDDV_SysVarTop || v <= 0)
221
+ BDDerr("CtoI::TimesSysVar(): invalid var ID.", v);
222
+ if(*this == 0) return *this;
223
+ if(*this == CtoI_Null()) return *this;
224
+ CtoI a0 = Factor0(v);
225
+ CtoI a1 = Factor1(v);
226
+ if(a1 == 0) return a0.AffixVar(v);
227
+ return CtoI_Union(a0.AffixVar(v), a1.TimesSysVar(v-1));
228
+ }
229
+
230
+ CtoI CtoI::DivBySysVar(int v) const
231
+ {
232
+ if(v > BDDV_SysVarTop || v <= 0)
233
+ BDDerr("CtoI::DivBySysVar(): invalid var ID.", v);
234
+ if(*this == 0) return *this;
235
+ if(*this == CtoI_Null()) return *this;
236
+ CtoI a0 = Factor0(v);
237
+ CtoI a1 = Factor1(v);
238
+ if(a0.IsBool() || v == 1) return a1;
239
+ return CtoI_Union(a1, a0.AffixVar(v).DivBySysVar(v-1));
240
+ }
241
+
242
+ CtoI CtoI::ShiftDigit(int pow) const
243
+ {
244
+ CtoI a = *this;
245
+ int v = BDDV_SysVarTop;
246
+ int i = (pow >= 0)? pow: -pow;
247
+ while(i)
248
+ {
249
+ if(i & 1)
250
+ {
251
+ if(pow > 0) a = a.TimesSysVar(v);
252
+ else a = a.DivBySysVar(v);
253
+ }
254
+ i >>= 1;
255
+ v--;
256
+ }
257
+ return a;
258
+ }
259
+
260
+ bddword CtoI::Size() const { return _zbdd.Size(); }
261
+
262
+ int CtoI::GetInt() const
263
+ {
264
+ if(*this == CtoI_Null()) return 0;
265
+ if(IsBool()) return (CtoI_Intsec(*this, 1)== 0)? 0: 1;
266
+ int v = Top();
267
+ CtoI a;
268
+ if((a=Factor0(v)) == CtoI_Null()) return 0;
269
+ int n = a.GetInt();
270
+ if((a=Factor1(v)) == CtoI_Null()) return 0;
271
+ if(v == BDDV_SysVarTop) return n - (a.GetInt() << 1);
272
+ return n + (a.GetInt() << (1<< (BDDV_SysVarTop - v)));
273
+ }
274
+
275
+ int CtoI::StrNum10(char* s) const
276
+ {
277
+ if(*this == CtoI_Null()) { sprintf(s, "0"); return 1; }
278
+ if(! IsConst()) return FilterThen(1).StrNum10(s);
279
+ int td = TopDigit();
280
+ if(td & 1)
281
+ {
282
+ if((- *this).StrNum10(s)) return 1;
283
+ int len = strlen(s);
284
+ for(int i=len; i>=0; i--) s[i+1] = s[i];
285
+ s[0] = '-';
286
+ return 0;
287
+ }
288
+
289
+ CtoI a = *this;
290
+ int i=0;
291
+ char s0[12];
292
+ if(td >= 20)
293
+ {
294
+ const int width = 9;
295
+ CtoI shift = 1000000000; // 10 ** width
296
+ while(1)
297
+ {
298
+ CtoI p = a / shift;
299
+ if(p == 0) break;
300
+ CtoI q = a - p * shift;
301
+ if(q == CtoI_Null()) { sprintf(s, "0"); return 1; }
302
+ sprintf(s0, "%09d", q.GetInt());
303
+ for(int j=i-1; j>=0; j--) s[j+width] = s[j];
304
+ for(int j=0; j<width; j++) s[j] = s0[j];
305
+ i += width;
306
+ a = p;
307
+ }
308
+ }
309
+ sprintf(s0, "%d", a.GetInt());
310
+ int len = strlen(s0);
311
+ for(int j=i-1; j>=0; j--) s[j+len] = s[j];
312
+ for(int j=0; j<len; j++) s[j] = s0[j];
313
+ i += len;
314
+ s[i] = 0;
315
+ return 0;
316
+ }
317
+
318
+ int CtoI::StrNum16(char* s) const
319
+ {
320
+ if(*this == CtoI_Null()) { sprintf(s, "0"); return 1; }
321
+ if(! IsConst()) return FilterThen(1).StrNum16(s);
322
+ int td = TopDigit();
323
+ if(td & 1)
324
+ {
325
+ if((- *this).StrNum16(s)) return 1;
326
+ int len = strlen(s);
327
+ for(int i=len; i>=0; i--) s[i+1] = s[i];
328
+ s[0] = '-';
329
+ return 0;
330
+ }
331
+
332
+ CtoI a = *this;
333
+ int i=0;
334
+ char s0[12];
335
+ if(td >= 20)
336
+ {
337
+ const int width = 6;
338
+ CtoI shift = 0x1000000; // 0x10 ** width
339
+ while(1)
340
+ {
341
+ CtoI p = a / shift;
342
+ if(p == 0) break;
343
+ CtoI q = a - p * shift;
344
+ if(q == CtoI_Null()) { sprintf(s, "0"); return 1; }
345
+ sprintf(s0, "%06X", q.GetInt());
346
+ for(int j=i-1; j>=0; j--) s[j+width] = s[j];
347
+ for(int j=0; j<width; j++) s[j] = s0[j];
348
+ i += width;
349
+ a = p;
350
+ }
351
+ }
352
+ sprintf(s0, "%X", a.GetInt());
353
+ int len = strlen(s0);
354
+ for(int j=i-1; j>=0; j--) s[j+len] = s[j];
355
+ for(int j=0; j<len; j++) s[j] = s0[j];
356
+ i += len;
357
+ s[i] = 0;
358
+ return 0;
359
+ }
360
+
361
+ static int Depth;
362
+ static int* S_Var;
363
+ static int PFflag;
364
+ static int PF(CtoI);
365
+ static int PF(CtoI a)
366
+ {
367
+ if(a.IsConst())
368
+ {
369
+ if(a.TopDigit() & 1) { cout << " -"; a = -a; }
370
+ else if(PFflag == 1) cout << " +";
371
+
372
+ PFflag = 1;
373
+ int c1 = (a != 1);
374
+ if(c1 || Depth == 0)
375
+ {
376
+ char s[80];
377
+ a.StrNum10(s);
378
+ cout << " " << s;
379
+ }
380
+ for(int i=0; i<Depth; i++) cout << " v" << S_Var[i];
381
+ cout.flush();
382
+ return 0;
383
+ }
384
+
385
+ int v = a.TopItem();
386
+ CtoI b = a.Factor1(v);
387
+ if(b == CtoI_Null()) return 1;
388
+ S_Var[Depth] = v;
389
+ Depth++;
390
+ if(PF(b) == 1) return 1;
391
+
392
+ Depth--;
393
+ b = a.Factor0(v);
394
+ if(b == 0) return 0;
395
+ if(b == CtoI_Null()) return 1;
396
+ return PF(b);
397
+ }
398
+
399
+ int CtoI::PutForm() const
400
+ {
401
+ if(*this == CtoI_Null()) return 1;
402
+
403
+ if(*this == 0) cout << " 0";
404
+ else
405
+ {
406
+ int v = TopItem();
407
+ Depth = 0;
408
+ S_Var = new int[v];
409
+ PFflag = 0;
410
+ int err = PF(*this);
411
+ delete[] S_Var;
412
+ if(err == 1)
413
+ {
414
+ cout << "...\n";
415
+ cout.flush();
416
+ return 1;
417
+ }
418
+ }
419
+ cout << "\n";
420
+ cout.flush();
421
+ return 0;
422
+ }
423
+
424
+ void CtoI::Print() const { _zbdd.Print(); }
425
+
426
+ CtoI CtoI::CountTerms() const
427
+ {
428
+ if(IsBool()) return TotalVal();
429
+ return NonZero().TotalVal();
430
+ }
431
+
432
+ CtoI CtoI::TotalVal() const
433
+ {
434
+ if(*this == CtoI_Null()) return *this;
435
+ int top = Top();
436
+ if(top == 0) return *this;
437
+
438
+ bddword x = _zbdd.GetID();
439
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_TV, x, 0);
440
+
441
+ CtoI c = Factor0(top).TotalVal();
442
+ if(c != CtoI_Null())
443
+ {
444
+ if(IsBool())
445
+ c += Factor1(top).TotalVal();
446
+ else
447
+ c += Factor1(top).TotalVal().ShiftDigit(1<<(BDDV_SysVarTop - top));
448
+ }
449
+
450
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_TV, x, 0, c);
451
+ }
452
+
453
+ CtoI CtoI::TotalValItems() const
454
+ {
455
+ if(*this == CtoI_Null()) return *this;
456
+ int top = Top();
457
+ if(top == 0) return CtoI(0);
458
+
459
+ bddword x = _zbdd.GetID();
460
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_TVI, x, 0);
461
+
462
+ CtoI c = Factor0(top).TotalValItems();
463
+ if(c != CtoI_Null())
464
+ {
465
+ CtoI a1 = Factor1(top);
466
+ if(IsBool())
467
+ c += a1.TotalValItems() + a1.TotalVal().AffixVar(top);
468
+ else
469
+ c += a1.TotalValItems().ShiftDigit(1<<(BDDV_SysVarTop - top));
470
+ }
471
+
472
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_TVI, x, 0, c);
473
+ }
474
+
475
+ CtoI CtoI::ReduceItems(const CtoI& b) const
476
+ {
477
+ if(*this == CtoI_Null()) return *this;
478
+ if(b == CtoI_Null()) return b;
479
+ if(! b.IsBool()) return ReduceItems(b.NonZero());
480
+ int atop = Top();
481
+ int btop = b.Top();
482
+ int top = (BDD_LevOfVar(atop) > BDD_LevOfVar(btop))? atop: btop;
483
+ if(top == 0) return *this;
484
+
485
+ bddword ax = _zbdd.GetID();
486
+ bddword bx = b._zbdd.GetID();
487
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_RI, ax, bx);
488
+
489
+ CtoI c = CtoI(0);
490
+ if(BDD_LevOfVar(btop) > BDD_LevOfVar(atop))
491
+ c = ReduceItems(b.Factor0(btop));
492
+ else if(!IsBool())
493
+ c = Factor0(atop).ReduceItems(b)
494
+ + Factor1(atop).ReduceItems(b).ShiftDigit(1<<(BDDV_SysVarTop - atop));
495
+ else if(BDD_LevOfVar(btop) == BDD_LevOfVar(atop))
496
+ c = Factor0(atop).ReduceItems(b) + Factor1(atop).ReduceItems(b);
497
+ else
498
+ {
499
+ c = Factor0(atop).ReduceItems(b.Factor0(atop))
500
+ + Factor1(atop).ReduceItems(b.Factor0(atop)).AffixVar(atop);
501
+ }
502
+
503
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_RI, ax, bx, c);
504
+ }
505
+
506
+ CtoI CtoI::FreqPatA(int Val) const
507
+ {
508
+ if(*this == CtoI_Null()) return *this;
509
+ if(IsConst()) return (GetInt() >= Val)? CtoI(1): CtoI(0);
510
+
511
+ int ax = _zbdd.GetID();
512
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_FPA, ax, Val);
513
+
514
+ int top = TopItem();
515
+ CtoI f1 = Factor1(top);
516
+
517
+ CtoI f = f1;
518
+ int tv = 1 << f.TopDigit();
519
+ CtoI f2 = f1;
520
+ if(tv -(tv>>1) < Val)
521
+ {
522
+ tv = 0;
523
+ while(f != CtoI(0))
524
+ {
525
+ int d = f.TopDigit();
526
+ CtoI fd = f.Digit(d);
527
+ if(d & 1)
528
+ {
529
+ tv -= fd.GetZBDD().Card() << d;
530
+ if(tv >= Val) break;
531
+ }
532
+ else
533
+ {
534
+ tv += fd.GetZBDD().Card() << d;
535
+ if((tv>>1) >= Val) break;
536
+ }
537
+ f -= fd.ShiftDigit(d);
538
+ }
539
+ if(tv < Val) f2 = CtoI(0);
540
+ }
541
+
542
+ CtoI h1 = f2.FreqPatA(Val);
543
+ CtoI h = CtoI_Union(h1, h1.AffixVar(top));
544
+ CtoI f0 = Factor0(top);
545
+ if(f0 != CtoI(0))
546
+ {
547
+ //CtoI f1v = f1.GE_Const(CtoI(Val));
548
+ f0 = f0.FilterElse(h1);
549
+ if(f0 != CtoI(0))
550
+ {
551
+ f1 = f1.FilterElse(h1);
552
+ h = CtoI_Union(h, (f0 + f1).FreqPatA(Val));
553
+ }
554
+ }
555
+
556
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_FPA, ax, Val, h);
557
+ }
558
+
559
+ CtoI CtoI::FreqPatA2(int Val) const
560
+ {
561
+ if(*this == CtoI_Null()) return *this;
562
+ if(IsConst()) return (GetInt() >= Val)? CtoI(1): CtoI(0);
563
+
564
+ int ax = _zbdd.GetID();
565
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_FPA, ax, Val);
566
+
567
+ int top = TopItem();
568
+ CtoI f1 = Factor1(top);
569
+
570
+ CtoI f = f1;
571
+ int tv = 1 << f.TopDigit();
572
+ CtoI f2 = f1;
573
+ if(tv -(tv>>1) < Val)
574
+ {
575
+ tv = 0;
576
+ while(f != CtoI(0))
577
+ {
578
+ int d = f.TopDigit();
579
+ CtoI fd = f.Digit(d);
580
+ if(d & 1)
581
+ {
582
+ tv -= fd.GetZBDD().Card() << d;
583
+ if(tv >= Val) break;
584
+ }
585
+ else
586
+ {
587
+ tv += fd.GetZBDD().Card() << d;
588
+ if((tv>>1) >= Val) break;
589
+ }
590
+ f -= fd.ShiftDigit(d);
591
+ }
592
+ if(tv < Val) f2 = CtoI(0);
593
+ }
594
+
595
+ int sz = f2.Size();
596
+ CtoI s = f2.TotalValItems().LT_Const(CtoI(Val));
597
+ f2 = f2.ReduceItems(s);
598
+ cout << (float) (sz - f2.Size())/sz << " ";
599
+ cout.flush();
600
+
601
+ CtoI h1 = f2.FreqPatA2(Val);
602
+ CtoI h = CtoI_Union(h1, h1.AffixVar(top));
603
+ CtoI f0 = Factor0(top);
604
+ if(f0 != CtoI(0))
605
+ {
606
+ //CtoI f1v = f1.GE_Const(CtoI(Val));
607
+ f0 = f0.FilterElse(h1);
608
+ if(f0 != CtoI(0))
609
+ {
610
+ f1 = f1.FilterElse(h1);
611
+ h = CtoI_Union(h, (f0 + f1).FreqPatA2(Val));
612
+ }
613
+ }
614
+
615
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_FPA, ax, Val, h);
616
+ }
617
+
618
+ CtoI CtoI::FreqPatAV(int Val) const
619
+ {
620
+ if(*this == CtoI_Null()) return *this;
621
+ if(IsConst()) return (GetInt() >= Val)? *this: CtoI(0);
622
+
623
+ int ax = _zbdd.GetID();
624
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_FPAV, ax, Val);
625
+
626
+ int top = TopItem();
627
+ CtoI f1 = Factor1(top);
628
+
629
+ CtoI f = f1;
630
+ int tv = 1 << f.TopDigit();
631
+ CtoI f2 = f1;
632
+ if(tv -(tv>>1) < Val)
633
+ {
634
+ tv = 0;
635
+ while(f != CtoI(0))
636
+ {
637
+ int d = f.TopDigit();
638
+ CtoI fd = f.Digit(d);
639
+ if(d & 1)
640
+ {
641
+ tv -= fd.GetZBDD().Card() << d;
642
+ if(tv >= Val) break;
643
+ }
644
+ else
645
+ {
646
+ tv += fd.GetZBDD().Card() << d;
647
+ if((tv>>1) >= Val) break;
648
+ }
649
+ f -= fd.ShiftDigit(d);
650
+ }
651
+ if(tv < Val) f2 = CtoI(0);
652
+ }
653
+
654
+ CtoI h1 = f2.FreqPatAV(Val);
655
+ CtoI h = h1.AffixVar(top);
656
+
657
+ CtoI f0 = Factor0(top);
658
+ if(f0 == CtoI(0)) h = CtoI_Union(h, h1);
659
+ else h = CtoI_Union(h, (f0 + f1).FreqPatAV(Val));
660
+
661
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_FPAV, ax, Val, h);
662
+ }
663
+
664
+ CtoI CtoI::FreqPatM(int Val) const
665
+ {
666
+ if(*this == CtoI_Null()) return *this;
667
+ if(IsConst()) return (GetInt() >= Val)? CtoI(1): CtoI(0);
668
+
669
+ int ax = _zbdd.GetID();
670
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_FPM, ax, Val);
671
+
672
+ int top = TopItem();
673
+ CtoI f1 = Factor1(top);
674
+
675
+ CtoI f = f1;
676
+ int tv = 1 << f.TopDigit();
677
+ CtoI f2 = f1;
678
+ if(tv -(tv>>1) < Val)
679
+ {
680
+ tv = 0;
681
+ while(f != CtoI(0))
682
+ {
683
+ int d = f.TopDigit();
684
+ CtoI fd = f.Digit(d);
685
+ if(d & 1)
686
+ {
687
+ tv -= fd.GetZBDD().Card() << d;
688
+ if(tv >= Val) break;
689
+ }
690
+ else
691
+ {
692
+ tv += fd.GetZBDD().Card() << d;
693
+ if((tv>>1) >= Val) break;
694
+ }
695
+ f -= fd.ShiftDigit(d);
696
+ }
697
+ if(tv < Val) f2 = CtoI(0);
698
+ }
699
+
700
+ CtoI h1 = f2.FreqPatM(Val);
701
+ CtoI h = h1.AffixVar(top);
702
+ CtoI f0 = Factor0(top);
703
+ if(f0 != CtoI(0))
704
+ {
705
+ f0 = CtoI_Diff(f0, f0.FilterPermit(h1));
706
+ if(f0 != CtoI(0))
707
+ {
708
+ f1 = CtoI_Diff(f1, f1.FilterPermit(h1));
709
+ f2 = (f0 + f1).FreqPatM(Val);
710
+ h = CtoI_Union(h, CtoI_Diff(f2, f2.FilterPermit(h1)));
711
+ }
712
+ }
713
+
714
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_FPM, ax, Val, h);
715
+ }
716
+
717
+ CtoI CtoI::FreqPatC(int Val) const
718
+ {
719
+ if(*this == CtoI_Null()) return *this;
720
+ if(IsConst()) return (GetInt() >= Val)? CtoI(1): CtoI(0);
721
+
722
+ int ax = _zbdd.GetID();
723
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_FPC, ax, Val);
724
+
725
+ int top = TopItem();
726
+ CtoI f1 = Factor1(top);
727
+
728
+ CtoI f = f1;
729
+ int tv = 1 << f.TopDigit();
730
+ CtoI f2 = f1;
731
+ if(tv -(tv>>1) < Val)
732
+ {
733
+ tv = 0;
734
+ while(f != CtoI(0))
735
+ {
736
+ int d = f.TopDigit();
737
+ CtoI fd = f.Digit(d);
738
+ if(d & 1)
739
+ {
740
+ tv -= fd.GetZBDD().Card() << d;
741
+ if(tv >= Val) break;
742
+ }
743
+ else
744
+ {
745
+ tv += fd.GetZBDD().Card() << d;
746
+ if((tv>>1) >= Val) break;
747
+ }
748
+ f -= fd.ShiftDigit(d);
749
+ }
750
+ if(tv < Val) f2 = CtoI(0);
751
+ }
752
+
753
+ CtoI h1 = f2.FreqPatC(Val);
754
+ CtoI h = h1.AffixVar(top);
755
+ CtoI f0 = Factor0(top);
756
+ if(f0 != CtoI(0))
757
+ {
758
+ h1 -= h1.FilterPermit(f0);
759
+ h = CtoI_Union(h, (f0 + f1).FreqPatC(Val).FilterElse(h1));
760
+ }
761
+
762
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_FPC, ax, Val, h);
763
+ }
764
+
765
+ //----------- External functions -----------
766
+
767
+ CtoI operator+(const CtoI& a, const CtoI& b)
768
+ {
769
+ CtoI c = CtoI_Intsec(a, b);
770
+ CtoI s = CtoI_Diff(CtoI_Union(a, b), c);
771
+ if(c == 0) return s;
772
+ if(s == CtoI_Null()) return s;
773
+ BDD_RECUR_INC;
774
+ CtoI h = s - c.ShiftDigit(1);
775
+ BDD_RECUR_DEC;
776
+ return h;
777
+ }
778
+
779
+ CtoI operator-(const CtoI& a, const CtoI& b)
780
+ {
781
+ CtoI c = CtoI_Diff(b, a);
782
+ CtoI s = CtoI_Union(CtoI_Diff(a, b), c);
783
+ if(c == 0) return s;
784
+ if(s == CtoI_Null()) return s;
785
+ BDD_RECUR_INC;
786
+ CtoI h = s + c.ShiftDigit(1);
787
+ BDD_RECUR_DEC;
788
+ return h;
789
+ }
790
+
791
+ CtoI operator *(const CtoI& ac, const CtoI& bc)
792
+ {
793
+ if(ac == 1) return bc;
794
+ if(bc == 1) return ac;
795
+ if(ac == CtoI_Null()) return ac;
796
+ if(bc == CtoI_Null()) return bc;
797
+ if(ac == 0) return 0;
798
+ if(bc == 0) return 0;
799
+
800
+ CtoI a = ac; CtoI b = bc;
801
+ int atop = a.Top(); int btop = b.Top();
802
+ if(BDD_LevOfVar(atop) < BDD_LevOfVar(btop))
803
+ {
804
+ a = bc; b = ac;
805
+ atop = a.Top(); btop = b.Top();
806
+ }
807
+
808
+ bddword ax = a._zbdd.GetID();
809
+ bddword bx = b._zbdd.GetID();
810
+ if(atop == btop && ax < bx)
811
+ {
812
+ a = bc; b = ac;
813
+ ax = a._zbdd.GetID(); bx = b._zbdd.GetID();
814
+ }
815
+
816
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_MULT, ax, bx);
817
+
818
+ CtoI a0 = a.Factor0(atop);
819
+ CtoI a1 = a.Factor1(atop);
820
+ CtoI c;
821
+ if(atop != btop)
822
+ {
823
+ if(BDD_LevOfVar(atop) <= BDD_TopLev())
824
+ c = CtoI_Union(a0*b, (a1*b).AffixVar(atop));
825
+ else c = a0*b + (a1*b).TimesSysVar(atop);
826
+ }
827
+ else
828
+ {
829
+ CtoI b0 = b.Factor0(atop);
830
+ CtoI b1 = b.Factor1(atop);
831
+ if(BDD_LevOfVar(atop) <= BDD_TopLev())
832
+ c = CtoI_Union(a0*b0, (a1*b0 + a0*b1 + a1*b1).AffixVar(atop));
833
+ else if(atop > 1)
834
+ c = a0*b0 + (a1*b0 + a0*b1).TimesSysVar(atop)
835
+ + (a1*b1).TimesSysVar(atop - 1);
836
+ else BDDerr("CtoI::operator*(): SysVar overflow.");
837
+ }
838
+
839
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_MULT, ax, bx, c);
840
+ }
841
+
842
+ CtoI operator /(const CtoI& ac, const CtoI& bc)
843
+ {
844
+ if(ac == CtoI_Null()) return ac;
845
+ if(bc == CtoI_Null()) return bc;
846
+ if(ac == 0) return 0;
847
+ if(ac == bc) return 1;
848
+ if(bc == 0) BDDerr("CtoI::operator/(): Divide by zero.");
849
+
850
+ CtoI a = ac; CtoI b = bc;
851
+ bddword ax = a._zbdd.GetID();
852
+ bddword bx = b._zbdd.GetID();
853
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_DIV, ax, bx);
854
+
855
+ int v = b.TopItem();
856
+ CtoI c;
857
+ if(v == 0)
858
+ {
859
+ if(b.TopDigit() & 1) { a = -a; b = -b; }
860
+ if(b == 1) return a;
861
+ CtoI p = a.FilterThen(CtoI_GT(a, 0));
862
+ if(a != p) c = (p / b) - ((p - a)/ b);
863
+ else
864
+ {
865
+ int atd = a.TopDigit();
866
+ int btd = b.TopDigit();
867
+ if(atd < btd) return 0;
868
+ c = a.Digit(atd);
869
+ if(atd > btd) c = c.ShiftDigit(atd - btd - 2);
870
+ else
871
+ {
872
+ CtoI cond = CtoI_GE(a, c * b);
873
+ a = a.FilterThen(cond);
874
+ c = c.FilterThen(cond);
875
+ }
876
+ c += (a - c * b)/ b;
877
+ }
878
+ }
879
+ else
880
+ {
881
+ CtoI a0 = a.Factor0(v);
882
+ CtoI a1 = a.Factor1(v);
883
+ CtoI b0 = b.Factor0(v);
884
+ CtoI b1 = b.Factor1(v);
885
+
886
+ c = a1 / b1;
887
+ if(c != 0)
888
+ if(b0 != 0)
889
+ {
890
+ CtoI c0 = a0 / b0;
891
+ c = CtoI_ITE(CtoI_LT(c.Abs(), c0.Abs()), c, c0);
892
+ }
893
+ }
894
+
895
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_DIV, ax, bx, c);
896
+ }
897
+
898
+ CtoI CtoI_GT(const CtoI& ac, const CtoI& bc)
899
+ {
900
+ CtoI a = ac; CtoI b = bc;
901
+ CtoI open = CtoI_Union(a, b).NonZero();
902
+ CtoI awin = 0;
903
+ CtoI bwin = 0;
904
+ CtoI awin0, bwin0;
905
+
906
+ while(open != 0)
907
+ {
908
+ int atd = a.TopDigit();
909
+ int btd = b.TopDigit();
910
+ int td = (atd > btd)? atd: btd;
911
+ CtoI aa = a.Digit(td);
912
+ CtoI bb = b.Digit(td);
913
+ if(td & 1)
914
+ {
915
+ awin0 = CtoI_Diff(bb, aa);
916
+ bwin0 = CtoI_Diff(aa, bb);
917
+ }
918
+ else
919
+ {
920
+ awin0 = CtoI_Diff(aa, bb);
921
+ bwin0 = CtoI_Diff(bb, aa);
922
+ }
923
+ awin = CtoI_Union(awin, awin0);
924
+ open = CtoI_Diff(open, awin0);
925
+ bwin = CtoI_Union(bwin, bwin0);
926
+ open = CtoI_Diff(open, bwin0);
927
+ if(open == CtoI_Null()) return CtoI_Null();
928
+ if(td == 0) break;
929
+ a = CtoI_Diff(a, aa.ShiftDigit(td)).FilterThen(open);
930
+ b = CtoI_Diff(b, bb.ShiftDigit(td)).FilterThen(open);
931
+ }
932
+ return awin;
933
+ }
934
+
935
+ CtoI CtoI_GE(const CtoI& ac, const CtoI& bc)
936
+ {
937
+ CtoI a = ac; CtoI b = bc;
938
+ CtoI open = CtoI_Union(a, b).NonZero();
939
+ CtoI awin = 0;
940
+ CtoI bwin = 0;
941
+ CtoI awin0, bwin0;
942
+
943
+ while(open != 0)
944
+ {
945
+ int atd = a.TopDigit();
946
+ int btd = b.TopDigit();
947
+ int td = (atd > btd)? atd: btd;
948
+ CtoI aa = a.Digit(td);
949
+ CtoI bb = b.Digit(td);
950
+ if(td & 1)
951
+ {
952
+ awin0 = CtoI_Diff(bb, aa);
953
+ bwin0 = CtoI_Diff(aa, bb);
954
+ }
955
+ else
956
+ {
957
+ awin0 = CtoI_Diff(aa, bb);
958
+ bwin0 = CtoI_Diff(bb, aa);
959
+ }
960
+ awin = CtoI_Union(awin, awin0);
961
+ open = CtoI_Diff(open, awin0);
962
+ bwin = CtoI_Union(bwin, bwin0);
963
+ open = CtoI_Diff(open, bwin0);
964
+ if(open == CtoI_Null()) return CtoI_Null();
965
+ if(td == 0) break;
966
+ a = CtoI_Diff(a, aa.ShiftDigit(td)).FilterThen(open);
967
+ b = CtoI_Diff(b, bb.ShiftDigit(td)).FilterThen(open);
968
+ }
969
+ return CtoI_Union(awin, open);
970
+ }
971
+
972
+ static CtoI atoiX(char *, int, int);
973
+ static CtoI atoiX(char* s, int base, int blk)
974
+ {
975
+ int times = 1;
976
+ for(int i=0; i<blk; i++) times *= base;
977
+ CtoI shift = times;
978
+ int p = 0;
979
+ int len = strlen(s);
980
+ char *s0 = new char[blk + 1];
981
+ CtoI a = 0;
982
+ while(len - p > blk)
983
+ {
984
+ a *= shift;
985
+ strncpy(s0, s+p, blk);
986
+ a += CtoI((int)strtol(s0, 0, base));
987
+ p += blk;
988
+ }
989
+ if(len > blk)
990
+ {
991
+ times = 1;
992
+ for(int i=p; i<len; i++) times *= base;
993
+ a *= CtoI(times);
994
+ }
995
+ strncpy(s0, s+p, blk);
996
+ a += CtoI((int)strtol(s0, 0, base));
997
+ delete[] s0;
998
+ return a;
999
+ }
1000
+
1001
+ CtoI CtoI_atoi(char* s)
1002
+ {
1003
+ if(s[0] == '0')
1004
+ {
1005
+ switch(s[1])
1006
+ {
1007
+ case 'x':
1008
+ case 'X':
1009
+ return atoiX(s+2, 16, 7);
1010
+ case 'b':
1011
+ case 'B':
1012
+ return atoiX(s+2, 2, 30);
1013
+ default:
1014
+ ;
1015
+ }
1016
+ }
1017
+ return atoiX(s, 10, 7);
1018
+ }
1019
+
1020
+ CtoI CtoI_Meet(const CtoI& ac, const CtoI& bc)
1021
+ {
1022
+ if(ac == CtoI_Null()) return ac;
1023
+ if(bc == CtoI_Null()) return bc;
1024
+ if(ac == 0) return 0;
1025
+ if(bc == 0) return 0;
1026
+ if(ac == 1 && bc == 1) return 1;
1027
+
1028
+ CtoI a = ac; CtoI b = bc;
1029
+ int atop = ac.Top(); int btop = bc.Top();
1030
+ if(BDD_LevOfVar(atop) < BDD_LevOfVar(btop))
1031
+ {
1032
+ a = bc; b = ac;
1033
+ atop = a.Top(); btop = b.Top();
1034
+ }
1035
+
1036
+ bddword ax = a._zbdd.GetID();
1037
+ bddword bx = b._zbdd.GetID();
1038
+ if(atop == btop && ax < bx)
1039
+ {
1040
+ a = bc; b = ac;
1041
+ ax = a._zbdd.GetID(); bx = b._zbdd.GetID();
1042
+ }
1043
+
1044
+ CtoI_CACHE_CHK_RETURN(BC_CtoI_MEET, ax, bx);
1045
+
1046
+ CtoI a0 = a.Factor0(atop);
1047
+ CtoI a1 = a.Factor1(atop);
1048
+ CtoI c;
1049
+ if(atop != btop)
1050
+ {
1051
+ if(a.IsBool())
1052
+ c = CtoI_Meet(a0, b) + CtoI_Meet(a1, b);
1053
+ else c = CtoI_Meet(a0, b) + CtoI_Meet(a1, b).TimesSysVar(atop);
1054
+ }
1055
+ else
1056
+ {
1057
+ CtoI b0 = b.Factor0(atop);
1058
+ CtoI b1 = b.Factor1(atop);
1059
+ if(a.IsBool())
1060
+ c = CtoI_Union(
1061
+ CtoI_Meet(a0, b0) + CtoI_Meet(a1, b0) + CtoI_Meet(a0, b1),
1062
+ CtoI_Meet(a1, b1).AffixVar(atop));
1063
+ else if(atop > 1)
1064
+ c = CtoI_Meet(a0, b0)
1065
+ + (CtoI_Meet(a1, b0) + CtoI_Meet(a0, b1)).TimesSysVar(atop)
1066
+ + CtoI_Meet(a1, b1).TimesSysVar(atop - 1);
1067
+ else BDDerr("CtoI_Meet(): SysVar overflow.");
1068
+ }
1069
+
1070
+ CtoI_CACHE_ENT_RETURN(BC_CtoI_MEET, ax, bx, c);
1071
+ }
1072
+