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
cirq/ops/op_tree.py CHANGED
@@ -14,7 +14,9 @@
14
14
 
15
15
  """A recursive type describing trees of operations, and utility methods for it."""
16
16
 
17
- from typing import Callable, Iterable, Iterator, NoReturn, TYPE_CHECKING, Union
17
+ from __future__ import annotations
18
+
19
+ from typing import Callable, Iterable, Iterator, NoReturn, TYPE_CHECKING
18
20
 
19
21
  from cirq._doc import document
20
22
  from cirq._import import LazyLoader
@@ -26,7 +28,7 @@ if TYPE_CHECKING:
26
28
  moment = LazyLoader("moment", globals(), "cirq.circuits.moment")
27
29
 
28
30
 
29
- OP_TREE = Union[Operation, Iterable['OP_TREE']]
31
+ OP_TREE = Operation | Iterable['OP_TREE']
30
32
  document(
31
33
  OP_TREE,
32
34
  """An operation or nested collections of operations.
@@ -35,10 +37,10 @@ document(
35
37
  `cirq.OP_TREE` argument:
36
38
 
37
39
  - A single operation (a `cirq.Operation`).
38
- - A list of operations (a `List[cirq.Operation]`).
39
- - A list of lists of operations (a `List[List[cirq.Operation]]`).
40
+ - A list of operations (a `list[cirq.Operation]`).
41
+ - A list of lists of operations (a `list[list[cirq.Operation]]`).
40
42
  - A list mixing operations and generators of operations
41
- (a `List[Union[cirq.Operation, Iterator[cirq.Operation]]]`).
43
+ (a `list[cirq.Operation | Iterator[cirq.Operation]]`).
42
44
  - Generally anything that can be iterated, and its items iterated, and
43
45
  so forth recursively until a bottom layer of operations is found.
44
46
  """,
@@ -47,7 +49,7 @@ document(
47
49
 
48
50
  def flatten_op_tree(
49
51
  root: OP_TREE, preserve_moments: bool = False
50
- ) -> Iterator[Union[Operation, 'cirq.Moment']]:
52
+ ) -> Iterator[Operation | cirq.Moment]:
51
53
  """Performs an in-order iteration of the operations (leaves) in an OP_TREE.
52
54
 
53
55
  Args:
@@ -88,7 +90,7 @@ def flatten_to_ops(root: OP_TREE) -> Iterator[Operation]:
88
90
  _bad_op_tree(root)
89
91
 
90
92
 
91
- def flatten_to_ops_or_moments(root: OP_TREE) -> Iterator[Union[Operation, 'cirq.Moment']]:
93
+ def flatten_to_ops_or_moments(root: OP_TREE) -> Iterator[Operation | cirq.Moment]:
92
94
  """Performs an in-order iteration OP_TREE, yielding ops and moments.
93
95
 
94
96
  Args:
cirq/ops/op_tree_test.py CHANGED
@@ -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
  from typing import cast
15
18
 
16
19
  import pytest
@@ -18,7 +21,7 @@ import pytest
18
21
  import cirq
19
22
 
20
23
 
21
- def test_flatten_op_tree():
24
+ def test_flatten_op_tree() -> None:
22
25
  operations = [
23
26
  cirq.GateOperation(cirq.testing.SingleQubitGate(), [cirq.NamedQubit(str(i))])
24
27
  for i in range(10)
@@ -46,33 +49,33 @@ def test_flatten_op_tree():
46
49
 
47
50
  # Bad trees.
48
51
  with pytest.raises(TypeError):
49
- _ = list(cirq.flatten_op_tree(None))
52
+ _ = list(cirq.flatten_op_tree(None)) # type: ignore[arg-type]
50
53
  with pytest.raises(TypeError):
51
- _ = list(cirq.flatten_op_tree(5))
54
+ _ = list(cirq.flatten_op_tree(5)) # type: ignore[arg-type]
52
55
  with pytest.raises(TypeError):
53
- _ = list(cirq.flatten_op_tree([operations[0], (4,)]))
56
+ _ = list(cirq.flatten_op_tree([operations[0], (4,)])) # type: ignore[list-item]
54
57
 
55
58
 
56
- def test_flatten_to_ops_or_moments():
59
+ def test_flatten_to_ops_or_moments() -> None:
57
60
  operations = [
58
61
  cirq.GateOperation(cirq.testing.SingleQubitGate(), [cirq.NamedQubit(str(i))])
59
62
  for i in range(10)
60
63
  ]
61
- op_tree = [operations[0], cirq.Moment(operations[1:5]), operations[5:]]
64
+ op_tree: cirq.OP_TREE = [operations[0], cirq.Moment(operations[1:5]), operations[5:]]
62
65
  output = [operations[0], cirq.Moment(operations[1:5])] + operations[5:]
63
66
  assert list(cirq.flatten_to_ops_or_moments(op_tree)) == output
64
67
  assert list(cirq.flatten_op_tree(op_tree, preserve_moments=True)) == output
65
68
 
66
69
  # Bad trees.
67
70
  with pytest.raises(TypeError):
68
- _ = list(cirq.flatten_to_ops_or_moments(None))
71
+ _ = list(cirq.flatten_to_ops_or_moments(None)) # type: ignore[arg-type]
69
72
  with pytest.raises(TypeError):
70
- _ = list(cirq.flatten_to_ops_or_moments(5))
73
+ _ = list(cirq.flatten_to_ops_or_moments(5)) # type: ignore[arg-type]
71
74
  with pytest.raises(TypeError):
72
- _ = list(cirq.flatten_to_ops_or_moments([operations[0], (4,)]))
75
+ _ = list(cirq.flatten_to_ops_or_moments([operations[0], (4,)])) # type: ignore[list-item]
73
76
 
74
77
 
75
- def test_freeze_op_tree():
78
+ def test_freeze_op_tree() -> None:
76
79
  operations = [
77
80
  cirq.GateOperation(cirq.testing.SingleQubitGate(), [cirq.NamedQubit(str(i))])
78
81
  for i in range(10)
@@ -94,29 +97,29 @@ def test_freeze_op_tree():
94
97
 
95
98
  # Bad trees.
96
99
  with pytest.raises(TypeError):
97
- cirq.freeze_op_tree(None)
100
+ cirq.freeze_op_tree(None) # type: ignore[arg-type]
98
101
  with pytest.raises(TypeError):
99
- cirq.freeze_op_tree(5)
102
+ cirq.freeze_op_tree(5) # type: ignore[arg-type]
100
103
  with pytest.raises(TypeError):
101
- _ = cirq.freeze_op_tree([operations[0], (4,)])
104
+ _ = cirq.freeze_op_tree([operations[0], (4,)]) # type: ignore[list-item]
102
105
 
103
106
 
104
- def test_transform_bad_tree():
107
+ def test_transform_bad_tree() -> None:
105
108
  with pytest.raises(TypeError):
106
- _ = list(cirq.transform_op_tree(None))
109
+ _ = list(cirq.transform_op_tree(None)) # type: ignore[arg-type]
107
110
  with pytest.raises(TypeError):
108
- _ = list(cirq.transform_op_tree(5))
111
+ _ = list(cirq.transform_op_tree(5)) # type: ignore[arg-type]
109
112
  with pytest.raises(TypeError):
110
113
  _ = list(
111
114
  cirq.flatten_op_tree(
112
115
  cirq.transform_op_tree(
113
- [cirq.GateOperation(cirq.Gate(), [cirq.NamedQubit('q')]), (4,)]
116
+ [cirq.GateOperation(cirq.Gate(), [cirq.NamedQubit('q')]), (4,)] # type: ignore
114
117
  )
115
118
  )
116
119
  )
117
120
 
118
121
 
119
- def test_transform_leaves():
122
+ def test_transform_leaves() -> None:
120
123
  gs = [cirq.testing.SingleQubitGate() for _ in range(10)]
121
124
  operations = [cirq.GateOperation(gs[i], [cirq.NamedQubit(str(i))]) for i in range(10)]
122
125
  expected = [cirq.GateOperation(gs[i], [cirq.NamedQubit(str(i) + 'a')]) for i in range(10)]
@@ -150,7 +153,7 @@ def test_transform_leaves():
150
153
  )
151
154
 
152
155
 
153
- def test_transform_internal_nodes():
156
+ def test_transform_internal_nodes() -> None:
154
157
  operations = [
155
158
  cirq.GateOperation(cirq.testing.SingleQubitGate(), [cirq.LineQubit(2 * i)])
156
159
  for i in range(10)
cirq/ops/parallel_gate.py CHANGED
@@ -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
  from types import NotImplementedType
16
- from typing import AbstractSet, Any, Dict, Optional, Tuple, TYPE_CHECKING, Union
18
+ from typing import AbstractSet, Any, TYPE_CHECKING
17
19
 
18
20
  import numpy as np
19
21
 
@@ -29,7 +31,7 @@ if TYPE_CHECKING:
29
31
  class ParallelGate(raw_types.Gate):
30
32
  """Augments existing gates to be applied on one or more groups of qubits."""
31
33
 
32
- def __init__(self, sub_gate: 'cirq.Gate', num_copies: int) -> None:
34
+ def __init__(self, sub_gate: cirq.Gate, num_copies: int) -> None:
33
35
  """Inits ParallelGate.
34
36
 
35
37
  Args:
@@ -52,24 +54,24 @@ class ParallelGate(raw_types.Gate):
52
54
  return self.sub_gate.num_qubits() * self._num_copies
53
55
 
54
56
  @property
55
- def sub_gate(self) -> 'cirq.Gate':
57
+ def sub_gate(self) -> cirq.Gate:
56
58
  return self._sub_gate
57
59
 
58
60
  @property
59
61
  def num_copies(self) -> int:
60
62
  return self._num_copies
61
63
 
62
- def _decompose_(self, qubits: Tuple['cirq.Qid', ...]) -> 'DecomposeResult':
64
+ def _decompose_(self, qubits: tuple[cirq.Qid, ...]) -> DecomposeResult:
63
65
  if len(qubits) != self.num_qubits():
64
66
  raise ValueError(f"len(qubits)={len(qubits)} should be {self.num_qubits()}")
65
67
  step = self.sub_gate.num_qubits()
66
68
  return [self.sub_gate(*qubits[i : i + step]) for i in range(0, len(qubits), step)]
67
69
 
68
- def with_gate(self, sub_gate: 'cirq.Gate') -> 'ParallelGate':
70
+ def with_gate(self, sub_gate: cirq.Gate) -> ParallelGate:
69
71
  """ParallelGate with same number of copies but a new gate"""
70
72
  return ParallelGate(sub_gate, self._num_copies)
71
73
 
72
- def with_num_copies(self, num_copies: int) -> 'ParallelGate':
74
+ def with_num_copies(self, num_copies: int) -> ParallelGate:
73
75
  """ParallelGate with same sub_gate but different num_copies"""
74
76
  return ParallelGate(self.sub_gate, num_copies)
75
77
 
@@ -91,14 +93,12 @@ class ParallelGate(raw_types.Gate):
91
93
  def _parameter_names_(self) -> AbstractSet[str]:
92
94
  return protocols.parameter_names(self.sub_gate)
93
95
 
94
- def _resolve_parameters_(
95
- self, resolver: 'cirq.ParamResolver', recursive: bool
96
- ) -> 'ParallelGate':
96
+ def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> ParallelGate:
97
97
  return self.with_gate(
98
98
  sub_gate=protocols.resolve_parameters(self.sub_gate, resolver, recursive)
99
99
  )
100
100
 
101
- def _unitary_(self) -> Union[np.ndarray, NotImplementedType]:
101
+ def _unitary_(self) -> np.ndarray | NotImplementedType:
102
102
  # Obtain the unitary for the single qubit gate
103
103
  single_unitary = protocols.unitary(self.sub_gate, NotImplemented)
104
104
 
@@ -114,7 +114,7 @@ class ParallelGate(raw_types.Gate):
114
114
 
115
115
  return unitary
116
116
 
117
- def _trace_distance_bound_(self) -> Optional[float]:
117
+ def _trace_distance_bound_(self) -> float | None:
118
118
  if protocols.is_parameterized(self.sub_gate):
119
119
  return None
120
120
  angle = self._num_copies * np.arcsin(protocols.trace_distance_bound(self.sub_gate))
@@ -122,9 +122,7 @@ class ParallelGate(raw_types.Gate):
122
122
  return 1.0
123
123
  return np.sin(angle)
124
124
 
125
- def _circuit_diagram_info_(
126
- self, args: 'cirq.CircuitDiagramInfoArgs'
127
- ) -> 'cirq.CircuitDiagramInfo':
125
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
128
126
  diagram_info = protocols.circuit_diagram_info(self.sub_gate, args, NotImplemented)
129
127
  if diagram_info == NotImplemented:
130
128
  return diagram_info
@@ -136,7 +134,7 @@ class ParallelGate(raw_types.Gate):
136
134
  wire_symbols=wire_symbols, exponent=diagram_info.exponent, connected=False
137
135
  )
138
136
 
139
- def __pow__(self, exponent: Any) -> 'ParallelGate':
137
+ def __pow__(self, exponent: Any) -> ParallelGate:
140
138
  """Raises underlying gate to a power, applying same number of copies.
141
139
 
142
140
  For extrapolatable gate G this means the following two are equivalent:
@@ -154,11 +152,11 @@ class ParallelGate(raw_types.Gate):
154
152
  return NotImplemented
155
153
  return self.with_gate(new_gate)
156
154
 
157
- def _json_dict_(self) -> Dict[str, Any]:
155
+ def _json_dict_(self) -> dict[str, Any]:
158
156
  return protocols.obj_to_dict_helper(self, attribute_names=["sub_gate", "num_copies"])
159
157
 
160
158
 
161
- def parallel_gate_op(gate: 'cirq.Gate', *targets: 'cirq.Qid') -> 'cirq.Operation':
159
+ def parallel_gate_op(gate: cirq.Gate, *targets: cirq.Qid) -> cirq.Operation:
162
160
  """Constructs a ParallelGate using gate and applies to all given qubits
163
161
 
164
162
  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 numpy as np
16
18
  import pytest
17
19
  import sympy
@@ -26,7 +28,7 @@ import cirq
26
28
  (cirq.X**0.5, 4, cirq.LineQubit.range(4)),
27
29
  ],
28
30
  )
29
- def test_parallel_gate_operation_init(gate, num_copies, qubits):
31
+ def test_parallel_gate_operation_init(gate, num_copies, qubits) -> None:
30
32
  v = cirq.ParallelGate(gate, num_copies)
31
33
  assert v.sub_gate == gate
32
34
  assert v.num_copies == num_copies
@@ -52,7 +54,7 @@ def test_parallel_gate_operation_init(gate, num_copies, qubits):
52
54
  (cirq.testing.TwoQubitGate(), 2, cirq.LineQubit.range(4), "must be a single qubit gate"),
53
55
  ],
54
56
  )
55
- def test_invalid_parallel_gate_operation(gate, num_copies, qubits, error_msg):
57
+ def test_invalid_parallel_gate_operation(gate, num_copies, qubits, error_msg) -> None:
56
58
  with pytest.raises(ValueError, match=error_msg):
57
59
  cirq.ParallelGate(gate, num_copies)(*qubits)
58
60
 
@@ -61,27 +63,27 @@ def test_invalid_parallel_gate_operation(gate, num_copies, qubits, error_msg):
61
63
  'gate, num_copies, qubits',
62
64
  [(cirq.X, 2, cirq.LineQubit.range(2)), (cirq.H**0.5, 4, cirq.LineQubit.range(4))],
63
65
  )
64
- def test_decompose(gate, num_copies, qubits):
66
+ def test_decompose(gate, num_copies, qubits) -> None:
65
67
  g = cirq.ParallelGate(gate, num_copies)
66
68
  step = gate.num_qubits()
67
69
  qubit_lists = [qubits[i * step : (i + 1) * step] for i in range(num_copies)]
68
70
  assert set(cirq.decompose_once(g(*qubits))) == set(gate.on_each(qubit_lists))
69
71
 
70
72
 
71
- def test_decompose_raises():
73
+ def test_decompose_raises() -> None:
72
74
  g = cirq.ParallelGate(cirq.X, 2)
73
75
  qubits = cirq.LineQubit.range(4)
74
76
  with pytest.raises(ValueError, match=r'len\(qubits\)=4 should be 2'):
75
77
  cirq.decompose_once_with_qubits(g, qubits)
76
78
 
77
79
 
78
- def test_with_num_copies():
80
+ def test_with_num_copies() -> None:
79
81
  g = cirq.testing.SingleQubitGate()
80
82
  pg = cirq.ParallelGate(g, 3)
81
83
  assert pg.with_num_copies(5) == cirq.ParallelGate(g, 5)
82
84
 
83
85
 
84
- def test_extrapolate():
86
+ def test_extrapolate() -> None:
85
87
  # If the gate isn't extrapolatable, you get a type error.
86
88
  g = cirq.ParallelGate(cirq.testing.SingleQubitGate(), 2)
87
89
  with pytest.raises(TypeError):
@@ -93,7 +95,7 @@ def test_extrapolate():
93
95
 
94
96
 
95
97
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
96
- def test_parameterizable_gates(resolve_fn):
98
+ def test_parameterizable_gates(resolve_fn) -> None:
97
99
  r = cirq.ParamResolver({'a': 0.5})
98
100
  g1 = cirq.ParallelGate(cirq.Z ** sympy.Symbol('a'), 2)
99
101
  assert cirq.is_parameterized(g1)
@@ -102,7 +104,7 @@ def test_parameterizable_gates(resolve_fn):
102
104
 
103
105
 
104
106
  @pytest.mark.parametrize('gate', [cirq.X ** sympy.Symbol("a"), cirq.testing.SingleQubitGate()])
105
- def test_no_unitary(gate):
107
+ def test_no_unitary(gate) -> None:
106
108
  g = cirq.ParallelGate(gate, 2)
107
109
  assert not cirq.has_unitary(g)
108
110
  assert cirq.unitary(g, None) is None
@@ -115,7 +117,7 @@ def test_no_unitary(gate):
115
117
  (cirq.MatrixGate(cirq.unitary(cirq.H**0.25)), 6, cirq.LineQubit.range(6)),
116
118
  ],
117
119
  )
118
- def test_unitary(gate, num_copies, qubits):
120
+ def test_unitary(gate, num_copies, qubits) -> None:
119
121
  g = cirq.ParallelGate(gate, num_copies)
120
122
  step = gate.num_qubits()
121
123
  qubit_lists = [qubits[i * step : (i + 1) * step] for i in range(num_copies)]
@@ -124,7 +126,7 @@ def test_unitary(gate, num_copies, qubits):
124
126
  )
125
127
 
126
128
 
127
- def test_not_implemented_diagram():
129
+ def test_not_implemented_diagram() -> None:
128
130
  q = cirq.LineQubit.range(2)
129
131
  g = cirq.testing.SingleQubitGate()
130
132
  c = cirq.Circuit()
@@ -132,15 +134,15 @@ def test_not_implemented_diagram():
132
134
  assert 'cirq.testing.gate_features.SingleQubitGate ' in str(c)
133
135
 
134
136
 
135
- def test_repr():
137
+ def test_repr() -> None:
136
138
  assert repr(cirq.ParallelGate(cirq.X, 2)) == 'cirq.ParallelGate(sub_gate=cirq.X, num_copies=2)'
137
139
 
138
140
 
139
- def test_str():
141
+ def test_str() -> None:
140
142
  assert str(cirq.ParallelGate(cirq.X**0.5, 10)) == 'X**0.5 x 10'
141
143
 
142
144
 
143
- def test_equivalent_circuit():
145
+ def test_equivalent_circuit() -> None:
144
146
  qreg = cirq.LineQubit.range(4)
145
147
  oldc = cirq.Circuit()
146
148
  newc = cirq.Circuit()
@@ -154,11 +156,11 @@ def test_equivalent_circuit():
154
156
 
155
157
 
156
158
  @pytest.mark.parametrize('gate, num_copies', [(cirq.X, 1), (cirq.Y, 2), (cirq.Z, 3), (cirq.H, 4)])
157
- def test_parallel_gate_operation_is_consistent(gate, num_copies):
159
+ def test_parallel_gate_operation_is_consistent(gate, num_copies) -> None:
158
160
  cirq.testing.assert_implements_consistent_protocols(cirq.ParallelGate(gate, num_copies))
159
161
 
160
162
 
161
- def test_trace_distance():
163
+ def test_trace_distance() -> None:
162
164
  s = cirq.X**0.25
163
165
  two_g = cirq.ParallelGate(s, 2)
164
166
  three_g = cirq.ParallelGate(s, 3)
@@ -171,6 +173,6 @@ def test_trace_distance():
171
173
 
172
174
 
173
175
  @pytest.mark.parametrize('gate, num_copies', [(cirq.X, 1), (cirq.Y, 2), (cirq.Z, 3), (cirq.H, 4)])
174
- def test_parallel_gate_op(gate, num_copies):
176
+ def test_parallel_gate_op(gate, num_copies) -> None:
175
177
  qubits = cirq.LineQubit.range(num_copies * gate.num_qubits())
176
178
  assert cirq.parallel_gate_op(gate, *qubits) == cirq.ParallelGate(gate, num_copies).on(*qubits)
cirq/ops/parity_gates.py CHANGED
@@ -14,7 +14,9 @@
14
14
 
15
15
  """Quantum gates that phase with respect to product-of-pauli observables."""
16
16
 
17
- from typing import Any, Dict, Iterator, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Iterator, Sequence, TYPE_CHECKING
18
20
 
19
21
  import numpy as np
20
22
  from typing_extensions import Self
@@ -71,7 +73,7 @@ class XXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
71
73
  def _num_qubits_(self) -> int:
72
74
  return 2
73
75
 
74
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
76
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
75
77
  return [
76
78
  (
77
79
  0.0,
@@ -88,7 +90,7 @@ class XXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
88
90
  def _eigen_shifts(self):
89
91
  return [0, 1]
90
92
 
91
- def _trace_distance_bound_(self) -> Optional[float]:
93
+ def _trace_distance_bound_(self) -> float | None:
92
94
  if self._is_parameterized_():
93
95
  return None
94
96
  return abs(np.sin(self._exponent * 0.5 * np.pi))
@@ -117,14 +119,14 @@ class XXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
117
119
  def _has_stabilizer_effect_(self) -> bool:
118
120
  return self.exponent % 2 in (0, 0.5, 1, 1.5)
119
121
 
120
- def _decompose_(self, qubits: Tuple['cirq.Qid', ...]) -> Iterator['cirq.OP_TREE']:
122
+ def _decompose_(self, qubits: tuple[cirq.Qid, ...]) -> Iterator[cirq.OP_TREE]:
121
123
  yield common_gates.YPowGate(exponent=-0.5).on_each(*qubits)
122
124
  yield ZZPowGate(exponent=self.exponent, global_shift=self.global_shift)(*qubits)
123
125
  yield common_gates.YPowGate(exponent=0.5).on_each(*qubits)
124
126
 
125
127
  def _circuit_diagram_info_(
126
- self, args: 'cirq.CircuitDiagramInfoArgs'
127
- ) -> Union[str, 'protocols.CircuitDiagramInfo']:
128
+ self, args: cirq.CircuitDiagramInfoArgs
129
+ ) -> str | protocols.CircuitDiagramInfo:
128
130
  return protocols.CircuitDiagramInfo(
129
131
  wire_symbols=('XX', 'XX'), exponent=self._diagram_exponent(args)
130
132
  )
@@ -178,7 +180,7 @@ class YYPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
178
180
  def _num_qubits_(self) -> int:
179
181
  return 2
180
182
 
181
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
183
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
182
184
  return [
183
185
  (
184
186
  0.0,
@@ -197,7 +199,7 @@ class YYPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
197
199
  def _eigen_shifts(self):
198
200
  return [0, 1]
199
201
 
200
- def _trace_distance_bound_(self) -> Optional[float]:
202
+ def _trace_distance_bound_(self) -> float | None:
201
203
  if self._is_parameterized_():
202
204
  return None
203
205
  return abs(np.sin(self._exponent * 0.5 * np.pi))
@@ -226,14 +228,12 @@ class YYPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
226
228
  def _has_stabilizer_effect_(self) -> bool:
227
229
  return self.exponent % 2 in (0, 0.5, 1, 1.5)
228
230
 
229
- def _decompose_(self, qubits: Tuple['cirq.Qid', ...]) -> Iterator['cirq.OP_TREE']:
231
+ def _decompose_(self, qubits: tuple[cirq.Qid, ...]) -> Iterator[cirq.OP_TREE]:
230
232
  yield common_gates.XPowGate(exponent=0.5).on_each(*qubits)
231
233
  yield ZZPowGate(exponent=self.exponent, global_shift=self.global_shift)(*qubits)
232
234
  yield common_gates.XPowGate(exponent=-0.5).on_each(*qubits)
233
235
 
234
- def _circuit_diagram_info_(
235
- self, args: 'cirq.CircuitDiagramInfoArgs'
236
- ) -> 'cirq.CircuitDiagramInfo':
236
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
237
237
  return protocols.CircuitDiagramInfo(
238
238
  wire_symbols=('YY', 'YY'), exponent=self._diagram_exponent(args)
239
239
  )
@@ -281,8 +281,8 @@ class ZZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
281
281
  )(qubits[0], qubits[1])
282
282
 
283
283
  def _decompose_into_clifford_with_qubits_(
284
- self, qubits: Sequence['cirq.Qid']
285
- ) -> Sequence[Union['cirq.Operation', Sequence['cirq.Operation']]]:
284
+ self, qubits: Sequence[cirq.Qid]
285
+ ) -> Sequence[cirq.Operation | Sequence[cirq.Operation]]:
286
286
  if not self._has_stabilizer_effect_():
287
287
  return NotImplemented
288
288
  if self.exponent % 2 == 0:
@@ -308,25 +308,23 @@ class ZZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
308
308
  def _has_stabilizer_effect_(self) -> bool:
309
309
  return self.exponent % 2 in (0, 0.5, 1, 1.5)
310
310
 
311
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
311
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
312
312
  return [(0, np.diag([1, 0, 0, 1])), (1, np.diag([0, 1, 1, 0]))]
313
313
 
314
314
  def _eigen_shifts(self):
315
315
  return [0, 1]
316
316
 
317
- def _trace_distance_bound_(self) -> Optional[float]:
317
+ def _trace_distance_bound_(self) -> float | None:
318
318
  if self._is_parameterized_():
319
319
  return None
320
320
  return abs(np.sin(self._exponent * 0.5 * np.pi))
321
321
 
322
- def _circuit_diagram_info_(
323
- self, args: 'cirq.CircuitDiagramInfoArgs'
324
- ) -> 'cirq.CircuitDiagramInfo':
322
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
325
323
  return protocols.CircuitDiagramInfo(
326
324
  wire_symbols=('ZZ', 'ZZ'), exponent=self._diagram_exponent(args)
327
325
  )
328
326
 
329
- def _apply_unitary_(self, args: 'protocols.ApplyUnitaryArgs') -> Optional[np.ndarray]:
327
+ def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray | None:
330
328
  if protocols.is_parameterized(self):
331
329
  return None
332
330
 
@@ -342,7 +340,7 @@ class ZZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
342
340
 
343
341
  return args.target_tensor
344
342
 
345
- def _phase_by_(self, phase_turns: float, qubit_index: int) -> "ZZPowGate":
343
+ def _phase_by_(self, phase_turns: float, qubit_index: int) -> ZZPowGate:
346
344
  return self
347
345
 
348
346
  def __str__(self) -> str:
@@ -382,8 +380,8 @@ class MSGate(XXPowGate):
382
380
  return type(self)(rads=exponent * np.pi / 2)
383
381
 
384
382
  def _circuit_diagram_info_(
385
- self, args: 'cirq.CircuitDiagramInfoArgs'
386
- ) -> Union[str, 'protocols.CircuitDiagramInfo']:
383
+ self, args: cirq.CircuitDiagramInfoArgs
384
+ ) -> str | protocols.CircuitDiagramInfo:
387
385
  angle_str = self._format_exponent_as_angle(args, order=4)
388
386
  symbol = f'MS({angle_str})'
389
387
  return protocols.CircuitDiagramInfo(wire_symbols=(symbol, symbol))
@@ -403,11 +401,11 @@ class MSGate(XXPowGate):
403
401
  def _json_namespace_(cls) -> str:
404
402
  return 'cirq'
405
403
 
406
- def _json_dict_(self) -> Dict[str, Any]:
404
+ def _json_dict_(self) -> dict[str, Any]:
407
405
  return protocols.obj_to_dict_helper(self, ["rads"])
408
406
 
409
407
  @classmethod
410
- def _from_json_dict_(cls, rads: float, **kwargs: Any) -> 'MSGate':
408
+ def _from_json_dict_(cls, rads: float, **kwargs: Any) -> MSGate:
411
409
  return cls(rads=rads)
412
410
 
413
411