cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__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.

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,16 +12,18 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Sequence, Tuple, Union
15
+ from __future__ import annotations
16
+
17
+ from typing import Sequence
16
18
 
17
19
  import numpy as np
18
20
  import pytest
19
21
 
20
22
  import cirq
21
- from cirq import add_dynamical_decoupling
23
+ from cirq import add_dynamical_decoupling, CNOT, CZ, CZPowGate, H, X, Y, Z
22
24
 
23
25
 
24
- def assert_sim_eq(circuit1: 'cirq.AbstractCircuit', circuit2: 'cirq.AbstractCircuit'):
26
+ def assert_sim_eq(circuit1: cirq.AbstractCircuit, circuit2: cirq.AbstractCircuit):
25
27
  # Simulate 2 circuits and compare final states.
26
28
  sampler = cirq.Simulator(dtype=np.complex128)
27
29
  psi0 = sampler.simulate(cirq.drop_terminal_measurements(circuit1)).final_state_vector
@@ -31,9 +33,9 @@ def assert_sim_eq(circuit1: 'cirq.AbstractCircuit', circuit2: 'cirq.AbstractCirc
31
33
 
32
34
 
33
35
  def assert_dd(
34
- input_circuit: 'cirq.AbstractCircuit',
35
- expected_circuit: Union[str, 'cirq.AbstractCircuit'],
36
- schema: Union[str, Tuple['cirq.Gate', ...]] = 'DEFAULT',
36
+ input_circuit: cirq.AbstractCircuit,
37
+ expected_circuit: str | cirq.AbstractCircuit,
38
+ schema: str | tuple[cirq.Gate, ...] = 'DEFAULT',
37
39
  single_qubit_gate_moments_only: bool = True,
38
40
  ):
39
41
  transformed_circuit = add_dynamical_decoupling(
@@ -66,11 +68,9 @@ def test_no_insertion():
66
68
  b = cirq.NamedQubit('b')
67
69
 
68
70
  assert_dd(
69
- input_circuit=cirq.Circuit(
70
- cirq.Moment(cirq.H(a)), cirq.Moment(cirq.CNOT(a, b)), cirq.Moment(cirq.H(b))
71
- ),
71
+ input_circuit=cirq.Circuit(cirq.Moment(H(a)), cirq.Moment(CNOT(a, b)), cirq.Moment(H(b))),
72
72
  expected_circuit=cirq.Circuit(
73
- cirq.Moment(cirq.H(a)), cirq.Moment(cirq.CNOT(a, b)), cirq.Moment(cirq.H(b))
73
+ cirq.Moment(H(a)), cirq.Moment(CNOT(a, b)), cirq.Moment(H(b))
74
74
  ),
75
75
  schema='XX_PAIR',
76
76
  single_qubit_gate_moments_only=False,
@@ -79,14 +79,9 @@ def test_no_insertion():
79
79
 
80
80
  @pytest.mark.parametrize(
81
81
  'schema,inserted_gates',
82
- [
83
- ('XX_PAIR', (cirq.X, cirq.X)),
84
- ('X_XINV', (cirq.X, cirq.X**-1)),
85
- ('YY_PAIR', (cirq.Y, cirq.Y)),
86
- ('Y_YINV', (cirq.Y, cirq.Y**-1)),
87
- ],
82
+ [('XX_PAIR', (X, X)), ('X_XINV', (X, X**-1)), ('YY_PAIR', (Y, Y)), ('Y_YINV', (Y, Y**-1))],
88
83
  )
89
- def test_insert_provided_schema(schema: str, inserted_gates: Sequence['cirq.Gate']):
84
+ def test_insert_provided_schema(schema: str, inserted_gates: Sequence[cirq.Gate]):
90
85
  """Test case diagrams.
91
86
  Input:
92
87
  a: ───H───@───────────M───
@@ -100,17 +95,17 @@ def test_insert_provided_schema(schema: str, inserted_gates: Sequence['cirq.Gate
100
95
  c = cirq.NamedQubit('c')
101
96
 
102
97
  input_circuit = cirq.Circuit(
103
- cirq.Moment(cirq.H(a)),
104
- cirq.Moment(cirq.CNOT(a, b)),
105
- cirq.Moment(cirq.CNOT(b, c)),
106
- cirq.Moment(cirq.CNOT(b, c)),
98
+ cirq.Moment(H(a)),
99
+ cirq.Moment(CNOT(a, b)),
100
+ cirq.Moment(CNOT(b, c)),
101
+ cirq.Moment(CNOT(b, c)),
107
102
  cirq.Moment([cirq.M(qubit) for qubit in [a, b, c]]),
108
103
  )
109
104
  expected_circuit = cirq.Circuit(
110
- cirq.Moment(cirq.H(a)),
111
- cirq.Moment(cirq.CNOT(a, b)),
112
- cirq.Moment(cirq.CNOT(b, c), inserted_gates[0](a)),
113
- cirq.Moment(cirq.CNOT(b, c), inserted_gates[1](a)),
105
+ cirq.Moment(H(a)),
106
+ cirq.Moment(CNOT(a, b)),
107
+ cirq.Moment(CNOT(b, c), inserted_gates[0](a)),
108
+ cirq.Moment(CNOT(b, c), inserted_gates[1](a)),
114
109
  cirq.Moment([cirq.M(qubit) for qubit in [a, b, c]]),
115
110
  )
116
111
 
@@ -139,24 +134,24 @@ def test_insert_by_customized_dd_sequence():
139
134
 
140
135
  assert_dd(
141
136
  input_circuit=cirq.Circuit(
142
- cirq.Moment(cirq.H(a)),
143
- cirq.Moment(cirq.CNOT(a, b)),
144
- cirq.Moment(cirq.CNOT(b, c)),
145
- cirq.Moment(cirq.CNOT(b, c)),
146
- cirq.Moment(cirq.CNOT(b, c)),
147
- cirq.Moment(cirq.CNOT(b, c)),
148
- cirq.Moment([cirq.H(qubit) for qubit in [a, b, c]]),
137
+ cirq.Moment(H(a)),
138
+ cirq.Moment(CNOT(a, b)),
139
+ cirq.Moment(CNOT(b, c)),
140
+ cirq.Moment(CNOT(b, c)),
141
+ cirq.Moment(CNOT(b, c)),
142
+ cirq.Moment(CNOT(b, c)),
143
+ cirq.Moment([H(qubit) for qubit in [a, b, c]]),
149
144
  ),
150
145
  expected_circuit=cirq.Circuit(
151
- cirq.Moment(cirq.H(a)),
152
- cirq.Moment(cirq.CNOT(a, b)),
153
- cirq.Moment(cirq.CNOT(b, c), cirq.X(a)),
154
- cirq.Moment(cirq.CNOT(b, c), cirq.X(a)),
155
- cirq.Moment(cirq.CNOT(b, c), cirq.Y(a)),
156
- cirq.Moment(cirq.CNOT(b, c), cirq.Y(a)),
157
- cirq.Moment([cirq.H(qubit) for qubit in [a, b, c]]),
158
- ),
159
- schema=[cirq.X, cirq.X, cirq.Y, cirq.Y],
146
+ cirq.Moment(H(a)),
147
+ cirq.Moment(CNOT(a, b)),
148
+ cirq.Moment(CNOT(b, c), X(a)),
149
+ cirq.Moment(CNOT(b, c), X(a)),
150
+ cirq.Moment(CNOT(b, c), Y(a)),
151
+ cirq.Moment(CNOT(b, c), Y(a)),
152
+ cirq.Moment([H(qubit) for qubit in [a, b, c]]),
153
+ ),
154
+ schema=[X, X, Y, Y],
160
155
  single_qubit_gate_moments_only=False,
161
156
  )
162
157
 
@@ -178,19 +173,19 @@ def test_pull_through_h_gate_case1(single_qubit_gate_moments_only: bool):
178
173
 
179
174
  assert_dd(
180
175
  input_circuit=cirq.Circuit(
181
- cirq.Moment(cirq.H(a), cirq.H(b)),
182
- cirq.Moment(cirq.H(b)),
183
- cirq.Moment(cirq.H(a), cirq.H(b)),
184
- cirq.Moment(cirq.H(b)),
185
- cirq.Moment(cirq.CNOT(a, b)),
176
+ cirq.Moment(H(a), H(b)),
177
+ cirq.Moment(H(b)),
178
+ cirq.Moment(H(a), H(b)),
179
+ cirq.Moment(H(b)),
180
+ cirq.Moment(CNOT(a, b)),
186
181
  ),
187
182
  expected_circuit=cirq.Circuit(
188
- cirq.Moment(cirq.H(a), cirq.H(b)),
189
- cirq.Moment(cirq.H(b), cirq.X(a)),
190
- cirq.Moment(cirq.H(a), cirq.H(b)),
191
- cirq.Moment(cirq.H(b), cirq.X(a)),
192
- cirq.Moment(cirq.CNOT(a, b)),
193
- cirq.Moment(cirq.Y(a), cirq.X(b)),
183
+ cirq.Moment(H(a), H(b)),
184
+ cirq.Moment(H(b), X(a)),
185
+ cirq.Moment(H(a), H(b)),
186
+ cirq.Moment(H(b), X(a)),
187
+ cirq.Moment(CNOT(a, b)),
188
+ cirq.Moment(Y(a), X(b)),
194
189
  ),
195
190
  schema="XX_PAIR",
196
191
  single_qubit_gate_moments_only=single_qubit_gate_moments_only,
@@ -214,20 +209,19 @@ def test_pull_through_h_gate_case2(single_qubit_gate_moments_only: bool):
214
209
 
215
210
  assert_dd(
216
211
  input_circuit=cirq.Circuit(
217
- cirq.Moment(cirq.H(a), cirq.H(b)),
218
- cirq.Moment(cirq.H(b)),
219
- cirq.Moment(cirq.H(a), cirq.H(b)),
220
- cirq.Moment(cirq.H(b)),
221
- cirq.Moment(cirq.H(a), cirq.H(b)),
212
+ cirq.Moment(H(a), H(b)),
213
+ cirq.Moment(H(b)),
214
+ cirq.Moment(H(a), H(b)),
215
+ cirq.Moment(H(b)),
216
+ cirq.Moment(H(a), H(b)),
222
217
  ),
223
218
  expected_circuit=cirq.Circuit(
224
- cirq.Moment(cirq.H(a), cirq.H(b)),
225
- cirq.Moment(cirq.H(b), cirq.X(a)),
226
- cirq.Moment(cirq.H(a), cirq.H(b)),
227
- cirq.Moment(cirq.H(b), cirq.X(a)),
219
+ cirq.Moment(H(a), H(b)),
220
+ cirq.Moment(H(b), X(a)),
221
+ cirq.Moment(H(a), H(b)),
222
+ cirq.Moment(H(b), X(a)),
228
223
  cirq.Moment(
229
- cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0.5, z_exponent=1).on(a),
230
- cirq.H(b),
224
+ cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0.5, z_exponent=1).on(a), H(b)
231
225
  ),
232
226
  ),
233
227
  schema="XX_PAIR",
@@ -239,22 +233,22 @@ def test_pull_through_h_gate_case2(single_qubit_gate_moments_only: bool):
239
233
  'schema,error_msg_regex',
240
234
  [
241
235
  ('INVALID_SCHEMA', 'Invalid schema name.'),
242
- ([cirq.X], 'Invalid dynamical decoupling sequence. Expect more than one gates.'),
236
+ ([X], 'Invalid dynamical decoupling sequence. Expect more than one gates.'),
243
237
  (
244
- [cirq.X, cirq.Y],
245
- 'Invalid dynamical decoupling sequence. Expect sequence production equals identity'
238
+ [X, Y],
239
+ 'Invalid dynamical decoupling sequence. Expect sequence product equals identity'
246
240
  ' up to a global phase, got',
247
241
  ),
248
242
  (
249
- [cirq.H, cirq.H],
243
+ [H, H],
250
244
  'Dynamical decoupling sequence should only contain gates that are essentially'
251
245
  ' Pauli gates.',
252
246
  ),
253
247
  ],
254
248
  )
255
- def test_invalid_dd_schema(schema: Union[str, Tuple['cirq.Gate', ...]], error_msg_regex):
249
+ def test_invalid_dd_schema(schema: str | tuple[cirq.Gate, ...], error_msg_regex):
256
250
  a = cirq.NamedQubit('a')
257
- input_circuit = cirq.Circuit(cirq.H(a))
251
+ input_circuit = cirq.Circuit(H(a))
258
252
  with pytest.raises(ValueError, match=error_msg_regex):
259
253
  add_dynamical_decoupling(input_circuit, schema=schema, single_qubit_gate_moments_only=False)
260
254
 
@@ -262,15 +256,15 @@ def test_invalid_dd_schema(schema: Union[str, Tuple['cirq.Gate', ...]], error_ms
262
256
  def test_single_qubit_gate_moments_only_no_updates_succeeds():
263
257
  qubits = cirq.LineQubit.range(9)
264
258
  input_circuit = cirq.Circuit(
265
- cirq.Moment([cirq.H(qubits[i]) for i in [3, 4, 5]]),
266
- cirq.Moment(cirq.CZ(*qubits[4:6])),
267
- cirq.Moment(cirq.CZ(*qubits[3:5])),
268
- cirq.Moment([cirq.H(qubits[i]) for i in [2, 3, 5, 6]]),
269
- cirq.Moment(cirq.CZ(*qubits[2:4]), cirq.CNOT(*qubits[5:7])),
270
- cirq.Moment([cirq.H(qubits[i]) for i in [1, 2, 6, 7]]),
271
- cirq.Moment(cirq.CZ(*qubits[1:3]), cirq.CNOT(*qubits[6:8])),
272
- cirq.Moment([cirq.H(qubits[i]) for i in [0, 1, 7, 8]]),
273
- cirq.Moment(cirq.CZ(*qubits[0:2]), cirq.CNOT(*qubits[7:])),
259
+ cirq.Moment([H(qubits[i]) for i in [3, 4, 5]]),
260
+ cirq.Moment(CZ(*qubits[4:6])),
261
+ cirq.Moment(CZ(*qubits[3:5])),
262
+ cirq.Moment([H(qubits[i]) for i in [2, 3, 5, 6]]),
263
+ cirq.Moment(CZ(*qubits[2:4]), CNOT(*qubits[5:7])),
264
+ cirq.Moment([H(qubits[i]) for i in [1, 2, 6, 7]]),
265
+ cirq.Moment(CZ(*qubits[1:3]), CNOT(*qubits[6:8])),
266
+ cirq.Moment([H(qubits[i]) for i in [0, 1, 7, 8]]),
267
+ cirq.Moment(CZ(*qubits[0:2]), CNOT(*qubits[7:])),
274
268
  )
275
269
  add_dynamical_decoupling(input_circuit, schema='X_XINV', single_qubit_gate_moments_only=True)
276
270
 
@@ -336,37 +330,35 @@ def test_scattered_circuit():
336
330
  """
337
331
  qubits = cirq.LineQubit.range(9)
338
332
  input_circuit = cirq.Circuit(
339
- cirq.Moment([cirq.H(qubits[i]) for i in [3, 4, 5]]),
340
- cirq.Moment(cirq.CZ(*qubits[4:6])),
341
- cirq.Moment(cirq.CZ(*qubits[3:5])),
342
- cirq.Moment([cirq.H(qubits[i]) for i in [2, 3, 5, 6]]),
343
- cirq.Moment(cirq.CZ(*qubits[2:4]), cirq.CZ(*qubits[5:7])),
344
- cirq.Moment([cirq.H(qubits[i]) for i in [1, 2, 6, 7]]),
345
- cirq.Moment(cirq.CZ(*qubits[1:3]), cirq.CZ(*qubits[6:8])),
346
- cirq.Moment([cirq.H(qubits[i]) for i in [0, 1, 7, 8]]),
347
- cirq.Moment(cirq.CZ(*qubits[0:2]), cirq.CZ(*qubits[7:])),
348
- cirq.Moment([cirq.H(q) for q in qubits]),
333
+ cirq.Moment([H(qubits[i]) for i in [3, 4, 5]]),
334
+ cirq.Moment(CZ(*qubits[4:6])),
335
+ cirq.Moment(CZ(*qubits[3:5])),
336
+ cirq.Moment([H(qubits[i]) for i in [2, 3, 5, 6]]),
337
+ cirq.Moment(CZ(*qubits[2:4]), CZ(*qubits[5:7])),
338
+ cirq.Moment([H(qubits[i]) for i in [1, 2, 6, 7]]),
339
+ cirq.Moment(CZ(*qubits[1:3]), CZ(*qubits[6:8])),
340
+ cirq.Moment([H(qubits[i]) for i in [0, 1, 7, 8]]),
341
+ cirq.Moment(CZ(*qubits[0:2]), CZ(*qubits[7:])),
342
+ cirq.Moment([H(q) for q in qubits]),
349
343
  )
350
344
  expected_circuit_single_qubit_gate_on = cirq.Circuit(
351
- cirq.Moment([cirq.H(qubits[i]) for i in [3, 4, 5]]),
352
- cirq.Moment(cirq.CZ(*qubits[4:6])),
353
- cirq.Moment(cirq.CZ(*qubits[3:5])),
354
- cirq.Moment([cirq.H(qubits[i]) for i in [2, 3, 5, 6]] + [cirq.X(qubits[4])]),
355
- cirq.Moment(cirq.CZ(*qubits[2:4]), cirq.CZ(*qubits[5:7])),
345
+ cirq.Moment([H(qubits[i]) for i in [3, 4, 5]]),
346
+ cirq.Moment(CZ(*qubits[4:6])),
347
+ cirq.Moment(CZ(*qubits[3:5])),
348
+ cirq.Moment([H(qubits[i]) for i in [2, 3, 5, 6]] + [X(qubits[4])]),
349
+ cirq.Moment(CZ(*qubits[2:4]), CZ(*qubits[5:7])),
356
350
  cirq.Moment(
357
- [cirq.H(qubits[i]) for i in [1, 2, 6, 7]]
358
- + [cirq.X(qubits[i]) for i in [3, 5]]
359
- + [cirq.Y(qubits[4])]
351
+ [H(qubits[i]) for i in [1, 2, 6, 7]] + [X(qubits[i]) for i in [3, 5]] + [Y(qubits[4])]
360
352
  ),
361
- cirq.Moment(cirq.CZ(*qubits[1:3]), cirq.CZ(*qubits[6:8])),
353
+ cirq.Moment(CZ(*qubits[1:3]), CZ(*qubits[6:8])),
362
354
  cirq.Moment(
363
- [cirq.H(qubits[i]) for i in [0, 1, 7, 8]]
364
- + [cirq.X(qubits[i]) for i in [2, 4, 6]]
365
- + [cirq.Y(qubits[i]) for i in [3, 5]]
355
+ [H(qubits[i]) for i in [0, 1, 7, 8]]
356
+ + [X(qubits[i]) for i in [2, 4, 6]]
357
+ + [Y(qubits[i]) for i in [3, 5]]
366
358
  ),
367
- cirq.Moment(cirq.CZ(*qubits[0:2]), cirq.CZ(*qubits[7:])),
359
+ cirq.Moment(CZ(*qubits[0:2]), CZ(*qubits[7:])),
368
360
  cirq.Moment(
369
- [cirq.H(qubits[i]) for i in [0, 1, 7, 8]]
361
+ [H(qubits[i]) for i in [0, 1, 7, 8]]
370
362
  + [
371
363
  cirq.PhasedXZGate(axis_phase_exponent=-0.5, x_exponent=0.5, z_exponent=0).on(
372
364
  qubits[2]
@@ -387,33 +379,29 @@ def test_scattered_circuit():
387
379
  ),
388
380
  )
389
381
  expected_circuit_single_qubit_gates_off = cirq.Circuit(
390
- cirq.Moment([cirq.H(qubits[i]) for i in [3, 4, 5]]),
391
- cirq.Moment(cirq.CZ(*qubits[4:6]), cirq.X(qubits[3])),
392
- cirq.Moment(cirq.CZ(*qubits[3:5]), cirq.X(qubits[5])),
393
- cirq.Moment([cirq.H(qubits[i]) for i in [2, 3, 5, 6]] + [cirq.X(qubits[i]) for i in [4]]),
394
- cirq.Moment(cirq.CZ(*qubits[2:4]), cirq.CZ(*qubits[5:7]), cirq.Y(qubits[4])),
382
+ cirq.Moment([H(qubits[i]) for i in [3, 4, 5]]),
383
+ cirq.Moment(CZ(*qubits[4:6]), X(qubits[3])),
384
+ cirq.Moment(CZ(*qubits[3:5]), X(qubits[5])),
385
+ cirq.Moment([H(qubits[i]) for i in [2, 3, 5, 6]] + [X(qubits[i]) for i in [4]]),
386
+ cirq.Moment(CZ(*qubits[2:4]), CZ(*qubits[5:7]), Y(qubits[4])),
395
387
  cirq.Moment(
396
- [cirq.H(qubits[i]) for i in [1, 2, 6, 7]]
397
- + [cirq.Y(qubits[i]) for i in [3, 5]]
398
- + [cirq.X(qubits[4])]
388
+ [H(qubits[i]) for i in [1, 2, 6, 7]] + [Y(qubits[i]) for i in [3, 5]] + [X(qubits[4])]
399
389
  ),
400
390
  cirq.Moment(
401
- [cirq.CZ(*qubits[1:3]), cirq.CZ(*qubits[6:8])]
402
- + [cirq.X(qubits[i]) for i in [3, 5]]
403
- + [cirq.Y(qubits[4])]
391
+ [CZ(*qubits[1:3]), CZ(*qubits[6:8])] + [X(qubits[i]) for i in [3, 5]] + [Y(qubits[4])]
404
392
  ),
405
393
  cirq.Moment(
406
- [cirq.H(qubits[i]) for i in [0, 1, 7, 8]]
407
- + [cirq.X(qubits[i]) for i in [2, 4, 6]]
408
- + [cirq.Y(qubits[i]) for i in [3, 5]]
394
+ [H(qubits[i]) for i in [0, 1, 7, 8]]
395
+ + [X(qubits[i]) for i in [2, 4, 6]]
396
+ + [Y(qubits[i]) for i in [3, 5]]
409
397
  ),
410
398
  cirq.Moment(
411
- [cirq.CZ(*qubits[0:2]), cirq.CZ(*qubits[7:])]
412
- + [cirq.X(qubits[i]) for i in [3, 5]]
413
- + [cirq.Y(qubits[i]) for i in [2, 4, 6]]
399
+ [CZ(*qubits[0:2]), CZ(*qubits[7:])]
400
+ + [X(qubits[i]) for i in [3, 5]]
401
+ + [Y(qubits[i]) for i in [2, 4, 6]]
414
402
  ),
415
403
  cirq.Moment(
416
- [cirq.H(qubits[i]) for i in [0, 1, 4, 7, 8]]
404
+ [H(qubits[i]) for i in [0, 1, 4, 7, 8]]
417
405
  + [
418
406
  cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0.5, z_exponent=0).on(
419
407
  qubits[i]
@@ -478,18 +466,18 @@ def test_scattered_circuit2():
478
466
  qubits = cirq.LineQubit.range(9)
479
467
  assert_dd(
480
468
  input_circuit=cirq.Circuit(
481
- cirq.Moment(cirq.CZ(*qubits[4:6])),
482
- cirq.Moment(cirq.CZ(*qubits[3:5])),
483
- cirq.Moment(cirq.CZ(*qubits[2:4]), cirq.CZ(*qubits[5:7])),
484
- cirq.Moment(cirq.CZ(*qubits[1:3]), cirq.CZ(*qubits[6:8])),
485
- cirq.Moment(cirq.CZ(*qubits[0:2]), cirq.CZ(*qubits[7:])),
469
+ cirq.Moment(CZ(*qubits[4:6])),
470
+ cirq.Moment(CZ(*qubits[3:5])),
471
+ cirq.Moment(CZ(*qubits[2:4]), CZ(*qubits[5:7])),
472
+ cirq.Moment(CZ(*qubits[1:3]), CZ(*qubits[6:8])),
473
+ cirq.Moment(CZ(*qubits[0:2]), CZ(*qubits[7:])),
486
474
  ),
487
475
  expected_circuit=cirq.Circuit(
488
- cirq.Moment(cirq.CZ(*qubits[4:6])),
489
- cirq.Moment(cirq.CZ(*qubits[3:5]), cirq.X(qubits[5])),
490
- cirq.Moment(cirq.CZ(*qubits[2:4]), cirq.CZ(*qubits[5:7])),
491
- cirq.Moment(cirq.CZ(*qubits[1:3]), cirq.CZ(*qubits[6:8]), cirq.X(qubits[5])),
492
- cirq.Moment(cirq.CZ(*qubits[0:2]), cirq.CZ(*qubits[7:]), cirq.Z(qubits[6])),
476
+ cirq.Moment(CZ(*qubits[4:6])),
477
+ cirq.Moment(CZ(*qubits[3:5]), X(qubits[5])),
478
+ cirq.Moment(CZ(*qubits[2:4]), CZ(*qubits[5:7])),
479
+ cirq.Moment(CZ(*qubits[1:3]), CZ(*qubits[6:8]), X(qubits[5])),
480
+ cirq.Moment(CZ(*qubits[0:2]), CZ(*qubits[7:]), Z(qubits[6])),
493
481
  ),
494
482
  schema="XX_PAIR",
495
483
  single_qubit_gate_moments_only=False,
@@ -518,20 +506,20 @@ def test_pull_through_chain():
518
506
  qubits = cirq.LineQubit.range(4)
519
507
  assert_dd(
520
508
  input_circuit=cirq.Circuit(
521
- cirq.Moment(cirq.X(qubits[0])),
522
- cirq.Moment(cirq.Y(qubits[1])),
509
+ cirq.Moment(X(qubits[0])),
510
+ cirq.Moment(Y(qubits[1])),
523
511
  cirq.Moment(cirq.SWAP(*qubits[0:2])),
524
512
  cirq.Moment(cirq.SWAP(*qubits[1:3])),
525
513
  cirq.Moment(cirq.SWAP(*qubits[2:4])),
526
- cirq.Moment([cirq.X(qubits[i]) for i in range(4)]),
514
+ cirq.Moment([X(qubits[i]) for i in range(4)]),
527
515
  ),
528
516
  expected_circuit=cirq.Circuit(
529
- cirq.Moment(cirq.X(qubits[0])),
530
- cirq.Moment(cirq.Y(qubits[1]), cirq.X(qubits[0])),
517
+ cirq.Moment(X(qubits[0])),
518
+ cirq.Moment(Y(qubits[1]), X(qubits[0])),
531
519
  cirq.Moment(cirq.SWAP(*qubits[0:2])),
532
- cirq.Moment([cirq.SWAP(*qubits[1:3])] + [cirq.X(qubits[0])]),
533
- cirq.Moment([cirq.SWAP(*qubits[2:4])] + [cirq.X(qubits[0]), cirq.X(qubits[1])]),
534
- cirq.Moment(cirq.X(qubits[0]), cirq.I(qubits[1]), cirq.X(qubits[2]), cirq.I(qubits[3])),
520
+ cirq.Moment([cirq.SWAP(*qubits[1:3])] + [X(qubits[0])]),
521
+ cirq.Moment([cirq.SWAP(*qubits[2:4])] + [X(qubits[0]), X(qubits[1])]),
522
+ cirq.Moment(X(qubits[0]), cirq.I(qubits[1]), X(qubits[2]), cirq.I(qubits[3])),
535
523
  ),
536
524
  schema='XX_PAIR',
537
525
  single_qubit_gate_moments_only=False,
@@ -553,30 +541,29 @@ def test_multiple_clifford_pieces_case1():
553
541
  b = cirq.NamedQubit('b')
554
542
  assert_dd(
555
543
  input_circuit=cirq.Circuit(
556
- cirq.Moment(cirq.H(a), cirq.H(b)),
557
- cirq.Moment(cirq.H(b)),
558
- cirq.Moment(cirq.H(a), cirq.H(b)),
559
- cirq.Moment(cirq.H(b)),
560
- cirq.Moment(cirq.CZPowGate(exponent=0.5).on(a, b)),
561
- cirq.Moment(cirq.H(b)),
562
- cirq.Moment(cirq.H(a), cirq.H(b)),
563
- cirq.Moment(cirq.H(b)),
564
- cirq.Moment(cirq.H(a), cirq.H(b)),
544
+ cirq.Moment(H(a), H(b)),
545
+ cirq.Moment(H(b)),
546
+ cirq.Moment(H(a), H(b)),
547
+ cirq.Moment(H(b)),
548
+ cirq.Moment(CZPowGate(exponent=0.5).on(a, b)),
549
+ cirq.Moment(H(b)),
550
+ cirq.Moment(H(a), H(b)),
551
+ cirq.Moment(H(b)),
552
+ cirq.Moment(H(a), H(b)),
565
553
  ),
566
554
  expected_circuit=cirq.Circuit(
567
- cirq.Moment(cirq.H(a), cirq.H(b)),
568
- cirq.Moment(cirq.H(b), cirq.X(a)),
569
- cirq.Moment(cirq.H(a), cirq.H(b)),
555
+ cirq.Moment(H(a), H(b)),
556
+ cirq.Moment(H(b), X(a)),
557
+ cirq.Moment(H(a), H(b)),
570
558
  cirq.Moment(
571
- cirq.H(b),
572
- cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0, z_exponent=-1).on(a),
559
+ H(b), cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0, z_exponent=-1).on(a)
573
560
  ),
574
- cirq.Moment(cirq.CZPowGate(exponent=0.5).on(a, b)),
575
- cirq.Moment(cirq.H(b), cirq.X(a)),
576
- cirq.Moment(cirq.H(a), cirq.H(b)),
577
- cirq.Moment(cirq.H(b), cirq.X(a)),
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)),
578
565
  cirq.Moment(
579
- cirq.H(b),
566
+ H(b),
580
567
  cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0.5, z_exponent=-1).on(a),
581
568
  ),
582
569
  ),
@@ -601,19 +588,19 @@ def test_multiple_clifford_pieces_case2():
601
588
 
602
589
  assert_dd(
603
590
  input_circuit=cirq.Circuit(
604
- cirq.Moment(cirq.CZ(a, b)),
591
+ cirq.Moment(CZ(a, b)),
605
592
  cirq.Moment(phased_xz_gate.on(a)),
606
593
  cirq.Moment(phased_xz_gate.on(a)),
607
594
  cirq.Moment(phased_xz_gate.on(a)),
608
- cirq.Moment(cirq.CZ(a, b)),
595
+ cirq.Moment(CZ(a, b)),
609
596
  ),
610
597
  expected_circuit=cirq.Circuit(
611
- cirq.Moment(cirq.CZ(a, b)),
612
- cirq.Moment(phased_xz_gate.on(a), cirq.X(b)),
613
- cirq.Moment(phased_xz_gate.on(a), cirq.X(b)),
614
- cirq.Moment(phased_xz_gate.on(a), cirq.X(b)),
615
- cirq.Moment(cirq.CZ(a, b)),
616
- cirq.Moment(cirq.Z(a), cirq.X(b)),
598
+ cirq.Moment(CZ(a, b)),
599
+ cirq.Moment(phased_xz_gate.on(a), X(b)),
600
+ cirq.Moment(phased_xz_gate.on(a), X(b)),
601
+ cirq.Moment(phased_xz_gate.on(a), X(b)),
602
+ cirq.Moment(CZ(a, b)),
603
+ cirq.Moment(Z(a), X(b)),
617
604
  ),
618
605
  schema='XX_PAIR',
619
606
  single_qubit_gate_moments_only=False,
@@ -640,20 +627,20 @@ def test_insert_new_moment():
640
627
  c = cirq.NamedQubit('c')
641
628
  assert_dd(
642
629
  input_circuit=cirq.Circuit(
643
- cirq.Moment(cirq.H(a), cirq.H(b), cirq.H(c)),
644
- cirq.Moment(cirq.H(b)),
645
- cirq.Moment(cirq.H(b), cirq.H(a)),
646
- cirq.Moment(cirq.CNOT(a, b)),
647
- cirq.Moment(cirq.CZPowGate(exponent=0.5).on(a, b), cirq.H(c)),
630
+ cirq.Moment(H(a), H(b), H(c)),
631
+ cirq.Moment(H(b)),
632
+ cirq.Moment(H(b), H(a)),
633
+ cirq.Moment(CNOT(a, b)),
634
+ cirq.Moment(CZPowGate(exponent=0.5).on(a, b), H(c)),
648
635
  ),
649
636
  expected_circuit=cirq.Circuit(
650
- cirq.Moment(cirq.H(a), cirq.H(b), cirq.H(c)),
651
- cirq.Moment(cirq.H(b), cirq.X(a), cirq.X(c)),
652
- cirq.Moment(cirq.H(a), cirq.H(b), cirq.X(c)),
653
- cirq.Moment(cirq.CNOT(a, b)),
654
- cirq.Moment(cirq.Z(a), cirq.X(c)),
637
+ cirq.Moment(H(a), H(b), H(c)),
638
+ cirq.Moment(H(b), X(a), X(c)),
639
+ cirq.Moment(H(a), H(b), X(c)),
640
+ cirq.Moment(CNOT(a, b)),
641
+ cirq.Moment(Z(a), X(c)),
655
642
  cirq.Moment(
656
- cirq.CZPowGate(exponent=0.5).on(a, b),
643
+ CZPowGate(exponent=0.5).on(a, b),
657
644
  cirq.PhasedXZGate(axis_phase_exponent=-0.5, x_exponent=0.5, z_exponent=0).on(c),
658
645
  ),
659
646
  ),
@@ -683,22 +670,22 @@ def test_with_non_clifford_measurements():
683
670
  qubits = cirq.LineQubit.range(4)
684
671
  assert_dd(
685
672
  input_circuit=cirq.Circuit(
686
- cirq.Moment([cirq.H(qubits[i]) for i in [1, 2]]),
687
- cirq.Moment(cirq.CZ(*qubits[1:3])),
688
- cirq.Moment([cirq.H(qubits[i]) for i in [0, 2, 3]]),
689
- cirq.Moment(cirq.CZ(*qubits[0:2]), cirq.CZ(*qubits[2:])),
690
- cirq.Moment([cirq.H(qubits[i]) for i in [0, 3]]),
673
+ cirq.Moment([H(qubits[i]) for i in [1, 2]]),
674
+ cirq.Moment(CZ(*qubits[1:3])),
675
+ cirq.Moment([H(qubits[i]) for i in [0, 2, 3]]),
676
+ cirq.Moment(CZ(*qubits[0:2]), CZ(*qubits[2:])),
677
+ cirq.Moment([H(qubits[i]) for i in [0, 3]]),
691
678
  cirq.Moment([cirq.M(qubits[i]) for i in [0, 1, 2, 3]]),
692
679
  ),
693
680
  expected_circuit=cirq.Circuit(
694
- cirq.Moment([cirq.H(qubits[i]) for i in [1, 2]]),
695
- cirq.Moment(cirq.CZ(*qubits[1:3])),
696
- cirq.Moment([cirq.H(qubits[i]) for i in [0, 2, 3]] + [cirq.X(qubits[1])]),
697
- cirq.Moment(cirq.CZ(*qubits[0:2]), cirq.CZ(*qubits[2:])),
681
+ cirq.Moment([H(qubits[i]) for i in [1, 2]]),
682
+ cirq.Moment(CZ(*qubits[1:3])),
683
+ cirq.Moment([H(qubits[i]) for i in [0, 2, 3]] + [X(qubits[1])]),
684
+ cirq.Moment(CZ(*qubits[0:2]), CZ(*qubits[2:])),
698
685
  cirq.Moment(
699
- cirq.H(qubits[3]),
686
+ H(qubits[3]),
700
687
  cirq.I(qubits[2]),
701
- cirq.X(qubits[1]),
688
+ X(qubits[1]),
702
689
  cirq.PhasedXZGate(axis_phase_exponent=0.5, x_exponent=0.5, z_exponent=0).on(
703
690
  qubits[0]
704
691
  ),
@@ -711,7 +698,6 @@ def test_with_non_clifford_measurements():
711
698
 
712
699
 
713
700
  def test_cross_clifford_pieces_filling_merge():
714
- # pylint: disable=line-too-long
715
701
  """Test case diagrams.
716
702
  Input:
717
703
  0: ─────────────────────────────────PhXZ(a=0.2,x=0.2,z=0.1)───@─────────────────────────PhXZ(a=0.2,x=0.2,z=0.1)───@───PhXZ(a=0.2,x=0.2,z=0.1)───H───
@@ -742,23 +728,22 @@ def test_cross_clifford_pieces_filling_merge():
742
728
  5: ───PhXZ(a=0.2,x=0.2,z=0.1)───@───PhXZ(a=0.2,x=0.2,z=0.1)───@─────────────────────────PhXZ(a=0.2,x=0.2,z=0.1)───@───PhXZ(a=-0.8,x=0.2,z=-0.9)───H────────────────────────
743
729
 
744
730
  6: ───────────────────────────────────────────────────────────PhXZ(a=0.2,x=0.2,z=0.1)───X─────────────────────────@───PhXZ(a=0.8,x=0.8,z=0.5)─────H────────────────────────
745
- """
746
- # pylint: enable
731
+ """ # noqa: E501
747
732
  qubits = cirq.LineQubit.range(7)
748
733
  phased_xz_gate = cirq.PhasedXZGate(axis_phase_exponent=0.2, x_exponent=0.2, z_exponent=0.1)
749
734
  assert_dd(
750
735
  input_circuit=cirq.Circuit(
751
736
  cirq.Moment([phased_xz_gate.on(qubits[i]) for i in [2, 5]]),
752
- cirq.Moment(cirq.CZ(qubits[2], qubits[5])),
737
+ cirq.Moment(CZ(qubits[2], qubits[5])),
753
738
  cirq.Moment([phased_xz_gate.on(qubits[i]) for i in [0, 1, 2, 3, 5]]),
754
739
  cirq.Moment(
755
- [cirq.CZ(qubits[i0], qubits[i1]) for i0, i1 in [(0, 1), (2, 3), (4, 5)]]
740
+ [CZ(qubits[i0], qubits[i1]) for i0, i1 in [(0, 1), (2, 3), (4, 5)]]
756
741
  + [phased_xz_gate.on(qubits[6])]
757
742
  ),
758
743
  cirq.Moment([phased_xz_gate.on(qubits[i]) for i in [0, 1, 2, 5]]),
759
- cirq.Moment([cirq.CZ(qubits[i0], qubits[i1]) for i0, i1 in [(0, 1), (2, 3), (5, 6)]]),
744
+ cirq.Moment([CZ(qubits[i0], qubits[i1]) for i0, i1 in [(0, 1), (2, 3), (5, 6)]]),
760
745
  cirq.Moment([phased_xz_gate.on(qubits[i]) for i in [0, 1, 5, 6]]),
761
- cirq.Moment([cirq.H.on(q) for q in qubits]),
746
+ cirq.Moment([H.on(q) for q in qubits]),
762
747
  ),
763
748
  expected_circuit="""
764
749
  0: ─────────────────────────────────PhXZ(a=0.2,x=0.2,z=0.1)───@─────────────────────────PhXZ(a=0.2,x=0.2,z=0.1)───@───PhXZ(a=0.2,x=0.2,z=0.1)─────H────────────────────────
@@ -774,7 +759,7 @@ def test_cross_clifford_pieces_filling_merge():
774
759
  5: ───PhXZ(a=0.2,x=0.2,z=0.1)───@───PhXZ(a=0.2,x=0.2,z=0.1)───@─────────────────────────PhXZ(a=0.2,x=0.2,z=0.1)───@───PhXZ(a=-0.8,x=0.2,z=-0.9)───H────────────────────────
775
760
 
776
761
  6: ───────────────────────────────────────────────────────────PhXZ(a=0.2,x=0.2,z=0.1)───X─────────────────────────@───PhXZ(a=0.8,x=0.8,z=0.5)─────H────────────────────────
777
- """,
762
+ """, # noqa: E501
778
763
  )
779
764
 
780
765
 
@@ -792,11 +777,11 @@ def test_pull_through_phxz_gate_case1():
792
777
  phxz = cirq.PhasedXZGate(axis_phase_exponent=0.25, x_exponent=-1, z_exponent=0)
793
778
  assert_dd(
794
779
  input_circuit=cirq.Circuit(
795
- cirq.Moment(cirq.H(a), cirq.H(b)),
796
- cirq.Moment(cirq.H(b)),
797
- cirq.Moment(phxz(a), cirq.H(b)),
798
- cirq.Moment(cirq.H(b)),
799
- cirq.Moment(cirq.CNOT(a, b)),
780
+ cirq.Moment(H(a), H(b)),
781
+ cirq.Moment(H(b)),
782
+ cirq.Moment(phxz(a), H(b)),
783
+ cirq.Moment(H(b)),
784
+ cirq.Moment(CNOT(a, b)),
800
785
  ),
801
786
  expected_circuit="""
802
787
  a: ───H───X───PhXZ(a=0.25,x=-1,z=0)───X───@───Z───
@@ -821,11 +806,11 @@ def test_pull_through_phxz_gate_case2():
821
806
  phxz = cirq.PhasedXZGate(axis_phase_exponent=0.2, x_exponent=-1, z_exponent=0)
822
807
  assert_dd(
823
808
  input_circuit=cirq.Circuit(
824
- cirq.Moment(cirq.H(a), cirq.H(b)),
825
- cirq.Moment(cirq.H(b)),
826
- cirq.Moment(phxz(a), cirq.H(b)),
827
- cirq.Moment(cirq.H(b)),
828
- cirq.Moment(cirq.CNOT(a, b)),
809
+ cirq.Moment(H(a), H(b)),
810
+ cirq.Moment(H(b)),
811
+ cirq.Moment(phxz(a), H(b)),
812
+ cirq.Moment(H(b)),
813
+ cirq.Moment(CNOT(a, b)),
829
814
  ),
830
815
  expected_circuit="""
831
816
  a: ───H───X───PhXZ(a=0.1,x=0,z=0.4)───X───@───X───
@@ -834,3 +819,36 @@ b: ───H───H───H───────────────
834
819
  """,
835
820
  schema="XX_PAIR",
836
821
  )
822
+
823
+
824
+ def test_merge_before_non_cliffords():
825
+ """Test case diagrams.
826
+ Input circuit:
827
+ 0: ───X──────────────────────────────────────────────────M───
828
+
829
+ 1: ───X───────PhXZ(a=-1,x=0,z=-0.5)───FSim(0, 0.0637π)───M───
830
+
831
+ 2: ───X───X───S───────────────────────FSim(0, 0.0637π)───M───
832
+ """
833
+ q0, q1, q2 = cirq.LineQubit.range(3)
834
+ input_circuit = cirq.Circuit(
835
+ cirq.Moment([X(q) for q in [q0, q1, q2]]),
836
+ cirq.Moment(X(q2)),
837
+ cirq.Moment(
838
+ cirq.PhasedXZGate(axis_phase_exponent=-1, x_exponent=0, z_exponent=-0.5).on(q1),
839
+ (Z**0.5).on(q2),
840
+ ),
841
+ cirq.Moment(cirq.FSimGate(theta=0, phi=0.2).on(q1, q2)),
842
+ cirq.Moment([cirq.M(q) for q in [q0, q1, q2]]),
843
+ )
844
+ assert_dd(
845
+ input_circuit=input_circuit,
846
+ expected_circuit="""
847
+ 0: ───X───X───X──────────────────────────────────────────M───
848
+
849
+ 1: ───X───X───PhXZ(a=-1.25,x=1,z=0)───FSim(0, 0.0637π)───M───
850
+
851
+ 2: ───X───X───S───────────────────────FSim(0, 0.0637π)───M───
852
+ """,
853
+ schema="XX_PAIR",
854
+ )