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,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import abc
16
- from typing import Dict, TYPE_CHECKING
18
+ from typing import TYPE_CHECKING
17
19
 
18
20
  from cirq import value
19
21
 
@@ -37,7 +39,7 @@ class AbstractInitialMapper(metaclass=abc.ABCMeta):
37
39
  """
38
40
 
39
41
  @abc.abstractmethod
40
- def initial_mapping(self, circuit: 'cirq.AbstractCircuit') -> Dict['cirq.Qid', 'cirq.Qid']:
42
+ def initial_mapping(self, circuit: cirq.AbstractCircuit) -> dict[cirq.Qid, cirq.Qid]:
41
43
  """Maps the logical qubits of a circuit onto physical qubits on a device.
42
44
 
43
45
  Args:
@@ -52,10 +54,10 @@ class AbstractInitialMapper(metaclass=abc.ABCMeta):
52
54
  class HardCodedInitialMapper(AbstractInitialMapper):
53
55
  """Initial Mapper class takes a hard-coded mapping and returns it."""
54
56
 
55
- def __init__(self, _map: Dict['cirq.Qid', 'cirq.Qid']) -> None:
57
+ def __init__(self, _map: dict[cirq.Qid, cirq.Qid]) -> None:
56
58
  self._map = _map
57
59
 
58
- def initial_mapping(self, circuit: 'cirq.AbstractCircuit') -> Dict['cirq.Qid', 'cirq.Qid']:
60
+ def initial_mapping(self, circuit: cirq.AbstractCircuit) -> dict[cirq.Qid, cirq.Qid]:
59
61
  """Returns the hard-coded initial mapping.
60
62
 
61
63
  Args:
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import pytest
16
18
 
17
19
  import cirq
@@ -30,8 +30,10 @@ If some logical qubits are unampped after this first procedure then there are tw
30
30
  the nearest available neighbor to the center of the device.
31
31
  """
32
32
 
33
+ from __future__ import annotations
34
+
33
35
  from collections import deque
34
- from typing import Deque, Dict, List, Set, Tuple, TYPE_CHECKING
36
+ from typing import TYPE_CHECKING
35
37
 
36
38
  import networkx as nx
37
39
 
@@ -82,8 +84,8 @@ class LineInitialMapper(initial_mapper.AbstractInitialMapper):
82
84
  self.center = nx.center(self.device_graph)[0]
83
85
 
84
86
  def _make_circuit_graph(
85
- self, circuit: 'cirq.AbstractCircuit'
86
- ) -> Tuple[List[Deque['cirq.Qid']], Dict['cirq.Qid', 'cirq.Qid']]:
87
+ self, circuit: cirq.AbstractCircuit
88
+ ) -> tuple[list[deque[cirq.Qid]], dict[cirq.Qid, cirq.Qid]]:
87
89
  """Creates a (potentially incomplete) qubit connectivity graph of the circuit.
88
90
 
89
91
  Iterates over moments in the circuit from left to right and adds edges between logical
@@ -99,11 +101,11 @@ class LineInitialMapper(initial_mapper.AbstractInitialMapper):
99
101
  The (potentially incomplete) qubit connectivity graph of the circuit, which is
100
102
  guaranteed to be a forest of line graphs.
101
103
  """
102
- circuit_graph: List[Deque['cirq.Qid']] = [deque([q]) for q in sorted(circuit.all_qubits())]
103
- component_id: Dict['cirq.Qid', int] = {q[0]: i for i, q in enumerate(circuit_graph)}
104
- partners: Dict['cirq.Qid', 'cirq.Qid'] = {}
104
+ circuit_graph: list[deque[cirq.Qid]] = [deque([q]) for q in sorted(circuit.all_qubits())]
105
+ component_id: dict[cirq.Qid, int] = {q[0]: i for i, q in enumerate(circuit_graph)}
106
+ partners: dict[cirq.Qid, cirq.Qid] = {}
105
107
 
106
- def degree_lt_two(q: 'cirq.Qid'):
108
+ def degree_lt_two(q: cirq.Qid):
107
109
  return any(circuit_graph[component_id[q]][i] == q for i in [-1, 0])
108
110
 
109
111
  for op in circuit.all_operations():
@@ -141,7 +143,7 @@ class LineInitialMapper(initial_mapper.AbstractInitialMapper):
141
143
  )
142
144
  return graph, partners
143
145
 
144
- def initial_mapping(self, circuit: 'cirq.AbstractCircuit') -> Dict['cirq.Qid', 'cirq.Qid']:
146
+ def initial_mapping(self, circuit: cirq.AbstractCircuit) -> dict[cirq.Qid, cirq.Qid]:
145
147
  """Maps disjoint lines of logical qubits onto lines of physical qubits.
146
148
 
147
149
  Args:
@@ -151,13 +153,13 @@ class LineInitialMapper(initial_mapper.AbstractInitialMapper):
151
153
  a dictionary that maps logical qubits in the circuit (keys) to physical qubits on the
152
154
  device (values).
153
155
  """
154
- mapped_physicals: Set['cirq.Qid'] = set()
155
- qubit_map: Dict['cirq.Qid', 'cirq.Qid'] = {}
156
+ mapped_physicals: set[cirq.Qid] = set()
157
+ qubit_map: dict[cirq.Qid, cirq.Qid] = {}
156
158
  circuit_graph, partners = self._make_circuit_graph(circuit)
157
159
 
158
160
  def next_physical(
159
- current_physical: 'cirq.Qid', partner: 'cirq.Qid', isolated: bool = False
160
- ) -> 'cirq.Qid':
161
+ current_physical: cirq.Qid, partner: cirq.Qid, isolated: bool = False
162
+ ) -> cirq.Qid:
161
163
  # Handle the first physical qubit getting mapped.
162
164
  if current_physical not in mapped_physicals:
163
165
  return current_physical
@@ -189,8 +191,8 @@ class LineInitialMapper(initial_mapper.AbstractInitialMapper):
189
191
  return qubit_map
190
192
 
191
193
  def _closest_unmapped_qubit(
192
- self, source: 'cirq.Qid', mapped_physicals: Set['cirq.Qid']
193
- ) -> 'cirq.Qid':
194
+ self, source: cirq.Qid, mapped_physicals: set[cirq.Qid]
195
+ ) -> cirq.Qid:
194
196
  """Finds the closest available neighbor to a physical qubit 'source' on the device.
195
197
 
196
198
  Args:
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import networkx as nx
16
18
  import pytest
17
19
 
@@ -66,7 +68,7 @@ def construct_valid_circuit():
66
68
  )
67
69
 
68
70
 
69
- def test_valid_circuit():
71
+ def test_valid_circuit() -> None:
70
72
  # Any circuit with a (full connectivity) graph of disjoint lines should be directly
71
73
  # executable after mapping a a supporting device topology without the need for inserting
72
74
  # any swaps.
@@ -79,7 +81,7 @@ def test_valid_circuit():
79
81
  device.validate_circuit(mapped_circuit)
80
82
 
81
83
 
82
- def test_long_line_on_grid_device():
84
+ def test_long_line_on_grid_device() -> None:
83
85
  # tests
84
86
  # -if strategy is able to map a single long line onto the device whenever the device topology
85
87
  # supports it (i.e. is Hamiltonian)
@@ -106,7 +108,7 @@ def test_long_line_on_grid_device():
106
108
  mapper.initial_mapping(step_circuit)
107
109
 
108
110
 
109
- def test_small_circuit_on_grid_device():
111
+ def test_small_circuit_on_grid_device() -> None:
110
112
  circuit = construct_small_circuit()
111
113
  device_graph = cirq.testing.construct_grid_device(7, 7).metadata.nx_graph
112
114
  mapper = cirq.LineInitialMapper(device_graph)
@@ -126,7 +128,7 @@ def test_small_circuit_on_grid_device():
126
128
  cirq.testing.assert_same_circuits(circuit.transform_qubits(mapping), expected_circuit)
127
129
 
128
130
 
129
- def test_small_circuit_on_ring_device():
131
+ def test_small_circuit_on_ring_device() -> None:
130
132
  circuit = construct_small_circuit()
131
133
  device_graph = cirq.testing.construct_ring_device(10, directed=True).metadata.nx_graph
132
134
 
@@ -159,7 +161,7 @@ glob_mapper = cirq.LineInitialMapper(glob_device_graph)
159
161
  )
160
162
  def test_random_circuits_grid_device(
161
163
  qubits: int, n_moments: int, op_density: float, random_state: int
162
- ):
164
+ ) -> None:
163
165
  c_orig = cirq.testing.random_circuit(
164
166
  qubits=qubits, n_moments=n_moments, op_density=op_density, random_state=random_state
165
167
  )
@@ -176,7 +178,7 @@ def test_random_circuits_grid_device(
176
178
  )
177
179
  def test_large_random_circuits_grid_device(
178
180
  qubits: int, n_moments: int, op_density: float, random_state: int
179
- ):
181
+ ) -> None:
180
182
  c_orig = cirq.testing.random_circuit(
181
183
  qubits=qubits, n_moments=n_moments, op_density=op_density, random_state=random_state
182
184
  )
@@ -187,7 +189,7 @@ def test_large_random_circuits_grid_device(
187
189
  assert nx.is_connected(nx.induced_subgraph(glob_device_graph, mapping.values()))
188
190
 
189
191
 
190
- def test_repr():
192
+ def test_repr() -> None:
191
193
  device_graph = cirq.testing.construct_grid_device(7, 7).metadata.nx_graph
192
194
  mapper = cirq.LineInitialMapper(device_graph)
193
195
  cirq.testing.assert_equivalent_repr(mapper, setup_code='import cirq\nimport networkx as nx')
@@ -14,7 +14,9 @@
14
14
 
15
15
  """Manages the mapping from logical to physical qubits during a routing procedure."""
16
16
 
17
- from typing import Dict, List, Sequence, TYPE_CHECKING
17
+ from __future__ import annotations
18
+
19
+ from typing import Sequence, TYPE_CHECKING
18
20
 
19
21
  import networkx as nx
20
22
  import numpy as np
@@ -35,9 +37,7 @@ class MappingManager:
35
37
  logical qubits are mapped to, via `self.logical_qid_to_int` map).
36
38
  """
37
39
 
38
- def __init__(
39
- self, device_graph: nx.Graph, initial_mapping: Dict['cirq.Qid', 'cirq.Qid']
40
- ) -> None:
40
+ def __init__(self, device_graph: nx.Graph, initial_mapping: dict[cirq.Qid, cirq.Qid]) -> None:
41
41
  """Initializes MappingManager.
42
42
 
43
43
  Args:
@@ -84,12 +84,12 @@ class MappingManager:
84
84
  )
85
85
 
86
86
  @property
87
- def physical_qid_to_int(self) -> Dict['cirq.Qid', int]:
87
+ def physical_qid_to_int(self) -> dict[cirq.Qid, int]:
88
88
  """Mapping of physical qubits, that were part of the initial mapping, to unique integers."""
89
89
  return self._physical_qid_to_int
90
90
 
91
91
  @property
92
- def int_to_physical_qid(self) -> List['cirq.Qid']:
92
+ def int_to_physical_qid(self) -> list[cirq.Qid]:
93
93
  """Inverse mapping of unique integers to corresponding physical qubits.
94
94
 
95
95
  `self.physical_qid_to_int[self.int_to_physical_qid[i]] == i` for each i.
@@ -97,12 +97,12 @@ class MappingManager:
97
97
  return self._int_to_physical_qid
98
98
 
99
99
  @property
100
- def logical_qid_to_int(self) -> Dict['cirq.Qid', int]:
100
+ def logical_qid_to_int(self) -> dict[cirq.Qid, int]:
101
101
  """Mapping of logical qubits, that were part of the initial mapping, to unique integers."""
102
102
  return self._logical_qid_to_int
103
103
 
104
104
  @property
105
- def int_to_logical_qid(self) -> List['cirq.Qid']:
105
+ def int_to_logical_qid(self) -> list[cirq.Qid]:
106
106
  """Inverse mapping of unique integers to corresponding physical qubits.
107
107
 
108
108
  `self.logical_qid_to_int[self.int_to_logical_qid[i]] == i` for each i.
@@ -178,7 +178,7 @@ class MappingManager:
178
178
  self._logical_to_physical[[lq1, lq2]] = self._logical_to_physical[[lq2, lq1]]
179
179
  self._physical_to_logical[[pq1, pq2]] = self._physical_to_logical[[pq2, pq1]]
180
180
 
181
- def mapped_op(self, op: 'cirq.Operation') -> 'cirq.Operation':
181
+ def mapped_op(self, op: cirq.Operation) -> cirq.Operation:
182
182
  """Transforms the given logical operation to act on corresponding physical qubits.
183
183
 
184
184
  Args:
@@ -189,7 +189,7 @@ class MappingManager:
189
189
  """
190
190
  logical_ints = [self._logical_qid_to_int[q] for q in op.qubits]
191
191
  physical_ints = self.logical_to_physical[logical_ints]
192
- qubit_map: Dict['cirq.Qid', 'cirq.Qid'] = {
192
+ qubit_map: dict[cirq.Qid, cirq.Qid] = {
193
193
  q: self._int_to_physical_qid[physical_ints[i]] for i, q in enumerate(op.qubits)
194
194
  }
195
195
  return op.transform_qubits(qubit_map)
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import networkx as nx
16
18
  import pytest
17
19
  from networkx.utils.misc import graphs_equal
@@ -14,8 +14,10 @@
14
14
 
15
15
  """Heuristic qubit routing algorithm based on arxiv:1902.08091."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import itertools
18
- from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, TYPE_CHECKING
20
+ from typing import Any, Sequence, TYPE_CHECKING
19
21
 
20
22
  import networkx as nx
21
23
 
@@ -26,12 +28,12 @@ from cirq.transformers.routing import line_initial_mapper, mapping_manager
26
28
  if TYPE_CHECKING:
27
29
  import cirq
28
30
 
29
- QidIntPair = Tuple[int, int]
31
+ QidIntPair = tuple[int, int]
30
32
 
31
33
 
32
34
  def _disjoint_nc2_combinations(
33
35
  qubit_pairs: Sequence[QidIntPair],
34
- ) -> List[Tuple[QidIntPair, QidIntPair]]:
36
+ ) -> list[tuple[QidIntPair, QidIntPair]]:
35
37
  """Gets disjoint pair combinations of qubits pairs.
36
38
 
37
39
  For example:
@@ -108,13 +110,13 @@ class RouteCQC:
108
110
 
109
111
  def __call__(
110
112
  self,
111
- circuit: 'cirq.AbstractCircuit',
113
+ circuit: cirq.AbstractCircuit,
112
114
  *,
113
115
  lookahead_radius: int = 8,
114
116
  tag_inserted_swaps: bool = False,
115
- initial_mapper: Optional['cirq.AbstractInitialMapper'] = None,
116
- context: Optional['cirq.TransformerContext'] = None,
117
- ) -> 'cirq.AbstractCircuit':
117
+ initial_mapper: cirq.AbstractInitialMapper | None = None,
118
+ context: cirq.TransformerContext | None = None,
119
+ ) -> cirq.AbstractCircuit:
118
120
  """Transforms the given circuit to make it executable on the device.
119
121
 
120
122
  This method calls self.route_circuit and returns the routed circuit. See docstring of
@@ -150,13 +152,13 @@ class RouteCQC:
150
152
 
151
153
  def route_circuit(
152
154
  self,
153
- circuit: 'cirq.AbstractCircuit',
155
+ circuit: cirq.AbstractCircuit,
154
156
  *,
155
157
  lookahead_radius: int = 8,
156
158
  tag_inserted_swaps: bool = False,
157
- initial_mapper: Optional['cirq.AbstractInitialMapper'] = None,
158
- context: Optional['cirq.TransformerContext'] = None,
159
- ) -> Tuple['cirq.AbstractCircuit', Dict['cirq.Qid', 'cirq.Qid'], Dict['cirq.Qid', 'cirq.Qid']]:
159
+ initial_mapper: cirq.AbstractInitialMapper | None = None,
160
+ context: cirq.TransformerContext | None = None,
161
+ ) -> tuple[cirq.AbstractCircuit, dict[cirq.Qid, cirq.Qid], dict[cirq.Qid, cirq.Qid]]:
160
162
  """Transforms the given circuit to make it executable on the device.
161
163
 
162
164
  This transformer assumes that all multi-qubit operations have been decomposed into 2-qubit
@@ -241,8 +243,8 @@ class RouteCQC:
241
243
 
242
244
  @classmethod
243
245
  def _get_one_and_two_qubit_ops_as_timesteps(
244
- cls, circuit: 'cirq.AbstractCircuit'
245
- ) -> Tuple[List[List['cirq.Operation']], List[List['cirq.Operation']]]:
246
+ cls, circuit: cirq.AbstractCircuit
247
+ ) -> tuple[list[list[cirq.Operation]], list[list[cirq.Operation]]]:
246
248
  """Gets the single and two qubit operations of the circuit factored into timesteps.
247
249
 
248
250
  The i'th entry in the nested two-qubit and single-qubit ops correspond to the two-qubit
@@ -254,7 +256,7 @@ class RouteCQC:
254
256
  qubits with a custom key.
255
257
  """
256
258
  two_qubit_circuit = circuits.Circuit()
257
- single_qubit_ops: List[List[cirq.Operation]] = []
259
+ single_qubit_ops: list[list[cirq.Operation]] = []
258
260
 
259
261
  for i, moment in enumerate(circuit):
260
262
  for op in moment:
@@ -286,11 +288,11 @@ class RouteCQC:
286
288
  def _route(
287
289
  cls,
288
290
  mm: mapping_manager.MappingManager,
289
- two_qubit_ops: List[List['cirq.Operation']],
290
- single_qubit_ops: List[List['cirq.Operation']],
291
+ two_qubit_ops: list[list[cirq.Operation]],
292
+ single_qubit_ops: list[list[cirq.Operation]],
291
293
  lookahead_radius: int,
292
294
  tag_inserted_swaps: bool = False,
293
- ) -> List[List['cirq.Operation']]:
295
+ ) -> list[list[cirq.Operation]]:
294
296
  """Main routing procedure that inserts necessary swaps on the given timesteps.
295
297
 
296
298
  The i'th element of the returned list corresponds to the routed operatiosn in the i'th
@@ -309,18 +311,18 @@ class RouteCQC:
309
311
  Returns:
310
312
  a list of lists corresponding to timesteps of the routed circuit.
311
313
  """
312
- two_qubit_ops_ints: List[List[QidIntPair]] = [
314
+ two_qubit_ops_ints: list[list[QidIntPair]] = [
313
315
  [
314
316
  (mm.logical_qid_to_int[op.qubits[0]], mm.logical_qid_to_int[op.qubits[1]])
315
317
  for op in timestep_ops
316
318
  ]
317
319
  for timestep_ops in two_qubit_ops
318
320
  ]
319
- routed_ops: List[List['cirq.Operation']] = []
321
+ routed_ops: list[list[cirq.Operation]] = []
320
322
 
321
323
  def process_executable_two_qubit_ops(timestep: int) -> int:
322
- unexecutable_ops: List['cirq.Operation'] = []
323
- unexecutable_ops_ints: List[QidIntPair] = []
324
+ unexecutable_ops: list[cirq.Operation] = []
325
+ unexecutable_ops_ints: list[QidIntPair] = []
324
326
  for op, op_ints in zip(two_qubit_ops[timestep], two_qubit_ops_ints[timestep]):
325
327
  if mm.is_adjacent(*op_ints):
326
328
  routed_ops[timestep].append(mm.mapped_op(op))
@@ -339,10 +341,10 @@ class RouteCQC:
339
341
 
340
342
  # swaps applied in the current timestep thus far. This ensures the same swaps
341
343
  # don't get executed twice in the same timestep.
342
- seen: Set[Tuple[QidIntPair, ...]] = set()
344
+ seen: set[tuple[QidIntPair, ...]] = set()
343
345
 
344
346
  while process_executable_two_qubit_ops(timestep):
345
- chosen_swaps: Optional[Tuple[QidIntPair, ...]] = None
347
+ chosen_swaps: tuple[QidIntPair, ...] | None = None
346
348
  for strat in strats:
347
349
  chosen_swaps = strat(mm, two_qubit_ops_ints, timestep, lookahead_radius)
348
350
  if chosen_swaps is not None:
@@ -370,7 +372,7 @@ class RouteCQC:
370
372
  mm: mapping_manager.MappingManager,
371
373
  two_qubit_ops_ints: Sequence[Sequence[QidIntPair]],
372
374
  timestep: int,
373
- ) -> Tuple[QidIntPair, ...]:
375
+ ) -> tuple[QidIntPair, ...]:
374
376
  """Inserts SWAPS along the shortest path of the qubits that are the farthest.
375
377
 
376
378
  Since swaps along the shortest path are being executed one after the other, in order
@@ -388,7 +390,7 @@ class RouteCQC:
388
390
  two_qubit_ops_ints: Sequence[Sequence[QidIntPair]],
389
391
  timestep: int,
390
392
  lookahead_radius: int,
391
- ) -> Optional[Tuple[QidIntPair, ...]]:
393
+ ) -> tuple[QidIntPair, ...] | None:
392
394
  """Computes cost function with pairs of candidate swaps that act on disjoint qubits."""
393
395
  pair_sigma = _disjoint_nc2_combinations(
394
396
  cls._initial_candidate_swaps(mm, two_qubit_ops_ints[timestep])
@@ -404,9 +406,9 @@ class RouteCQC:
404
406
  two_qubit_ops_ints: Sequence[Sequence[QidIntPair]],
405
407
  timestep: int,
406
408
  lookahead_radius: int,
407
- ) -> Optional[Tuple[QidIntPair, ...]]:
409
+ ) -> tuple[QidIntPair, ...] | None:
408
410
  """Computes cost function with list of single candidate swaps."""
409
- sigma: List[Tuple[QidIntPair, ...]] = [
411
+ sigma: list[tuple[QidIntPair, ...]] = [
410
412
  (swap,) for swap in cls._initial_candidate_swaps(mm, two_qubit_ops_ints[timestep])
411
413
  ]
412
414
  return cls._choose_optimal_swap(mm, two_qubit_ops_ints, timestep, lookahead_radius, sigma)
@@ -418,8 +420,8 @@ class RouteCQC:
418
420
  two_qubit_ops_ints: Sequence[Sequence[QidIntPair]],
419
421
  timestep: int,
420
422
  lookahead_radius: int,
421
- sigma: Sequence[Tuple[QidIntPair, ...]],
422
- ) -> Optional[Tuple[QidIntPair, ...]]:
423
+ sigma: Sequence[tuple[QidIntPair, ...]],
424
+ ) -> tuple[QidIntPair, ...] | None:
423
425
  """Optionally returns the swap with minimum cost from a list of n-tuple candidate swaps.
424
426
 
425
427
  Computes a cost (as defined by the overridable function `_cost`) for each candidate swap
@@ -447,7 +449,7 @@ class RouteCQC:
447
449
  @classmethod
448
450
  def _initial_candidate_swaps(
449
451
  cls, mm: mapping_manager.MappingManager, two_qubit_ops: Sequence[QidIntPair]
450
- ) -> List[QidIntPair]:
452
+ ) -> list[QidIntPair]:
451
453
  """Finds all feasible SWAPs between qubits involved in 2-qubit operations."""
452
454
  physical_qubits = (mm.logical_to_physical[lq[i]] for lq in two_qubit_ops for i in range(2))
453
455
  physical_swaps = mm.induced_subgraph_int.edges(nbunch=physical_qubits)
@@ -459,7 +461,7 @@ class RouteCQC:
459
461
  def _cost(
460
462
  cls,
461
463
  mm: mapping_manager.MappingManager,
462
- swaps: Tuple[QidIntPair, ...],
464
+ swaps: tuple[QidIntPair, ...],
463
465
  two_qubit_ops: Sequence[QidIntPair],
464
466
  ) -> Any:
465
467
  """Computes the cost function for the given list of swaps over the current timestep ops.
@@ -12,12 +12,14 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import pytest
16
18
 
17
19
  import cirq
18
20
 
19
21
 
20
- def test_directed_device():
22
+ def test_directed_device() -> None:
21
23
  device = cirq.testing.construct_ring_device(10, directed=True)
22
24
  device_graph = device.metadata.nx_graph
23
25
  with pytest.raises(ValueError, match="Device graph must be undirected."):
@@ -33,7 +35,7 @@ def test_directed_device():
33
35
  for op_density in [0.3, 0.5, 0.7]
34
36
  ],
35
37
  )
36
- def test_route_small_circuit_random(n_qubits, n_moments, op_density, seed):
38
+ def test_route_small_circuit_random(n_qubits, n_moments, op_density, seed) -> None:
37
39
  c_orig = cirq.testing.random_circuit(
38
40
  qubits=n_qubits, n_moments=n_moments, op_density=op_density, random_state=seed
39
41
  )
@@ -47,7 +49,7 @@ def test_route_small_circuit_random(n_qubits, n_moments, op_density, seed):
47
49
  )
48
50
 
49
51
 
50
- def test_high_qubit_count():
52
+ def test_high_qubit_count() -> None:
51
53
  c_orig = cirq.testing.random_circuit(qubits=40, n_moments=350, op_density=0.4, random_state=0)
52
54
  device = cirq.testing.construct_grid_device(7, 7)
53
55
  device_graph = device.metadata.nx_graph
@@ -56,7 +58,7 @@ def test_high_qubit_count():
56
58
  device.validate_circuit(c_routed)
57
59
 
58
60
 
59
- def test_multi_qubit_gate_inputs():
61
+ def test_multi_qubit_gate_inputs() -> None:
60
62
  device = cirq.testing.construct_grid_device(4, 4)
61
63
  device_graph = device.metadata.nx_graph
62
64
  router = cirq.RouteCQC(device_graph)
@@ -97,7 +99,7 @@ def test_multi_qubit_gate_inputs():
97
99
  device.validate_circuit(c_routed)
98
100
 
99
101
 
100
- def test_circuit_with_measurement_gates():
102
+ def test_circuit_with_measurement_gates() -> None:
101
103
  device = cirq.testing.construct_ring_device(3)
102
104
  device_graph = device.metadata.nx_graph
103
105
  q = cirq.LineQubit.range(3)
@@ -108,7 +110,7 @@ def test_circuit_with_measurement_gates():
108
110
  cirq.testing.assert_same_circuits(routed_circuit, circuit)
109
111
 
110
112
 
111
- def test_circuit_with_two_qubit_intermediate_measurement_gate():
113
+ def test_circuit_with_two_qubit_intermediate_measurement_gate() -> None:
112
114
  device = cirq.testing.construct_ring_device(2)
113
115
  device_graph = device.metadata.nx_graph
114
116
  router = cirq.RouteCQC(device_graph)
@@ -121,7 +123,7 @@ def test_circuit_with_two_qubit_intermediate_measurement_gate():
121
123
  device.validate_circuit(routed_circuit)
122
124
 
123
125
 
124
- def test_circuit_with_multi_qubit_intermediate_measurement_gate_and_with_default_key():
126
+ def test_circuit_with_multi_qubit_intermediate_measurement_gate_and_with_default_key() -> None:
125
127
  device = cirq.testing.construct_ring_device(3)
126
128
  device_graph = device.metadata.nx_graph
127
129
  router = cirq.RouteCQC(device_graph)
@@ -135,7 +137,7 @@ def test_circuit_with_multi_qubit_intermediate_measurement_gate_and_with_default
135
137
  cirq.testing.assert_same_circuits(routed_circuit, expected)
136
138
 
137
139
 
138
- def test_circuit_with_multi_qubit_intermediate_measurement_gate_with_custom_key():
140
+ def test_circuit_with_multi_qubit_intermediate_measurement_gate_with_custom_key() -> None:
139
141
  device = cirq.testing.construct_ring_device(3)
140
142
  device_graph = device.metadata.nx_graph
141
143
  router = cirq.RouteCQC(device_graph)
@@ -150,7 +152,7 @@ def test_circuit_with_multi_qubit_intermediate_measurement_gate_with_custom_key(
150
152
  )
151
153
 
152
154
 
153
- def test_circuit_with_non_unitary_and_global_phase():
155
+ def test_circuit_with_non_unitary_and_global_phase() -> None:
154
156
  device = cirq.testing.construct_ring_device(4)
155
157
  device_graph = device.metadata.nx_graph
156
158
  q = cirq.LineQubit.range(3)
@@ -176,7 +178,7 @@ def test_circuit_with_non_unitary_and_global_phase():
176
178
  cirq.testing.assert_same_circuits(routed_circuit, expected)
177
179
 
178
180
 
179
- def test_circuit_with_tagged_ops():
181
+ def test_circuit_with_tagged_ops() -> None:
180
182
  device = cirq.testing.construct_ring_device(4)
181
183
  device_graph = device.metadata.nx_graph
182
184
  q = cirq.LineQubit.range(3)
@@ -205,7 +207,7 @@ def test_circuit_with_tagged_ops():
205
207
  cirq.testing.assert_same_circuits(routed_circuit, expected)
206
208
 
207
209
 
208
- def test_already_valid_circuit():
210
+ def test_already_valid_circuit() -> None:
209
211
  device = cirq.testing.construct_ring_device(10)
210
212
  device_graph = device.metadata.nx_graph
211
213
  circuit = cirq.Circuit(
@@ -222,7 +224,7 @@ def test_already_valid_circuit():
222
224
  cirq.testing.assert_same_circuits(routed_circuit, circuit)
223
225
 
224
226
 
225
- def test_empty_circuit():
227
+ def test_empty_circuit() -> None:
226
228
  device = cirq.testing.construct_grid_device(5, 5)
227
229
  device_graph = device.metadata.nx_graph
228
230
  empty_circuit = cirq.Circuit()
@@ -235,7 +237,7 @@ def test_empty_circuit():
235
237
  )
236
238
 
237
239
 
238
- def test_repr():
240
+ def test_repr() -> None:
239
241
  device = cirq.testing.construct_ring_device(10)
240
242
  device_graph = device.metadata.nx_graph
241
243
  router = cirq.RouteCQC(device_graph)
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Dict, Optional, Tuple, TYPE_CHECKING
15
+ from __future__ import annotations
16
+
17
+ from typing import TYPE_CHECKING
16
18
 
17
19
  from cirq import circuits, ops
18
20
 
@@ -23,20 +25,19 @@ if TYPE_CHECKING:
23
25
  class _SwapPrintGate(ops.Gate):
24
26
  """A gate that displays the string representation of each qubits on the circuit."""
25
27
 
26
- def __init__(self, qubits: Tuple[Tuple['cirq.Qid', 'cirq.Qid'], ...]) -> None:
28
+ def __init__(self, qubits: tuple[tuple[cirq.Qid, cirq.Qid], ...]) -> None:
27
29
  self.qubits = qubits
28
30
 
29
31
  def num_qubits(self):
30
32
  return len(self.qubits)
31
33
 
32
- def _circuit_diagram_info_(self, args: 'cirq.CircuitDiagramInfoArgs') -> Tuple[str, ...]:
34
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, ...]:
33
35
  return tuple(f'{str(q[1])}' for q in self.qubits)
34
36
 
35
37
 
36
38
  def routed_circuit_with_mapping(
37
- routed_circuit: 'cirq.AbstractCircuit',
38
- initial_map: Optional[Dict['cirq.Qid', 'cirq.Qid']] = None,
39
- ) -> 'cirq.AbstractCircuit':
39
+ routed_circuit: cirq.AbstractCircuit, initial_map: dict[cirq.Qid, cirq.Qid] | None = None
40
+ ) -> cirq.AbstractCircuit:
40
41
  """Returns the same circuits with information about the permutation of qubits after each swap.
41
42
 
42
43
  Args:
@@ -54,7 +55,7 @@ def routed_circuit_with_mapping(
54
55
  initial_map = qdict.copy()
55
56
  inverse_map = {v: k for k, v in initial_map.items()}
56
57
 
57
- def swap_print_moment() -> 'cirq.Operation':
58
+ def swap_print_moment() -> cirq.Operation:
58
59
  return _SwapPrintGate(
59
60
  tuple(zip(qdict.values(), [inverse_map[x] for x in qdict.values()]))
60
61
  ).on(*all_qubits)
@@ -12,12 +12,14 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import pytest
16
18
 
17
19
  import cirq
18
20
 
19
21
 
20
- def test_routed_circuit_with_mapping_simple():
22
+ def test_routed_circuit_with_mapping_simple() -> None:
21
23
  q = cirq.LineQubit.range(2)
22
24
  circuit = cirq.Circuit([cirq.Moment(cirq.SWAP(q[0], q[1]).with_tags(cirq.RoutingSwapTag()))])
23
25
  expected_diagram = """
@@ -57,7 +59,7 @@ def test_routed_circuit_with_mapping_simple():
57
59
  cirq.routed_circuit_with_mapping(circuit)
58
60
 
59
61
 
60
- def test_routed_circuit_with_mapping_multi_swaps():
62
+ def test_routed_circuit_with_mapping_multi_swaps() -> None:
61
63
  q = cirq.LineQubit.range(6)
62
64
  circuit = cirq.Circuit(
63
65
  [