cirq-core 1.5.0.dev20250409222543__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.dev20250409222543.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.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -11,6 +11,9 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import numpy as np
15
18
  import pytest
16
19
 
@@ -19,11 +22,11 @@ from cirq.sim import simulation_utils
19
22
 
20
23
 
21
24
  @pytest.mark.parametrize('n,m', [(n, m) for n in range(1, 4) for m in range(1, n + 1)])
22
- def test_state_probabilities_by_indices(n: int, m: int):
25
+ def test_state_probabilities_by_indices(n: int, m: int) -> None:
23
26
  np.random.seed(0)
24
27
  state = testing.random_superposition(1 << n)
25
28
  d = (state.conj() * state).real
26
- desired_axes = list(np.random.choice(n, m, replace=False))
29
+ desired_axes = np.random.choice(n, m, replace=False).tolist()
27
30
  not_wanted = [i for i in range(n) if i not in desired_axes]
28
31
  got = simulation_utils.state_probabilities_by_indices(d, desired_axes, (2,) * n)
29
32
  want = np.transpose(d.reshape((2,) * n), desired_axes + not_wanted)
cirq/sim/simulator.py CHANGED
@@ -27,24 +27,11 @@ Simulator types include:
27
27
  as the simulation iterates through the moments of a cirq.
28
28
  """
29
29
 
30
+ from __future__ import annotations
31
+
30
32
  import abc
31
33
  import collections
32
- from typing import (
33
- Any,
34
- Callable,
35
- cast,
36
- Dict,
37
- Generic,
38
- Iterator,
39
- List,
40
- Mapping,
41
- Sequence,
42
- Set,
43
- Tuple,
44
- TYPE_CHECKING,
45
- TypeVar,
46
- Union,
47
- )
34
+ from typing import Any, Callable, cast, Generic, Iterator, Mapping, Sequence, TYPE_CHECKING, TypeVar
48
35
 
49
36
  import numpy as np
50
37
 
@@ -67,13 +54,13 @@ class SimulatesSamples(work.Sampler, metaclass=abc.ABCMeta):
67
54
  """
68
55
 
69
56
  def run_sweep(
70
- self, program: 'cirq.AbstractCircuit', params: 'cirq.Sweepable', repetitions: int = 1
71
- ) -> Sequence['cirq.Result']:
57
+ self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
58
+ ) -> Sequence[cirq.Result]:
72
59
  return list(self.run_sweep_iter(program, params, repetitions))
73
60
 
74
61
  def run_sweep_iter(
75
- self, program: 'cirq.AbstractCircuit', params: 'cirq.Sweepable', repetitions: int = 1
76
- ) -> Iterator['cirq.Result']:
62
+ self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
63
+ ) -> Iterator[cirq.Result]:
77
64
  """Runs the supplied Circuit, mimicking quantum hardware.
78
65
 
79
66
  In contrast to run, this allows for sweeping over different parameter
@@ -107,11 +94,8 @@ class SimulatesSamples(work.Sampler, metaclass=abc.ABCMeta):
107
94
 
108
95
  @abc.abstractmethod
109
96
  def _run(
110
- self,
111
- circuit: 'cirq.AbstractCircuit',
112
- param_resolver: 'cirq.ParamResolver',
113
- repetitions: int,
114
- ) -> Dict[str, np.ndarray]:
97
+ self, circuit: cirq.AbstractCircuit, param_resolver: cirq.ParamResolver, repetitions: int
98
+ ) -> dict[str, np.ndarray]:
115
99
  """Run a simulation, mimicking quantum hardware.
116
100
 
117
101
  Args:
@@ -142,10 +126,10 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
142
126
 
143
127
  def compute_amplitudes(
144
128
  self,
145
- program: 'cirq.AbstractCircuit',
129
+ program: cirq.AbstractCircuit,
146
130
  bitstrings: Sequence[int],
147
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
148
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
131
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
132
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
149
133
  ) -> Sequence[complex]:
150
134
  """Computes the desired amplitudes.
151
135
 
@@ -173,10 +157,10 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
173
157
 
174
158
  def compute_amplitudes_sweep(
175
159
  self,
176
- program: 'cirq.AbstractCircuit',
160
+ program: cirq.AbstractCircuit,
177
161
  bitstrings: Sequence[int],
178
- params: 'cirq.Sweepable',
179
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
162
+ params: cirq.Sweepable,
163
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
180
164
  ) -> Sequence[Sequence[complex]]:
181
165
  """Wraps computed amplitudes in a list.
182
166
 
@@ -186,10 +170,10 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
186
170
 
187
171
  def _compute_amplitudes_sweep_to_iter(
188
172
  self,
189
- program: 'cirq.AbstractCircuit',
173
+ program: cirq.AbstractCircuit,
190
174
  bitstrings: Sequence[int],
191
- params: 'cirq.Sweepable',
192
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
175
+ params: cirq.Sweepable,
176
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
193
177
  ) -> Iterator[Sequence[complex]]:
194
178
  if type(self).compute_amplitudes_sweep == SimulatesAmplitudes.compute_amplitudes_sweep:
195
179
  raise RecursionError(
@@ -202,10 +186,10 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
202
186
  )
203
187
  def compute_amplitudes_sweep_iter(
204
188
  self,
205
- program: 'cirq.AbstractCircuit',
189
+ program: cirq.AbstractCircuit,
206
190
  bitstrings: Sequence[int],
207
- params: 'cirq.Sweepable',
208
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
191
+ params: cirq.Sweepable,
192
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
209
193
  ) -> Iterator[Sequence[complex]]:
210
194
  """Computes the desired amplitudes.
211
195
 
@@ -232,12 +216,12 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
232
216
 
233
217
  def sample_from_amplitudes(
234
218
  self,
235
- circuit: 'cirq.AbstractCircuit',
236
- param_resolver: 'cirq.ParamResolver',
237
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE',
219
+ circuit: cirq.AbstractCircuit,
220
+ param_resolver: cirq.ParamResolver,
221
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE,
238
222
  repetitions: int = 1,
239
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
240
- ) -> Dict[int, int]:
223
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
224
+ ) -> dict[int, int]:
241
225
  """Uses amplitude simulation to sample from the given circuit.
242
226
 
243
227
  This implements the algorithm outlined by Bravyi, Gosset, and Liu in
@@ -280,7 +264,7 @@ class SimulatesAmplitudes(metaclass=value.ABCMetaImplementAnyOneOf):
280
264
  for m_id, moment in enumerate(solved_circuit[1:]):
281
265
  circuit_prefix = solved_circuit[: m_id + 1]
282
266
  for t, op in enumerate(moment.operations):
283
- new_samples: Dict[Tuple[int, ...], int] = collections.defaultdict(int)
267
+ new_samples: dict[tuple[int, ...], int] = collections.defaultdict(int)
284
268
  qubit_indices = {qmap[q] for q in op.qubits}
285
269
  subcircuit = circuit_prefix + circuits.Moment(moment.operations[: t + 1])
286
270
  for current_sample, count in current_samples.items():
@@ -315,13 +299,13 @@ class SimulatesExpectationValues(metaclass=value.ABCMetaImplementAnyOneOf):
315
299
 
316
300
  def simulate_expectation_values(
317
301
  self,
318
- program: 'cirq.AbstractCircuit',
319
- observables: Union['cirq.PauliSumLike', List['cirq.PauliSumLike']],
320
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
321
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
302
+ program: cirq.AbstractCircuit,
303
+ observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
304
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
305
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
322
306
  initial_state: Any = None,
323
307
  permit_terminal_measurements: bool = False,
324
- ) -> List[float]:
308
+ ) -> list[float]:
325
309
  """Simulates the supplied circuit and calculates exact expectation
326
310
  values for the given observables on its final state.
327
311
 
@@ -363,13 +347,13 @@ class SimulatesExpectationValues(metaclass=value.ABCMetaImplementAnyOneOf):
363
347
 
364
348
  def simulate_expectation_values_sweep(
365
349
  self,
366
- program: 'cirq.AbstractCircuit',
367
- observables: Union['cirq.PauliSumLike', List['cirq.PauliSumLike']],
368
- params: 'cirq.Sweepable',
369
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
350
+ program: cirq.AbstractCircuit,
351
+ observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
352
+ params: cirq.Sweepable,
353
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
370
354
  initial_state: Any = None,
371
355
  permit_terminal_measurements: bool = False,
372
- ) -> List[List[float]]:
356
+ ) -> list[list[float]]:
373
357
  """Wraps computed expectation values in a list.
374
358
 
375
359
  Prefer overriding `simulate_expectation_values_sweep_iter`.
@@ -387,13 +371,13 @@ class SimulatesExpectationValues(metaclass=value.ABCMetaImplementAnyOneOf):
387
371
 
388
372
  def _simulate_expectation_values_sweep_to_iter(
389
373
  self,
390
- program: 'cirq.AbstractCircuit',
391
- observables: Union['cirq.PauliSumLike', List['cirq.PauliSumLike']],
392
- params: 'cirq.Sweepable',
393
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
374
+ program: cirq.AbstractCircuit,
375
+ observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
376
+ params: cirq.Sweepable,
377
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
394
378
  initial_state: Any = None,
395
379
  permit_terminal_measurements: bool = False,
396
- ) -> Iterator[List[float]]:
380
+ ) -> Iterator[list[float]]:
397
381
  if (
398
382
  type(self).simulate_expectation_values_sweep
399
383
  == SimulatesExpectationValues.simulate_expectation_values_sweep
@@ -412,13 +396,13 @@ class SimulatesExpectationValues(metaclass=value.ABCMetaImplementAnyOneOf):
412
396
  )
413
397
  def simulate_expectation_values_sweep_iter(
414
398
  self,
415
- program: 'cirq.AbstractCircuit',
416
- observables: Union['cirq.PauliSumLike', List['cirq.PauliSumLike']],
417
- params: 'cirq.Sweepable',
418
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
399
+ program: cirq.AbstractCircuit,
400
+ observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
401
+ params: cirq.Sweepable,
402
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
419
403
  initial_state: Any = None,
420
404
  permit_terminal_measurements: bool = False,
421
- ) -> Iterator[List[float]]:
405
+ ) -> Iterator[list[float]]:
422
406
  """Simulates the supplied circuit and calculates exact expectation
423
407
  values for the given observables on its final state, sweeping over the
424
408
  given params.
@@ -470,9 +454,9 @@ class SimulatesFinalState(
470
454
 
471
455
  def simulate(
472
456
  self,
473
- program: 'cirq.AbstractCircuit',
474
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
475
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
457
+ program: cirq.AbstractCircuit,
458
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
459
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
476
460
  initial_state: Any = None,
477
461
  ) -> TSimulationTrialResult:
478
462
  """Simulates the supplied Circuit.
@@ -499,11 +483,11 @@ class SimulatesFinalState(
499
483
 
500
484
  def simulate_sweep(
501
485
  self,
502
- program: 'cirq.AbstractCircuit',
503
- params: 'cirq.Sweepable',
504
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
486
+ program: cirq.AbstractCircuit,
487
+ params: cirq.Sweepable,
488
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
505
489
  initial_state: Any = None,
506
- ) -> List[TSimulationTrialResult]:
490
+ ) -> list[TSimulationTrialResult]:
507
491
  """Wraps computed states in a list.
508
492
 
509
493
  Prefer overriding `simulate_sweep_iter`.
@@ -512,9 +496,9 @@ class SimulatesFinalState(
512
496
 
513
497
  def _simulate_sweep_to_iter(
514
498
  self,
515
- program: 'cirq.AbstractCircuit',
516
- params: 'cirq.Sweepable',
517
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
499
+ program: cirq.AbstractCircuit,
500
+ params: cirq.Sweepable,
501
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
518
502
  initial_state: Any = None,
519
503
  ) -> Iterator[TSimulationTrialResult]:
520
504
  if type(self).simulate_sweep == SimulatesFinalState.simulate_sweep:
@@ -524,9 +508,9 @@ class SimulatesFinalState(
524
508
  @value.alternative(requires='simulate_sweep', implementation=_simulate_sweep_to_iter)
525
509
  def simulate_sweep_iter(
526
510
  self,
527
- program: 'cirq.AbstractCircuit',
528
- params: 'cirq.Sweepable',
529
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
511
+ program: cirq.AbstractCircuit,
512
+ params: cirq.Sweepable,
513
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
530
514
  initial_state: Any = None,
531
515
  ) -> Iterator[TSimulationTrialResult]:
532
516
  """Simulates the supplied Circuit.
@@ -572,9 +556,9 @@ class SimulatesIntermediateState(
572
556
 
573
557
  def simulate_sweep_iter(
574
558
  self,
575
- program: 'cirq.AbstractCircuit',
576
- params: 'cirq.Sweepable',
577
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
559
+ program: cirq.AbstractCircuit,
560
+ params: cirq.Sweepable,
561
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
578
562
  initial_state: Any = None,
579
563
  ) -> Iterator[TSimulationTrialResult]:
580
564
  """Simulates the supplied Circuit.
@@ -609,7 +593,7 @@ class SimulatesIntermediateState(
609
593
  all_step_results = self.simulate_moment_steps(
610
594
  program, param_resolver, qubit_order, state
611
595
  )
612
- measurements: Dict[str, np.ndarray] = {}
596
+ measurements: dict[str, np.ndarray] = {}
613
597
  for step_result in all_step_results:
614
598
  for k, v in step_result.measurements.items():
615
599
  measurements[k] = np.array(v, dtype=np.uint8)
@@ -621,9 +605,9 @@ class SimulatesIntermediateState(
621
605
 
622
606
  def simulate_moment_steps(
623
607
  self,
624
- circuit: 'cirq.AbstractCircuit',
625
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
626
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
608
+ circuit: cirq.AbstractCircuit,
609
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
610
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
627
611
  initial_state: Any = None,
628
612
  ) -> Iterator[TStepResult]:
629
613
  """Returns an iterator of StepResults for each moment simulated.
@@ -655,7 +639,7 @@ class SimulatesIntermediateState(
655
639
 
656
640
  @abc.abstractmethod
657
641
  def _base_iterator(
658
- self, circuit: 'cirq.AbstractCircuit', qubits: Tuple['cirq.Qid', ...], initial_state: Any
642
+ self, circuit: cirq.AbstractCircuit, qubits: tuple[cirq.Qid, ...], initial_state: Any
659
643
  ) -> Iterator[TStepResult]:
660
644
  """Iterator over StepResult from Moments of a Circuit.
661
645
 
@@ -675,8 +659,8 @@ class SimulatesIntermediateState(
675
659
  @abc.abstractmethod
676
660
  def _create_simulator_trial_result(
677
661
  self,
678
- params: 'cirq.ParamResolver',
679
- measurements: Dict[str, np.ndarray],
662
+ params: cirq.ParamResolver,
663
+ measurements: dict[str, np.ndarray],
680
664
  final_simulator_state: TSimulatorState,
681
665
  ) -> TSimulationTrialResult:
682
666
  """This method can be implemented to create a trial result.
@@ -723,9 +707,9 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
723
707
  @abc.abstractmethod
724
708
  def sample(
725
709
  self,
726
- qubits: List['cirq.Qid'],
710
+ qubits: list[cirq.Qid],
727
711
  repetitions: int = 1,
728
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
712
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
729
713
  ) -> np.ndarray:
730
714
  """Samples from the system at this point in the computation.
731
715
 
@@ -747,12 +731,12 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
747
731
 
748
732
  def sample_measurement_ops(
749
733
  self,
750
- measurement_ops: List['cirq.GateOperation'],
734
+ measurement_ops: list[cirq.GateOperation],
751
735
  repetitions: int = 1,
752
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
736
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
753
737
  *,
754
738
  _allow_repeated=False,
755
- ) -> Dict[str, np.ndarray]:
739
+ ) -> dict[str, np.ndarray]:
756
740
  """Samples from the system at this point in the computation.
757
741
 
758
742
  Note that this does not collapse the state vector.
@@ -798,7 +782,7 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
798
782
 
799
783
  # Find measured qubits, ensuring a consistent ordering.
800
784
  measured_qubits = []
801
- seen_qubits: Set[cirq.Qid] = set()
785
+ seen_qubits: set[cirq.Qid] = set()
802
786
  for op in measurement_ops:
803
787
  for q in op.qubits:
804
788
  if q not in seen_qubits:
@@ -809,7 +793,7 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
809
793
  indexed_sample = self.sample(measured_qubits, repetitions, seed=seed)
810
794
 
811
795
  # Extract results for each measurement.
812
- results: Dict[str, Any] = {}
796
+ results: dict[str, Any] = {}
813
797
  qubits_to_index = {q: i for i, q in enumerate(measured_qubits)}
814
798
  for op in measurement_ops:
815
799
  gate = cast(ops.MeasurementGate, op.gate)
@@ -837,9 +821,9 @@ class StepResult(Generic[TSimulatorState], metaclass=abc.ABCMeta):
837
821
  def _confuse_results(
838
822
  self,
839
823
  bits: np.ndarray,
840
- qubits: Sequence['cirq.Qid'],
841
- confusion_map: Dict[Tuple[int, ...], np.ndarray],
842
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
824
+ qubits: Sequence[cirq.Qid],
825
+ confusion_map: dict[tuple[int, ...], np.ndarray],
826
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
843
827
  ) -> None:
844
828
  """Mutates `bits` using the confusion_map.
845
829
 
@@ -876,7 +860,7 @@ class SimulationTrialResult(Generic[TSimulatorState]):
876
860
 
877
861
  def __init__(
878
862
  self,
879
- params: 'cirq.ParamResolver',
863
+ params: cirq.ParamResolver,
880
864
  measurements: Mapping[str, np.ndarray],
881
865
  final_simulator_state: TSimulatorState,
882
866
  ) -> None:
@@ -895,7 +879,7 @@ class SimulationTrialResult(Generic[TSimulatorState]):
895
879
  self._final_simulator_state = final_simulator_state
896
880
 
897
881
  @property
898
- def params(self) -> 'cirq.ParamResolver':
882
+ def params(self) -> cirq.ParamResolver:
899
883
  return self._params
900
884
 
901
885
  @property
@@ -932,18 +916,18 @@ class SimulationTrialResult(Generic[TSimulatorState]):
932
916
  return self.params, measurements, self._final_simulator_state
933
917
 
934
918
  @property
935
- def qubit_map(self) -> Mapping['cirq.Qid', int]:
919
+ def qubit_map(self) -> Mapping[cirq.Qid, int]:
936
920
  """A map from Qid to index used to define the ordering of the basis in
937
921
  the result.
938
922
  """
939
923
  return self._final_simulator_state.qubit_map
940
924
 
941
- def _qid_shape_(self) -> Tuple[int, ...]:
925
+ def _qid_shape_(self) -> tuple[int, ...]:
942
926
  return _qubit_map_to_shape(self.qubit_map)
943
927
 
944
928
 
945
- def _qubit_map_to_shape(qubit_map: Mapping['cirq.Qid', int]) -> Tuple[int, ...]:
946
- qid_shape: List[int] = [-1] * len(qubit_map)
929
+ def _qubit_map_to_shape(qubit_map: Mapping[cirq.Qid, int]) -> tuple[int, ...]:
930
+ qid_shape: list[int] = [-1] * len(qubit_map)
947
931
  try:
948
932
  for q, i in qubit_map.items():
949
933
  qid_shape[i] = q.dimension
@@ -965,8 +949,8 @@ def check_all_resolved(circuit):
965
949
 
966
950
 
967
951
  def split_into_matching_protocol_then_general(
968
- circuit: 'cirq.AbstractCircuit', predicate: Callable[['cirq.Operation'], bool]
969
- ) -> Tuple['cirq.AbstractCircuit', 'cirq.AbstractCircuit']:
952
+ circuit: cirq.AbstractCircuit, predicate: Callable[[cirq.Operation], bool]
953
+ ) -> tuple[cirq.AbstractCircuit, cirq.AbstractCircuit]:
970
954
  """Splits the circuit into a matching prefix and non-matching suffix.
971
955
 
972
956
  The splitting happens in a per-qubit fashion. A non-matching operation on
@@ -975,8 +959,8 @@ def split_into_matching_protocol_then_general(
975
959
  the matching part (as long as those qubits have had no non-matching operation
976
960
  up to that point). Measurement keys are handled equivalently.
977
961
  """
978
- blocked_qubits: Set[cirq.Qid] = set()
979
- blocked_keys: Set[cirq.MeasurementKey] = set()
962
+ blocked_qubits: set[cirq.Qid] = set()
963
+ blocked_keys: set[cirq.MeasurementKey] = set()
980
964
  matching_prefix = circuits.Circuit()
981
965
  general_suffix = circuits.Circuit()
982
966
  for moment in circuit: