cirq-core 1.7.0.dev20250728175235__py3-none-any.whl → 1.7.0.dev20250801200422__py3-none-any.whl
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.
Potentially problematic release.
This version of cirq-core might be problematic. Click here for more details.
- cirq/_version.py +1 -1
- cirq/_version_test.py +1 -1
- cirq/transformers/dynamical_decoupling.py +8 -45
- cirq/transformers/dynamical_decoupling_test.py +68 -46
- {cirq_core-1.7.0.dev20250728175235.dist-info → cirq_core-1.7.0.dev20250801200422.dist-info}/METADATA +1 -1
- {cirq_core-1.7.0.dev20250728175235.dist-info → cirq_core-1.7.0.dev20250801200422.dist-info}/RECORD +9 -9
- {cirq_core-1.7.0.dev20250728175235.dist-info → cirq_core-1.7.0.dev20250801200422.dist-info}/WHEEL +0 -0
- {cirq_core-1.7.0.dev20250728175235.dist-info → cirq_core-1.7.0.dev20250801200422.dist-info}/licenses/LICENSE +0 -0
- {cirq_core-1.7.0.dev20250728175235.dist-info → cirq_core-1.7.0.dev20250801200422.dist-info}/top_level.txt +0 -0
cirq/_version.py
CHANGED
cirq/_version_test.py
CHANGED
|
@@ -149,26 +149,6 @@ def _merge_single_qubit_ops_to_phxz(
|
|
|
149
149
|
return gate.on(q)
|
|
150
150
|
|
|
151
151
|
|
|
152
|
-
def _try_merge_single_qubit_ops_of_two_moments(m1: Moment, m2: Moment) -> tuple[Moment, ...]:
|
|
153
|
-
"""Merge single qubit ops of 2 moments if possible, returns 2 moments otherwise."""
|
|
154
|
-
for q in m1.qubits & m2.qubits:
|
|
155
|
-
op1 = m1.operation_at(q)
|
|
156
|
-
op2 = m2.operation_at(q)
|
|
157
|
-
if any(
|
|
158
|
-
not (_is_single_qubit_operation(op) and has_unitary(op))
|
|
159
|
-
for op in [op1, op2]
|
|
160
|
-
if op is not None
|
|
161
|
-
):
|
|
162
|
-
return (m1, m2)
|
|
163
|
-
merged_ops: set[ops.Operation] = set()
|
|
164
|
-
# Merge all operators on q to a single op.
|
|
165
|
-
for q in m1.qubits | m2.qubits:
|
|
166
|
-
# ops_on_q may contain 1 op or 2 ops.
|
|
167
|
-
ops_on_q = [op for op in [m.operation_at(q) for m in [m1, m2]] if op is not None]
|
|
168
|
-
merged_ops.add(_merge_single_qubit_ops_to_phxz(q, tuple(ops_on_q)))
|
|
169
|
-
return (Moment(merged_ops),)
|
|
170
|
-
|
|
171
|
-
|
|
172
152
|
def _calc_pulled_through(moment: Moment, input_pauli_ops: ops.PauliString) -> ops.PauliString:
|
|
173
153
|
"""Calculates the pulled_through such that circuit(input_pauli_ops, moment.clifford_ops) is
|
|
174
154
|
equivalent to circuit(moment.clifford_ops, pulled_through).
|
|
@@ -251,7 +231,7 @@ def add_dynamical_decoupling(
|
|
|
251
231
|
# (pulled_through, moment) -> (new_moment, updated_moment, updated_pulled_through)
|
|
252
232
|
# Moments structure changes are split into 3 steps:
|
|
253
233
|
# 1, (..., last_moment, pulled_through1, moment, ...)
|
|
254
|
-
# -> (...,
|
|
234
|
+
# -> (..., last_moment, new_moment or None, pulled_through2, moment, ...)
|
|
255
235
|
# 2, (..., pulled_through2, moment, ...) -> (..., pulled_through3, updated_moment, ...)
|
|
256
236
|
# 3, (..., pulled_through3, updated_moment, ...)
|
|
257
237
|
# -> (..., updated_moment, pulled_through4, ...)
|
|
@@ -261,7 +241,7 @@ def add_dynamical_decoupling(
|
|
|
261
241
|
# unitary representation (e.g., measure gates). If there are remaining pulled through ops,
|
|
262
242
|
# insert into a new moment before current moment.
|
|
263
243
|
stop_pulling_through_qubits: set[ops.Qid] = _get_stop_qubits(moment)
|
|
264
|
-
new_moment_ops = []
|
|
244
|
+
new_moment_ops: list[ops.Operation] = []
|
|
265
245
|
for q in stop_pulling_through_qubits:
|
|
266
246
|
# Insert the remaining pulled_through
|
|
267
247
|
remaining_pulled_through_gate = pulled_through.get(q)
|
|
@@ -271,24 +251,11 @@ def add_dynamical_decoupling(
|
|
|
271
251
|
dd_iter_by_qubits[q] = cycle(base_dd_sequence)
|
|
272
252
|
# Need to insert a new moment before current moment
|
|
273
253
|
if new_moment_ops:
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
transformed_moments.append(moments_to_be_appended[0])
|
|
280
|
-
else: # Fill insertable idle moments in the new moment using dd sequence
|
|
281
|
-
for q in orig_circuit.all_qubits() - stop_pulling_through_qubits:
|
|
282
|
-
if (
|
|
283
|
-
busy_moment_range_by_qubit[q][0]
|
|
284
|
-
< moment_id
|
|
285
|
-
<= busy_moment_range_by_qubit[q][1]
|
|
286
|
-
):
|
|
287
|
-
new_moment_ops.append(_update_pulled_through(q, next(dd_iter_by_qubits[q])))
|
|
288
|
-
moments_to_be_appended = _try_merge_single_qubit_ops_of_two_moments(
|
|
289
|
-
transformed_moments.pop(), Moment(new_moment_ops)
|
|
290
|
-
)
|
|
291
|
-
transformed_moments.extend(moments_to_be_appended)
|
|
254
|
+
# Fill insertable idle moments in the new moment using dd sequence
|
|
255
|
+
for q in orig_circuit.all_qubits() - stop_pulling_through_qubits:
|
|
256
|
+
if busy_moment_range_by_qubit[q][0] < moment_id <= busy_moment_range_by_qubit[q][1]:
|
|
257
|
+
new_moment_ops.append(_update_pulled_through(q, next(dd_iter_by_qubits[q])))
|
|
258
|
+
transformed_moments.append(Moment(new_moment_ops))
|
|
292
259
|
|
|
293
260
|
# Step 2, calc updated_moment with insertions / merges.
|
|
294
261
|
updated_moment_ops: set[cirq.Operation] = set()
|
|
@@ -332,10 +299,6 @@ def add_dynamical_decoupling(
|
|
|
332
299
|
for affected_q, combined_op_in_pauli in pulled_through.items():
|
|
333
300
|
ending_moment_ops.append(combined_op_in_pauli.on(affected_q))
|
|
334
301
|
if ending_moment_ops:
|
|
335
|
-
transformed_moments.
|
|
336
|
-
_try_merge_single_qubit_ops_of_two_moments(
|
|
337
|
-
transformed_moments.pop(), Moment(ending_moment_ops)
|
|
338
|
-
)
|
|
339
|
-
)
|
|
302
|
+
transformed_moments.append(Moment(ending_moment_ops))
|
|
340
303
|
|
|
341
304
|
return Circuit.from_moments(*transformed_moments)
|
|
@@ -533,9 +533,9 @@ def test_multiple_clifford_pieces_case1():
|
|
|
533
533
|
│
|
|
534
534
|
b: ───H───H───H───H───@^0.5───H───H───H───H───
|
|
535
535
|
Output:
|
|
536
|
-
a: ───H───X───H───
|
|
537
|
-
|
|
538
|
-
b: ───H───H───H───H
|
|
536
|
+
a: ───H───X───H───X───Y───@───────X───H───X───PhXZ(a=0.5,x=0.5,z=-1)───
|
|
537
|
+
│
|
|
538
|
+
b: ───H───H───H───H───────@^0.5───H───H───H───H────────────────────────
|
|
539
539
|
"""
|
|
540
540
|
a = cirq.NamedQubit('a')
|
|
541
541
|
b = cirq.NamedQubit('b')
|
|
@@ -551,22 +551,11 @@ def test_multiple_clifford_pieces_case1():
|
|
|
551
551
|
cirq.Moment(H(b)),
|
|
552
552
|
cirq.Moment(H(a), H(b)),
|
|
553
553
|
),
|
|
554
|
-
expected_circuit=
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
H(b), cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0, z_exponent=-1).on(a)
|
|
560
|
-
),
|
|
561
|
-
cirq.Moment(CZPowGate(exponent=0.5).on(a, b)),
|
|
562
|
-
cirq.Moment(H(b), X(a)),
|
|
563
|
-
cirq.Moment(H(a), H(b)),
|
|
564
|
-
cirq.Moment(H(b), X(a)),
|
|
565
|
-
cirq.Moment(
|
|
566
|
-
H(b),
|
|
567
|
-
cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0.5, z_exponent=-1).on(a),
|
|
568
|
-
),
|
|
569
|
-
),
|
|
554
|
+
expected_circuit="""
|
|
555
|
+
a: ───H───X───H───X───Y───@───────X───H───X───PhXZ(a=0.5,x=0.5,z=-1)───
|
|
556
|
+
│
|
|
557
|
+
b: ───H───H───H───H───────@^0.5───H───H───H───H────────────────────────
|
|
558
|
+
""",
|
|
570
559
|
schema="XX_PAIR",
|
|
571
560
|
)
|
|
572
561
|
|
|
@@ -658,14 +647,6 @@ def test_with_non_clifford_measurements():
|
|
|
658
647
|
2: ───H───@───H───@───────M───
|
|
659
648
|
│
|
|
660
649
|
3: ───────────H───@───H───M───
|
|
661
|
-
Output:
|
|
662
|
-
0: ───────────H───@───PhXZ(a=0.5,x=0.5,z=0)───M───
|
|
663
|
-
│
|
|
664
|
-
1: ───H───@───X───@───X───────────────────────M───
|
|
665
|
-
│
|
|
666
|
-
2: ───H───@───H───@───I───────────────────────M───
|
|
667
|
-
│
|
|
668
|
-
3: ───────────H───@───H───────────────────────M───
|
|
669
650
|
"""
|
|
670
651
|
qubits = cirq.LineQubit.range(4)
|
|
671
652
|
assert_dd(
|
|
@@ -677,21 +658,15 @@ def test_with_non_clifford_measurements():
|
|
|
677
658
|
cirq.Moment([H(qubits[i]) for i in [0, 3]]),
|
|
678
659
|
cirq.Moment([cirq.M(qubits[i]) for i in [0, 1, 2, 3]]),
|
|
679
660
|
),
|
|
680
|
-
expected_circuit=
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0.5, z_exponent=0).on(
|
|
690
|
-
qubits[0]
|
|
691
|
-
),
|
|
692
|
-
),
|
|
693
|
-
cirq.Moment([cirq.M(qubits[i]) for i in [0, 1, 2, 3]]),
|
|
694
|
-
),
|
|
661
|
+
expected_circuit="""
|
|
662
|
+
0: ───────────H───@───H───X───M───
|
|
663
|
+
│
|
|
664
|
+
1: ───H───@───X───@───X───────M───
|
|
665
|
+
│
|
|
666
|
+
2: ───H───@───H───@───X───X───M───
|
|
667
|
+
│
|
|
668
|
+
3: ───────────H───@───H───────M───
|
|
669
|
+
""",
|
|
695
670
|
schema="XX_PAIR",
|
|
696
671
|
single_qubit_gate_moments_only=True,
|
|
697
672
|
)
|
|
@@ -844,11 +819,58 @@ def test_merge_before_non_cliffords():
|
|
|
844
819
|
assert_dd(
|
|
845
820
|
input_circuit=input_circuit,
|
|
846
821
|
expected_circuit="""
|
|
847
|
-
0: ───X───X───X
|
|
822
|
+
0: ───X───X───X───────────────────────X──────────────────────X───M───
|
|
848
823
|
|
|
849
|
-
1: ───X───X───PhXZ(a=-1
|
|
850
|
-
|
|
851
|
-
2: ───X───X───S
|
|
824
|
+
1: ───X───X───PhXZ(a=-1,x=0,z=-0.5)───Y───FSim(0, 0.0637π)───────M───
|
|
825
|
+
│
|
|
826
|
+
2: ───X───X───S───────────────────────────FSim(0, 0.0637π)───────M───
|
|
852
827
|
""",
|
|
853
828
|
schema="XX_PAIR",
|
|
854
829
|
)
|
|
830
|
+
|
|
831
|
+
|
|
832
|
+
@pytest.mark.parametrize(
|
|
833
|
+
'single_qubit_gate_moments_only, expected_diagram',
|
|
834
|
+
[
|
|
835
|
+
(
|
|
836
|
+
True,
|
|
837
|
+
# With single_qubit_gate_moments_only=True, the second DD gate on q2
|
|
838
|
+
# is inserted in a new moment after the CZ gate.
|
|
839
|
+
"""
|
|
840
|
+
0: ───X───X───@───────M───
|
|
841
|
+
│
|
|
842
|
+
1: ───X───X───@───────M───
|
|
843
|
+
|
|
844
|
+
2: ───X───X───────X───M───
|
|
845
|
+
""",
|
|
846
|
+
),
|
|
847
|
+
(
|
|
848
|
+
False,
|
|
849
|
+
# With single_qubit_gate_moments_only=False, the second DD gate on q2
|
|
850
|
+
# is inserted in the same moment as the CZ gate.
|
|
851
|
+
"""
|
|
852
|
+
0: ───X───X───@───M───
|
|
853
|
+
│
|
|
854
|
+
1: ───X───X───@───M───
|
|
855
|
+
|
|
856
|
+
2: ───X───X───X───M───
|
|
857
|
+
""",
|
|
858
|
+
),
|
|
859
|
+
],
|
|
860
|
+
)
|
|
861
|
+
def test_single_qubit_gate_moments_only_true_vs_false(
|
|
862
|
+
single_qubit_gate_moments_only, expected_diagram
|
|
863
|
+
):
|
|
864
|
+
q0, q1, q2 = cirq.LineQubit.range(3)
|
|
865
|
+
input_circuit = cirq.Circuit(
|
|
866
|
+
cirq.Moment([X(q) for q in [q0, q1, q2]]),
|
|
867
|
+
cirq.Moment([X(q) for q in [q0, q1]]),
|
|
868
|
+
cirq.Moment(CZ(q0, q1)),
|
|
869
|
+
cirq.Moment([cirq.M(q) for q in [q0, q1, q2]]),
|
|
870
|
+
)
|
|
871
|
+
assert_dd(
|
|
872
|
+
input_circuit=input_circuit,
|
|
873
|
+
expected_circuit=expected_diagram,
|
|
874
|
+
schema="XX_PAIR",
|
|
875
|
+
single_qubit_gate_moments_only=single_qubit_gate_moments_only,
|
|
876
|
+
)
|
{cirq_core-1.7.0.dev20250728175235.dist-info → cirq_core-1.7.0.dev20250801200422.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cirq-core
|
|
3
|
-
Version: 1.7.0.
|
|
3
|
+
Version: 1.7.0.dev20250801200422
|
|
4
4
|
Summary: A framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits.
|
|
5
5
|
Home-page: http://github.com/quantumlib/cirq
|
|
6
6
|
Author: The Cirq Developers
|
{cirq_core-1.7.0.dev20250728175235.dist-info → cirq_core-1.7.0.dev20250801200422.dist-info}/RECORD
RENAMED
|
@@ -4,8 +4,8 @@ cirq/_compat_test.py,sha256=emXpdD5ZvwLRlFAoQB8YatmZyU3b4e9jg6FppMTUhkU,33900
|
|
|
4
4
|
cirq/_doc.py,sha256=BrnoABo1hk5RgB3Cgww4zLHUfiyFny0F1V-tOMCbdaU,2909
|
|
5
5
|
cirq/_import.py,sha256=ixBu4EyGl46Ram2cP3p5eZVEFDW5L2DS-VyTjz4N9iw,8429
|
|
6
6
|
cirq/_import_test.py,sha256=oF4izzOVZLc7NZ0aZHFcGv-r01eiFFt_JORx_x7_D4s,1089
|
|
7
|
-
cirq/_version.py,sha256=
|
|
8
|
-
cirq/_version_test.py,sha256=
|
|
7
|
+
cirq/_version.py,sha256=ibA6P6gdwCzcYx8w4AaL0dJEeQv4umpZVhJUZkqcig8,1206
|
|
8
|
+
cirq/_version_test.py,sha256=YwxQ2h-MPRHFOrjoqPcmHyoLuTfdMIokuMzX_miqIzo,155
|
|
9
9
|
cirq/conftest.py,sha256=wSDKNdIQRDfLnXvOCWD3erheOw8JHRhdfQ53EyTUIXg,1239
|
|
10
10
|
cirq/json_resolver_cache.py,sha256=A5DIgFAY1hUNt9vai_C3-gGBv24116CJMzQxMcXOax4,13726
|
|
11
11
|
cirq/py.typed,sha256=VFSlmh_lNwnaXzwY-ZuW-C2Ws5PkuDoVgBdNCs0jXJE,63
|
|
@@ -1071,8 +1071,8 @@ cirq/transformers/drop_empty_moments.py,sha256=uZJG9FpUNyA1Mi0xLDuVuhj_siZhPZ1_s
|
|
|
1071
1071
|
cirq/transformers/drop_empty_moments_test.py,sha256=h6Pji0z0o9KOB7fnSHseWpIAhzvxWurF_flg9XWm_YI,1959
|
|
1072
1072
|
cirq/transformers/drop_negligible_operations.py,sha256=eP2dP_n0BYlr8aZ1wnD8YWsqCtwN0l0O6p45RbXEpfM,2097
|
|
1073
1073
|
cirq/transformers/drop_negligible_operations_test.py,sha256=32mS4QQ8tiH3wBAAgbUU8LgwWDmvreRVEDZML_kgxyo,3859
|
|
1074
|
-
cirq/transformers/dynamical_decoupling.py,sha256=
|
|
1075
|
-
cirq/transformers/dynamical_decoupling_test.py,sha256=
|
|
1074
|
+
cirq/transformers/dynamical_decoupling.py,sha256=LP0Hrp7XqfVRmSy_wQX85GKPgK1Vy2_HCt8OyySFL2s,13484
|
|
1075
|
+
cirq/transformers/dynamical_decoupling_test.py,sha256=wQUCw99ODghLmluox9-3rg-w_A1vEVa96dFmKXWC2m0,45171
|
|
1076
1076
|
cirq/transformers/eject_phased_paulis.py,sha256=ZeVEh614OihWZtHyaBBtgpWj_dUxQGXDzf4NmBlzbeM,14725
|
|
1077
1077
|
cirq/transformers/eject_phased_paulis_test.py,sha256=AOMmOq3fWFGm2_qDyocjtF9fK7GAhC0kF550mkjtPx4,15791
|
|
1078
1078
|
cirq/transformers/eject_z.py,sha256=3u0Q0WGGAxmZuPnyiU4q04gJMnY--0nvhF4eotnSl9k,5803
|
|
@@ -1234,8 +1234,8 @@ cirq/work/sampler.py,sha256=rxbMWvrhu3gfNSBjZKozw28lLKVvBAS_1EGyPdYe8Xg,19041
|
|
|
1234
1234
|
cirq/work/sampler_test.py,sha256=SsMrRvLDYELyOAWLKISjkdEfrBwLYWRsT6D8WrsLM3Q,13533
|
|
1235
1235
|
cirq/work/zeros_sampler.py,sha256=Fs2JWwq0n9zv7_G5Rm-9vPeHUag7uctcMOHg0JTkZpc,2371
|
|
1236
1236
|
cirq/work/zeros_sampler_test.py,sha256=lQLgQDGBLtfImryys2HzQ2jOSGxHgc7-koVBUhv8qYk,3345
|
|
1237
|
-
cirq_core-1.7.0.
|
|
1238
|
-
cirq_core-1.7.0.
|
|
1239
|
-
cirq_core-1.7.0.
|
|
1240
|
-
cirq_core-1.7.0.
|
|
1241
|
-
cirq_core-1.7.0.
|
|
1237
|
+
cirq_core-1.7.0.dev20250801200422.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
|
|
1238
|
+
cirq_core-1.7.0.dev20250801200422.dist-info/METADATA,sha256=KgX6fyUEzYknpgDtCLaNMgyYiAWbJSbJmFCqaVBVBkw,4857
|
|
1239
|
+
cirq_core-1.7.0.dev20250801200422.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1240
|
+
cirq_core-1.7.0.dev20250801200422.dist-info/top_level.txt,sha256=Sz9iOxHU0IEMLSFGwiwOCaN2e9K-jFbBbtpPN1hB73g,5
|
|
1241
|
+
cirq_core-1.7.0.dev20250801200422.dist-info/RECORD,,
|
{cirq_core-1.7.0.dev20250728175235.dist-info → cirq_core-1.7.0.dev20250801200422.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|