@@ -28,15 +28,18 @@ class FakeDevice(cirq.Device):
28
28
def test_wrapper_eq ():
29
29
q0 , q1 = cirq .LineQubit .range (2 )
30
30
eq = cirq .testing .EqualsTester ()
31
- eq .add_equality_group (cirq .CircuitDag .make_node (cirq .X (q0 )))
32
- eq .add_equality_group (cirq .CircuitDag .make_node (cirq .X (q0 )))
33
- eq .add_equality_group (cirq .CircuitDag .make_node (cirq .Y (q0 )))
34
- eq .add_equality_group (cirq .CircuitDag .make_node (cirq .X (q1 )))
31
+
32
+ with cirq .testing .assert_deprecated ('Use cirq contrib.Unique' , deadline = 'v0.16' , count = 4 ):
33
+ eq .add_equality_group (cirq .CircuitDag .make_node (cirq .X (q0 )))
34
+ eq .add_equality_group (cirq .CircuitDag .make_node (cirq .X (q0 )))
35
+ eq .add_equality_group (cirq .CircuitDag .make_node (cirq .Y (q0 )))
36
+ eq .add_equality_group (cirq .CircuitDag .make_node (cirq .X (q1 )))
35
37
36
38
37
39
def test_wrapper_cmp ():
38
- u0 = cirq .Unique (0 )
39
- u1 = cirq .Unique (1 )
40
+ with cirq .testing .assert_deprecated ('Use cirq contrib.Unique' , deadline = 'v0.16' , count = 2 ):
41
+ u0 = cirq .Unique (0 )
42
+ u1 = cirq .Unique (1 )
40
43
# The ordering of Unique instances is unpredictable
41
44
u0 , u1 = (u1 , u0 ) if u1 < u0 else (u0 , u1 )
42
45
assert u0 == u0
@@ -50,88 +53,107 @@ def test_wrapper_cmp():
50
53
51
54
52
55
def test_wrapper_cmp_failure ():
53
- with pytest .raises (TypeError ):
54
- _ = object () < cirq .Unique (1 )
55
- with pytest .raises (TypeError ):
56
- _ = cirq .Unique (1 ) < object ()
56
+ with cirq .testing .assert_deprecated ('Use cirq contrib.Unique' , deadline = 'v0.16' , count = 2 ):
57
+ with pytest .raises (TypeError ):
58
+ _ = object () < cirq .Unique (1 )
59
+ with pytest .raises (TypeError ):
60
+ _ = cirq .Unique (1 ) < object ()
57
61
58
62
59
63
def test_wrapper_repr ():
60
64
q0 = cirq .LineQubit (0 )
61
65
62
- node = cirq .CircuitDag .make_node (cirq .X (q0 ))
63
- assert repr (node ) == 'cirq.Unique(' + str (id (node )) + ', cirq.X(cirq.LineQubit(0)))'
66
+ with cirq .testing .assert_deprecated ('Use cirq contrib.Unique' , deadline = 'v0.16' ):
67
+ node = cirq .CircuitDag .make_node (cirq .X (q0 ))
68
+ assert repr (node ) == 'cirq.Unique(' + str (id (node )) + ', cirq.X(cirq.LineQubit(0)))'
64
69
65
70
66
71
def test_init ():
67
- dag = cirq .CircuitDag ()
68
- assert networkx .dag .is_directed_acyclic_graph (dag )
69
- assert list (dag .nodes ()) == []
70
- assert list (dag .edges ()) == []
72
+ with cirq .testing .assert_deprecated ('Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = 1 ):
73
+ dag = cirq .CircuitDag ()
74
+ assert networkx .dag .is_directed_acyclic_graph (dag )
75
+ assert list (dag .nodes ()) == []
76
+ assert list (dag .edges ()) == []
71
77
72
78
73
79
def test_append ():
74
80
q0 = cirq .LineQubit (0 )
75
- dag = cirq .CircuitDag ()
76
- dag .append (cirq .X (q0 ))
77
- dag .append (cirq .Y (q0 ))
78
- assert networkx .dag .is_directed_acyclic_graph (dag )
79
- assert len (dag .nodes ()) == 2
80
- assert [(n1 .val , n2 .val ) for n1 , n2 in dag .edges ()] == [(cirq .X (q0 ), cirq .Y (q0 ))]
81
+ with cirq .testing .assert_deprecated (
82
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
83
+ ):
84
+ dag = cirq .CircuitDag ()
85
+ dag .append (cirq .X (q0 ))
86
+ dag .append (cirq .Y (q0 ))
87
+ assert networkx .dag .is_directed_acyclic_graph (dag )
88
+ assert len (dag .nodes ()) == 2
89
+ assert [(n1 .val , n2 .val ) for n1 , n2 in dag .edges ()] == [(cirq .X (q0 ), cirq .Y (q0 ))]
81
90
82
91
83
92
def test_two_identical_ops ():
84
93
q0 = cirq .LineQubit (0 )
85
- dag = cirq .CircuitDag ()
86
- dag .append (cirq .X (q0 ))
87
- dag .append (cirq .Y (q0 ))
88
- dag .append (cirq .X (q0 ))
89
- assert networkx .dag .is_directed_acyclic_graph (dag )
90
- assert len (dag .nodes ()) == 3
91
- assert set ((n1 .val , n2 .val ) for n1 , n2 in dag .edges ()) == {
92
- (cirq .X (q0 ), cirq .Y (q0 )),
93
- (cirq .X (q0 ), cirq .X (q0 )),
94
- (cirq .Y (q0 ), cirq .X (q0 )),
95
- }
94
+ with cirq .testing .assert_deprecated (
95
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
96
+ ):
97
+ dag = cirq .CircuitDag ()
98
+ dag .append (cirq .X (q0 ))
99
+ dag .append (cirq .Y (q0 ))
100
+ dag .append (cirq .X (q0 ))
101
+ assert networkx .dag .is_directed_acyclic_graph (dag )
102
+ assert len (dag .nodes ()) == 3
103
+ assert set ((n1 .val , n2 .val ) for n1 , n2 in dag .edges ()) == {
104
+ (cirq .X (q0 ), cirq .Y (q0 )),
105
+ (cirq .X (q0 ), cirq .X (q0 )),
106
+ (cirq .Y (q0 ), cirq .X (q0 )),
107
+ }
96
108
97
109
98
110
def test_from_ops ():
99
111
q0 = cirq .LineQubit (0 )
100
- dag = cirq .CircuitDag .from_ops (cirq .X (q0 ), cirq .Y (q0 ))
101
- assert networkx .dag .is_directed_acyclic_graph (dag )
102
- assert len (dag .nodes ()) == 2
103
- assert [(n1 .val , n2 .val ) for n1 , n2 in dag .edges ()] == [(cirq .X (q0 ), cirq .Y (q0 ))]
112
+ with cirq .testing .assert_deprecated (
113
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
114
+ ):
115
+ dag = cirq .CircuitDag .from_ops (cirq .X (q0 ), cirq .Y (q0 ))
116
+ assert networkx .dag .is_directed_acyclic_graph (dag )
117
+ assert len (dag .nodes ()) == 2
118
+ assert [(n1 .val , n2 .val ) for n1 , n2 in dag .edges ()] == [(cirq .X (q0 ), cirq .Y (q0 ))]
104
119
105
120
106
121
def test_from_circuit ():
107
122
q0 = cirq .LineQubit (0 )
108
123
circuit = cirq .Circuit (cirq .X (q0 ), cirq .Y (q0 ))
109
- dag = cirq .CircuitDag .from_circuit (circuit )
110
- assert networkx .dag .is_directed_acyclic_graph (dag )
111
- assert len (dag .nodes ()) == 2
112
- assert [(n1 .val , n2 .val ) for n1 , n2 in dag .edges ()] == [(cirq .X (q0 ), cirq .Y (q0 ))]
113
- assert sorted (circuit .all_qubits ()) == sorted (dag .all_qubits ())
124
+ with cirq .testing .assert_deprecated (
125
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
126
+ ):
127
+ dag = cirq .CircuitDag .from_circuit (circuit )
128
+ assert networkx .dag .is_directed_acyclic_graph (dag )
129
+ assert len (dag .nodes ()) == 2
130
+ assert [(n1 .val , n2 .val ) for n1 , n2 in dag .edges ()] == [(cirq .X (q0 ), cirq .Y (q0 ))]
131
+ assert sorted (circuit .all_qubits ()) == sorted (dag .all_qubits ())
114
132
115
133
116
134
def test_to_empty_circuit ():
117
135
circuit = cirq .Circuit ()
118
- dag = cirq .CircuitDag .from_circuit (circuit )
119
- assert networkx .dag .is_directed_acyclic_graph (dag )
120
- assert circuit == dag .to_circuit ()
136
+ with cirq .testing .assert_deprecated ('Use cirq contrib.CircuitDag' , deadline = 'v0.16' ):
137
+ dag = cirq .CircuitDag .from_circuit (circuit )
138
+ assert networkx .dag .is_directed_acyclic_graph (dag )
139
+ assert circuit == dag .to_circuit ()
121
140
122
141
123
142
def test_to_circuit ():
124
143
q0 = cirq .LineQubit (0 )
125
144
circuit = cirq .Circuit (cirq .X (q0 ), cirq .Y (q0 ))
126
- dag = cirq .CircuitDag .from_circuit (circuit )
145
+ with cirq .testing .assert_deprecated (
146
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
147
+ ):
148
+ dag = cirq .CircuitDag .from_circuit (circuit )
127
149
128
- assert networkx .dag .is_directed_acyclic_graph (dag )
129
- # Only one possible output circuit for this simple case
130
- assert circuit == dag .to_circuit ()
150
+ assert networkx .dag .is_directed_acyclic_graph (dag )
151
+ # Only one possible output circuit for this simple case
152
+ assert circuit == dag .to_circuit ()
131
153
132
- cirq .testing .assert_allclose_up_to_global_phase (
133
- circuit .unitary (), dag .to_circuit ().unitary (), atol = 1e-7
134
- )
154
+ cirq .testing .assert_allclose_up_to_global_phase (
155
+ circuit .unitary (), dag .to_circuit ().unitary (), atol = 1e-7
156
+ )
135
157
136
158
137
159
def test_equality ():
@@ -156,43 +178,49 @@ def test_equality():
156
178
)
157
179
158
180
eq = cirq .testing .EqualsTester ()
159
- eq .make_equality_group (
160
- lambda : cirq .CircuitDag .from_circuit (circuit1 ),
161
- lambda : cirq .CircuitDag .from_circuit (circuit2 ),
162
- )
163
- eq .add_equality_group (cirq .CircuitDag .from_circuit (circuit3 ))
164
- eq .add_equality_group (cirq .CircuitDag .from_circuit (circuit4 ))
181
+ with cirq .testing .assert_deprecated (
182
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
183
+ ):
184
+ eq .make_equality_group (
185
+ lambda : cirq .CircuitDag .from_circuit (circuit1 ),
186
+ lambda : cirq .CircuitDag .from_circuit (circuit2 ),
187
+ )
188
+ eq .add_equality_group (cirq .CircuitDag .from_circuit (circuit3 ))
189
+ eq .add_equality_group (cirq .CircuitDag .from_circuit (circuit4 ))
165
190
166
191
167
192
def test_larger_circuit ():
168
- q0 , q1 , q2 , q3 = [
169
- cirq .GridQubit (0 , 5 ),
170
- cirq .GridQubit (1 , 5 ),
171
- cirq .GridQubit (2 , 5 ),
172
- cirq .GridQubit (3 , 5 ),
173
- ]
174
- # This circuit does not have CZ gates on adjacent qubits because the order
175
- # dag.to_circuit() would append them is non-deterministic.
176
- circuit = cirq .Circuit (
177
- cirq .X (q0 ),
178
- cirq .CZ (q1 , q2 ),
179
- cirq .CZ (q0 , q1 ),
180
- cirq .Y (q0 ),
181
- cirq .Z (q0 ),
182
- cirq .CZ (q1 , q2 ),
183
- cirq .X (q0 ),
184
- cirq .Y (q0 ),
185
- cirq .CZ (q0 , q1 ),
186
- cirq .T (q3 ),
187
- strategy = cirq .InsertStrategy .EARLIEST ,
188
- )
189
-
190
- dag = cirq .CircuitDag .from_circuit (circuit )
191
-
192
- assert networkx .dag .is_directed_acyclic_graph (dag )
193
- # Operation order within a moment is non-deterministic
194
- # but text diagrams still look the same.
195
- desired = """
193
+ with cirq .testing .assert_deprecated (
194
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
195
+ ):
196
+ q0 , q1 , q2 , q3 = [
197
+ cirq .GridQubit (0 , 5 ),
198
+ cirq .GridQubit (1 , 5 ),
199
+ cirq .GridQubit (2 , 5 ),
200
+ cirq .GridQubit (3 , 5 ),
201
+ ]
202
+ # This circuit does not have CZ gates on adjacent qubits because the order
203
+ # dag.to_circuit() would append them is non-deterministic.
204
+ circuit = cirq .Circuit (
205
+ cirq .X (q0 ),
206
+ cirq .CZ (q1 , q2 ),
207
+ cirq .CZ (q0 , q1 ),
208
+ cirq .Y (q0 ),
209
+ cirq .Z (q0 ),
210
+ cirq .CZ (q1 , q2 ),
211
+ cirq .X (q0 ),
212
+ cirq .Y (q0 ),
213
+ cirq .CZ (q0 , q1 ),
214
+ cirq .T (q3 ),
215
+ strategy = cirq .InsertStrategy .EARLIEST ,
216
+ )
217
+
218
+ dag = cirq .CircuitDag .from_circuit (circuit )
219
+
220
+ assert networkx .dag .is_directed_acyclic_graph (dag )
221
+ # Operation order within a moment is non-deterministic
222
+ # but text diagrams still look the same.
223
+ desired = """
196
224
(0, 5): ───X───@───Y───Z───X───Y───@───
197
225
│ │
198
226
(1, 5): ───@───@───@───────────────@───
@@ -201,20 +229,26 @@ def test_larger_circuit():
201
229
202
230
(3, 5): ───T───────────────────────────
203
231
"""
204
- cirq .testing .assert_has_diagram (circuit , desired )
205
- cirq .testing .assert_has_diagram (dag .to_circuit (), desired )
232
+ cirq .testing .assert_has_diagram (circuit , desired )
233
+ cirq .testing .assert_has_diagram (dag .to_circuit (), desired )
206
234
207
- cirq .testing .assert_allclose_up_to_global_phase (
208
- circuit .unitary (), dag .to_circuit ().unitary (), atol = 1e-7
209
- )
235
+ cirq .testing .assert_allclose_up_to_global_phase (
236
+ circuit .unitary (), dag .to_circuit ().unitary (), atol = 1e-7
237
+ )
210
238
211
239
212
240
@pytest .mark .parametrize ('circuit' , [cirq .testing .random_circuit (10 , 10 , 0.5 ) for _ in range (3 )])
213
241
def test_is_maximalist (circuit ):
214
- dag = cirq .CircuitDag .from_circuit (circuit )
215
- transitive_closure = networkx .dag .transitive_closure (dag )
216
- assert cirq .CircuitDag (incoming_graph_data = transitive_closure ) == dag
217
- assert not any (dag .has_edge (b , a ) for a , b in itertools .combinations (dag .ordered_nodes (), 2 ))
242
+ # This creates a number of Unique classes so the count is not consistent.
243
+ with cirq .testing .assert_deprecated (
244
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
245
+ ):
246
+ dag = cirq .CircuitDag .from_circuit (circuit )
247
+ transitive_closure = networkx .dag .transitive_closure (dag )
248
+ assert cirq .CircuitDag (incoming_graph_data = transitive_closure ) == dag
249
+ assert not any (
250
+ dag .has_edge (b , a ) for a , b in itertools .combinations (dag .ordered_nodes (), 2 )
251
+ )
218
252
219
253
220
254
def _get_circuits_and_is_blockers ():
@@ -230,12 +264,16 @@ def _get_circuits_and_is_blockers():
230
264
231
265
@pytest .mark .parametrize ('circuit, is_blocker' , _get_circuits_and_is_blockers ())
232
266
def test_findall_nodes_until_blocked (circuit , is_blocker ):
233
- dag = cirq .CircuitDag .from_circuit (circuit )
234
- all_nodes = list (dag .ordered_nodes ())
235
- found_nodes = list (dag .findall_nodes_until_blocked (is_blocker ))
236
- assert not any (dag .has_edge (b , a ) for a , b in itertools .combinations (found_nodes , 2 ))
237
-
238
- blocking_nodes = set (node for node in all_nodes if is_blocker (node .val ))
239
- blocked_nodes = blocking_nodes .union (* (dag .succ [node ] for node in blocking_nodes ))
240
- expected_nodes = set (all_nodes ) - blocked_nodes
241
- assert sorted (found_nodes ) == sorted (expected_nodes )
267
+ # This creates a number of Unique classes so the count is not consistent.
268
+ with cirq .testing .assert_deprecated (
269
+ 'Use cirq contrib.CircuitDag' , deadline = 'v0.16' , count = None
270
+ ):
271
+ dag = cirq .CircuitDag .from_circuit (circuit )
272
+ all_nodes = list (dag .ordered_nodes ())
273
+ found_nodes = list (dag .findall_nodes_until_blocked (is_blocker ))
274
+ assert not any (dag .has_edge (b , a ) for a , b in itertools .combinations (found_nodes , 2 ))
275
+
276
+ blocking_nodes = set (node for node in all_nodes if is_blocker (node .val ))
277
+ blocked_nodes = blocking_nodes .union (* (dag .succ [node ] for node in blocking_nodes ))
278
+ expected_nodes = set (all_nodes ) - blocked_nodes
279
+ assert sorted (found_nodes ) == sorted (expected_nodes )
0 commit comments