-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathpyiter.i
108 lines (95 loc) · 2.86 KB
/
pyiter.i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//////////////////////////////////////////////
//
// This file contains the neat shots of python code needed to get the various
// iterators working. The iterators themselves are created by DdNode or NodePair
//
//////////////////////////////////////////////
#if CUDDVER >= 0x020400
%pythoncode %{
cudd_version = 0x020400
%}
#else
%pythoncode %{
cudd_version = 0
%}
#endif
%pythoncode %{
###############################
#
# iter_meth is used to set, surprise, the iteration method for DdNodes
# 0 -- over cubes
# 1 -- over nodes
# 2 -- over primes
# Note that iteration over primes is only available in CUDD >= 2.4.0
#
################################
iter_meth = 0
def set_iter_meth(meth,verbose = False):
global iter_meth
methods = ["cubes", "nodes", "primes"]
if verbose:
print("Setting iter method to iterate over %s", methods[meth])
iter_meth = meth
class ForeachCubeIterator:
def __init__(self,mgr,Dd):
self.gen = DdGen(mgr,Dd,iter_meth)
self.node = Dd
self.done = 0
self.mgr = mgr
self.ret_val = Dd.FirstCube(self.gen,self.mgr)
if not self.ret_val[0]: self.done = 1
def __iter__(self):
return self
def __next__(self):
if self.done: raise StopIteration
to_ret = self.ret_val[1:]
self.ret_val = self.node.NextCube(self.gen,self.mgr)
if not self.ret_val[0]:
self.done = 1
return to_ret
next = __next__ # Python 2.7
class ForeachNodeIterator:
def __init__(self,mgr,Dd):
self.gen = DdGen(mgr,Dd,iter_meth)
self.node = Dd
self.done = 0
self.ret_val = Dd.FirstNode(self.gen)
if not self.ret_val[0]: self.done = 1
def __iter__(self):
return self
def __next__(self):
if self.done: raise StopIteration
to_ret = self.ret_val[1]
self.ret_val = self.node.NextNode(self.gen)
if not self.ret_val[0]:
self.done = 1
return to_ret
next = __next__ # Python 2.7
class ForeachPrimeIterator:
def __init__(self,mgr,npair):
global cudd_version
if cudd_version < 0x020400:
print("CUDD versions < 2.4.0 do not support iteration over primes")
raise RuntimeError
self.gen = DdGen(mgr,npair.LOWER(), iter_meth, npair.UPPER())
self.npair = npair
self.done = 0
self.ret_val = npair.FirstPrime(self.gen)
if not self.ret_val[0]: self.done = 1
def __iter__(self):
return self
def __next__(self):
if self.done: raise StopIteration
to_ret = self.ret_val[1:]
self.ret_val = self.npair.NextPrime(self.gen)
if not self.ret_val[0]:
self.done = 1
return to_ret
next = __next__ # Python 2.7
def cube_tuple_to_str(cube_tup):
res = ""
for char in cube_tup:
if char == 2: res += '-'
else: res += str(char)
return res
%}