Skip to content

Commit bac16b0

Browse files
committed
Added tests for removing unused nodes.
1 parent 8caa909 commit bac16b0

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed

tests/test_compression.py

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import klay
2+
3+
4+
def test_propagate_simple_true():
5+
c = klay.Circuit()
6+
t = c.true_node()
7+
f = c.false_node()
8+
l1, l2 = c.literal_node(1), c.literal_node(2)
9+
10+
# test on input node
11+
assert c.nb_nodes() == 4
12+
and_node1 = c.and_node([t, l1]) # l1
13+
and_node2 = c.and_node([l1, t]) # l1
14+
or_node1 = c.or_node([l1, t]) # t
15+
or_node2 = c.or_node([t, l1]) # t
16+
assert c.nb_nodes() == 4
17+
18+
# test on intermediate node
19+
l1_l2 = c.and_node([l1, l2])
20+
assert c.nb_nodes() == 5
21+
and_node1 = c.and_node([t, l1_l2]) # l1
22+
and_node2 = c.and_node([l1_l2, t]) # l1
23+
or_node1 = c.or_node([l1_l2, t]) # t
24+
or_node2 = c.or_node([t, l1_l2]) # t
25+
assert c.nb_nodes() == 5
26+
27+
28+
def test_propagate_simple_false():
29+
c = klay.Circuit()
30+
t = c.true_node()
31+
f = c.false_node()
32+
l1, l2 = c.literal_node(1), c.literal_node(2)
33+
34+
# test on input node
35+
assert c.nb_nodes() == 4
36+
and_node1 = c.and_node([f, l1]) # f
37+
and_node2 = c.and_node([l1, f]) # f
38+
or_node1 = c.or_node([l1, f]) # l1
39+
or_node2 = c.or_node([f, l1]) # l1
40+
assert c.nb_nodes() == 4
41+
42+
# test on intermediate node
43+
l1_l2 = c.and_node([l1, l2])
44+
assert c.nb_nodes() == 5
45+
and_node1 = c.and_node([f, l1_l2]) # f
46+
and_node2 = c.and_node([l1_l2, f]) # f
47+
or_node1 = c.or_node([l1_l2, f]) # l1 & l2
48+
or_node2 = c.or_node([f, l1_l2]) # l1 & l2
49+
assert c.nb_nodes() == 5
50+
51+
52+
def test_propagate_simple_ternary():
53+
""" test ternary nodes """
54+
c = klay.Circuit()
55+
t = c.true_node()
56+
f = c.false_node()
57+
l1, l2 = c.literal_node(1), c.literal_node(2)
58+
59+
# test on true
60+
assert c.nb_nodes() == 4
61+
and_node1 = c.and_node([t, l1, l2]) # l1 & l2
62+
assert c.nb_nodes() == 5
63+
and_node2 = c.and_node([l2, t, l1]) # l1 & l2
64+
assert c.nb_nodes() == 5
65+
or_node1 = c.or_node([l1, t, l2]) # t
66+
assert c.nb_nodes() == 5
67+
or_node2 = c.or_node([l2, l1, t]) # t
68+
assert c.nb_nodes() == 5
69+
70+
# test on false
71+
and_node3 = c.and_node([f, l1, l2]) # f
72+
assert c.nb_nodes() == 5
73+
and_node4 = c.and_node([l2, f, l1]) # f
74+
assert c.nb_nodes() == 5
75+
or_node3 = c.or_node([l1, f, l2]) # l1 | l2
76+
assert c.nb_nodes() == 8, "Expected 8 nodes instead of 6, because l1 and l2 require dummy nodes for the OR-node."
77+
or_node4 = c.or_node([l2, l1, f]) # l1 | l2
78+
assert c.nb_nodes() == 8
79+
80+
81+
def test_removing_useless_nodes1():
82+
c = klay.Circuit()
83+
l1, l2, l3 = c.literal_node(1), c.literal_node(2), c.literal_node(3)
84+
assert c.nb_nodes() == 3
85+
and1 = c.and_node([l1, l2])
86+
assert c.nb_nodes() == 4
87+
or1 = c.or_node([and1, l3])
88+
assert c.nb_nodes() == 6 # or1 + 1 dummy node
89+
c.set_root(and1)
90+
# and1 is root node; but or1 is in a layer above, unused.
91+
assert c.nb_nodes() == 6
92+
c.remove_unused_nodes() # should remove or1 + 1 dummy node
93+
assert c.nb_nodes() == 4, f"Expected 4 nodes instead of {c.nb_nodes()}"
94+
95+
96+
def test_removing_useless_nodes2():
97+
c = klay.Circuit()
98+
l1, l2, l3 = c.literal_node(1), c.literal_node(2), c.literal_node(3)
99+
assert c.nb_nodes() == 3
100+
and1 = c.and_node([l1, l2])
101+
assert c.nb_nodes() == 4
102+
or1 = c.or_node([and1, l3])
103+
assert c.nb_nodes() == 6 # or1 + 1 dummy node
104+
and2 = c.and_node([l1, l3]) # useless
105+
assert c.nb_nodes() == 7
106+
or2 = c.or_node([l1, l2]) # useless
107+
assert c.nb_nodes() == 10 # or2 + 2 dummy nodes
108+
c.set_root(or1)
109+
c.remove_unused_nodes() # should remove `and2`, `or2`, and 2 dummy nodes
110+
assert c.nb_nodes() == 6, f"Expected 5 nodes instead of {c.nb_nodes()}"

0 commit comments

Comments
 (0)