Skip to content

Commit b45e63d

Browse files
authored
Add support for deep=True to cirq.synchronize_terminal_measurements transformer (#5118)
- Adds support to recursively run `cirq.synchronize_terminal_measurements` transformer on circuits wrapped inside a circuit operation by setting deep=True in transformer context. - Part of #5039
1 parent 155f607 commit b45e63d

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

cirq-core/cirq/transformers/synchronize_terminal_measurements.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def find_terminal_measurements(
5858
return terminal_measurements
5959

6060

61-
@transformer_api.transformer
61+
@transformer_api.transformer(add_deep_support=True)
6262
def synchronize_terminal_measurements(
6363
circuit: 'cirq.AbstractCircuit',
6464
*,

cirq-core/cirq/transformers/synchronize_terminal_measurements_test.py

+26-8
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,35 @@
1818

1919

2020
def assert_optimizes(before, after, measure_only_moment=True, with_context=False):
21-
transformed_circuit = (
22-
cirq.synchronize_terminal_measurements(before, after_other_operations=measure_only_moment)
23-
if not with_context
24-
else cirq.synchronize_terminal_measurements(
25-
before,
26-
context=cirq.TransformerContext(tags_to_ignore=(NO_COMPILE_TAG,)),
27-
after_other_operations=measure_only_moment,
28-
)
21+
context = cirq.TransformerContext(tags_to_ignore=(NO_COMPILE_TAG,)) if with_context else None
22+
transformed_circuit = cirq.synchronize_terminal_measurements(
23+
before, context=context, after_other_operations=measure_only_moment
2924
)
3025
cirq.testing.assert_same_circuits(transformed_circuit, after)
3126

27+
# Test nested circuit ops.
28+
context = cirq.TransformerContext(
29+
tags_to_ignore=("ignore",) + tuple([NO_COMPILE_TAG] if with_context else []), deep=True
30+
)
31+
c_nested = cirq.Circuit(
32+
before,
33+
cirq.CircuitOperation(before.freeze()).repeat(5).with_tags("ignore"),
34+
before,
35+
cirq.CircuitOperation(before.freeze()).repeat(6).with_tags("preserve_tag"),
36+
before,
37+
)
38+
c_expected = cirq.Circuit(
39+
before,
40+
cirq.CircuitOperation(before.freeze()).repeat(5).with_tags("ignore"),
41+
before,
42+
cirq.CircuitOperation(after.freeze()).repeat(6).with_tags("preserve_tag"),
43+
after,
44+
)
45+
transformed_circuit = cirq.synchronize_terminal_measurements(
46+
c_nested, context=context, after_other_operations=measure_only_moment
47+
)
48+
cirq.testing.assert_same_circuits(transformed_circuit, c_expected)
49+
3250

3351
def test_no_move():
3452
q1 = cirq.NamedQubit('q1')

0 commit comments

Comments
 (0)