cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cirq-core might be problematic. Click here for more details.

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import cast, Type
15
+ from __future__ import annotations
16
+
17
+ from typing import cast
16
18
  from unittest import mock
17
19
 
18
20
  import numpy as np
@@ -21,7 +23,7 @@ import pytest
21
23
  import cirq
22
24
 
23
25
 
24
- def test_default_parameter():
26
+ def test_default_parameter() -> None:
25
27
  dtype = np.complex64
26
28
  tensor = cirq.one_hot(shape=(2, 2, 2), dtype=np.complex64)
27
29
  qubits = cirq.LineQubit.range(3)
@@ -33,7 +35,7 @@ def test_default_parameter():
33
35
  assert args.available_buffer.dtype == tensor.dtype
34
36
 
35
37
 
36
- def test_infer_target_tensor():
38
+ def test_infer_target_tensor() -> None:
37
39
  dtype = np.complex64
38
40
  args = cirq.StateVectorSimulationState(
39
41
  qubits=cirq.LineQubit.range(2),
@@ -54,13 +56,13 @@ def test_infer_target_tensor():
54
56
  )
55
57
 
56
58
 
57
- def test_shallow_copy_buffers():
59
+ def test_shallow_copy_buffers() -> None:
58
60
  args = cirq.StateVectorSimulationState(qubits=cirq.LineQubit.range(1), initial_state=0)
59
61
  copy = args.copy(deep_copy_buffers=False)
60
62
  assert copy.available_buffer is args.available_buffer
61
63
 
62
64
 
63
- def test_decomposed_fallback():
65
+ def test_decomposed_fallback() -> None:
64
66
  class Composite(cirq.Gate):
65
67
  def num_qubits(self) -> int:
66
68
  return 1 # pragma: no cover
@@ -82,7 +84,7 @@ def test_decomposed_fallback():
82
84
  )
83
85
 
84
86
 
85
- def test_cannot_act():
87
+ def test_cannot_act() -> None:
86
88
  class NoDetails:
87
89
  pass
88
90
 
@@ -98,7 +100,7 @@ def test_cannot_act():
98
100
  cirq.act_on(NoDetails(), args, qubits=())
99
101
 
100
102
 
101
- def test_act_using_probabilistic_single_qubit_channel():
103
+ def test_act_using_probabilistic_single_qubit_channel() -> None:
102
104
  class ProbabilisticSorX(cirq.Gate):
103
105
  def num_qubits(self) -> int:
104
106
  return 1
@@ -148,7 +150,7 @@ def test_act_using_probabilistic_single_qubit_channel():
148
150
  )
149
151
 
150
152
 
151
- def test_act_using_adaptive_two_qubit_channel():
153
+ def test_act_using_adaptive_two_qubit_channel() -> None:
152
154
  class Decay11(cirq.Gate):
153
155
  def num_qubits(self) -> int:
154
156
  return 2
@@ -171,7 +173,7 @@ def test_act_using_adaptive_two_qubit_channel():
171
173
  qubits=cirq.LineQubit.range(4),
172
174
  prng=mock_prng,
173
175
  initial_state=np.copy(state),
174
- dtype=cast(Type[np.complexfloating], state.dtype),
176
+ dtype=cast(type[np.complexfloating], state.dtype),
175
177
  )
176
178
  cirq.act_on(Decay11(), args, [cirq.LineQubit(1), cirq.LineQubit(3)])
177
179
  return args.target_tensor
@@ -210,7 +212,7 @@ def test_act_using_adaptive_two_qubit_channel():
210
212
  assert_not_affected(projected_state, sample=3 / 4 + 1e-8)
211
213
 
212
214
 
213
- def test_probability_comes_up_short_results_in_fallback():
215
+ def test_probability_comes_up_short_results_in_fallback() -> None:
214
216
  class Short(cirq.Gate):
215
217
  def num_qubits(self) -> int:
216
218
  return 1
@@ -234,7 +236,7 @@ def test_probability_comes_up_short_results_in_fallback():
234
236
  np.testing.assert_allclose(args.target_tensor, np.array([0, 1]))
235
237
 
236
238
 
237
- def test_random_channel_has_random_behavior():
239
+ def test_random_channel_has_random_behavior() -> None:
238
240
  q = cirq.LineQubit(0)
239
241
  s = cirq.Simulator().sample(
240
242
  cirq.Circuit(cirq.X(q), cirq.amplitude_damp(0.4).on(q), cirq.measure(q, key='out')),
@@ -245,7 +247,7 @@ def test_random_channel_has_random_behavior():
245
247
  assert v[1] > 1
246
248
 
247
249
 
248
- def test_measured_channel():
250
+ def test_measured_channel() -> None:
249
251
  # This behaves like an X-basis measurement.
250
252
  kc = cirq.KrausChannel(
251
253
  kraus_ops=(np.array([[1, 1], [1, 1]]) * 0.5, np.array([[1, -1], [-1, 1]]) * 0.5), key='m'
@@ -257,7 +259,7 @@ def test_measured_channel():
257
259
  assert results.histogram(key='m') == {0: 100}
258
260
 
259
261
 
260
- def test_measured_mixture():
262
+ def test_measured_mixture() -> None:
261
263
  # This behaves like an X-basis measurement.
262
264
  mm = cirq.MixedUnitaryChannel(
263
265
  mixture=((0.5, np.array([[1, 0], [0, 1]])), (0.5, np.array([[0, 1], [1, 0]]))), key='flip'
@@ -269,6 +271,6 @@ def test_measured_mixture():
269
271
  assert results.histogram(key='flip') == results.histogram(key='m')
270
272
 
271
273
 
272
- def test_qid_shape_error():
274
+ def test_qid_shape_error() -> None:
273
275
  with pytest.raises(ValueError, match="qid_shape must be provided"):
274
276
  cirq.sim.state_vector_simulation_state._BufferedStateVector.create(initial_state=0)
@@ -11,12 +11,15 @@
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
+
14
15
  """Abstract classes for simulations which keep track of state vector."""
15
16
 
17
+ from __future__ import annotations
18
+
16
19
  import abc
17
20
  import warnings
18
21
  from functools import cached_property
19
- from typing import Any, Dict, Generic, Iterator, Sequence, Type, TYPE_CHECKING, TypeVar
22
+ from typing import Any, Generic, Iterator, Sequence, TYPE_CHECKING, TypeVar
20
23
 
21
24
  import numpy as np
22
25
 
@@ -47,9 +50,9 @@ class SimulatesIntermediateStateVector(
47
50
  def __init__(
48
51
  self,
49
52
  *,
50
- dtype: Type[np.complexfloating] = np.complex64,
51
- noise: 'cirq.NOISE_MODEL_LIKE' = None,
52
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
53
+ dtype: type[np.complexfloating] = np.complex64,
54
+ noise: cirq.NOISE_MODEL_LIKE = None,
55
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
53
56
  split_untangled_states: bool = False,
54
57
  ):
55
58
  super().__init__(
@@ -58,20 +61,20 @@ class SimulatesIntermediateStateVector(
58
61
 
59
62
  def _create_simulator_trial_result(
60
63
  self,
61
- params: 'cirq.ParamResolver',
62
- measurements: Dict[str, np.ndarray],
63
- final_simulator_state: 'cirq.SimulationStateBase[cirq.StateVectorSimulationState]',
64
- ) -> 'cirq.StateVectorTrialResult':
64
+ params: cirq.ParamResolver,
65
+ measurements: dict[str, np.ndarray],
66
+ final_simulator_state: cirq.SimulationStateBase[cirq.StateVectorSimulationState],
67
+ ) -> cirq.StateVectorTrialResult:
65
68
  return StateVectorTrialResult(
66
69
  params=params, measurements=measurements, final_simulator_state=final_simulator_state
67
70
  )
68
71
 
69
72
  def compute_amplitudes_sweep_iter(
70
73
  self,
71
- program: 'cirq.AbstractCircuit',
74
+ program: cirq.AbstractCircuit,
72
75
  bitstrings: Sequence[int],
73
- params: 'cirq.Sweepable',
74
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
76
+ params: cirq.Sweepable,
77
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
75
78
  ) -> Iterator[Sequence[complex]]:
76
79
  if isinstance(bitstrings, np.ndarray) and len(bitstrings.shape) > 1:
77
80
  raise ValueError(
@@ -112,9 +115,9 @@ class StateVectorTrialResult(
112
115
 
113
116
  def __init__(
114
117
  self,
115
- params: 'cirq.ParamResolver',
116
- measurements: Dict[str, np.ndarray],
117
- final_simulator_state: 'cirq.SimulationStateBase[cirq.StateVectorSimulationState]',
118
+ params: cirq.ParamResolver,
119
+ measurements: dict[str, np.ndarray],
120
+ final_simulator_state: cirq.SimulationStateBase[cirq.StateVectorSimulationState],
118
121
  ) -> None:
119
122
  super().__init__(
120
123
  params=params,
@@ -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
 
17
19
  import cirq
@@ -11,10 +11,13 @@
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
+
14
15
  """Tests for state_vector.py"""
15
16
 
17
+ from __future__ import annotations
18
+
16
19
  import itertools
17
- from typing import Iterator, Optional
20
+ from typing import Iterator
18
21
  from unittest import mock
19
22
 
20
23
  import numpy as np
@@ -34,7 +37,7 @@ def use_np_transpose(request) -> Iterator[bool]:
34
37
 
35
38
  def test_state_mixin():
36
39
  class TestClass(cirq.StateVectorMixin):
37
- def state_vector(self, copy: Optional[bool] = None) -> np.ndarray:
40
+ def state_vector(self, copy: bool | None = None) -> np.ndarray:
38
41
  return np.array([0, 0, 1, 0])
39
42
 
40
43
  qubits = cirq.LineQubit.range(2)
@@ -357,7 +360,7 @@ def test_measure_state_empty_state(use_np_transpose: bool):
357
360
 
358
361
 
359
362
  class BasicStateVector(cirq.StateVectorMixin):
360
- def state_vector(self, copy: Optional[bool] = None) -> np.ndarray:
363
+ def state_vector(self, copy: bool | None = None) -> np.ndarray:
361
364
  return np.array([0, 1, 0, 0])
362
365
 
363
366
 
@@ -11,10 +11,13 @@
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
+
14
15
  """Resolves symbolic expressions to unique symbols."""
15
16
 
17
+ from __future__ import annotations
18
+
16
19
  import numbers
17
- from typing import Any, Callable, List, Optional, Tuple, TYPE_CHECKING, Union
20
+ from typing import Any, Callable, TYPE_CHECKING
18
21
 
19
22
  import sympy
20
23
 
@@ -25,7 +28,7 @@ if TYPE_CHECKING:
25
28
  import cirq
26
29
 
27
30
 
28
- def flatten(val: Any) -> Tuple[Any, 'ExpressionMap']:
31
+ def flatten(val: Any) -> tuple[Any, ExpressionMap]:
29
32
  """Creates a copy of `val` with any symbols or expressions replaced with
30
33
  new symbols. `val` can be a `Circuit`, `Gate`, `Operation`, or other
31
34
  type.
@@ -111,8 +114,8 @@ def flatten(val: Any) -> Tuple[Any, 'ExpressionMap']:
111
114
 
112
115
 
113
116
  def flatten_with_sweep(
114
- val: Any, sweep: Union[sweeps.Sweep, List[resolver.ParamResolver]]
115
- ) -> Tuple[Any, sweeps.Sweep]:
117
+ val: Any, sweep: sweeps.Sweep | list[resolver.ParamResolver]
118
+ ) -> tuple[Any, sweeps.Sweep]:
116
119
  """Creates a copy of `val` with any symbols or expressions replaced with
117
120
  new symbols. `val` can be a `Circuit`, `Gate`, `Operation`, or other
118
121
  type. Also transforms a sweep over the symbols in `val` to a sweep over the
@@ -146,7 +149,7 @@ def flatten_with_sweep(
146
149
 
147
150
  def flatten_with_params(
148
151
  val: Any, params: resolver.ParamResolverOrSimilarType
149
- ) -> Tuple[Any, resolver.ParamDictType]:
152
+ ) -> tuple[Any, resolver.ParamDictType]:
150
153
  """Creates a copy of `val` with any symbols or expressions replaced with
151
154
  new symbols. `val` can be a `Circuit`, `Gate`, `Operation`, or other
152
155
  type. Also transforms a dictionary of symbol values for `val` to an
@@ -198,9 +201,9 @@ class _ParamFlattener(resolver.ParamResolver):
198
201
 
199
202
  def __init__(
200
203
  self,
201
- param_dict: Optional[resolver.ParamResolverOrSimilarType] = None,
204
+ param_dict: resolver.ParamResolverOrSimilarType | None = None,
202
205
  *, # Force keyword args
203
- get_param_name: Optional[Callable[[sympy.Expr], str]] = None,
206
+ get_param_name: Callable[[sympy.Expr], str] | None = None,
204
207
  ):
205
208
  """Initializes a new _ParamFlattener.
206
209
 
@@ -250,8 +253,8 @@ class _ParamFlattener(resolver.ParamResolver):
250
253
  return symbol
251
254
 
252
255
  def value_of(
253
- self, value: Union['cirq.TParamKey', 'cirq.TParamValComplex'], recursive: bool = False
254
- ) -> 'cirq.TParamValComplex':
256
+ self, value: cirq.TParamKey | cirq.TParamValComplex, recursive: bool = False
257
+ ) -> cirq.TParamValComplex:
255
258
  """Resolves a symbol or expression to a new symbol unique to that value.
256
259
 
257
260
  - If value is a float, returns it.
@@ -326,9 +329,7 @@ class ExpressionMap(dict):
326
329
  """
327
330
  super().__init__(*args, **kwargs)
328
331
 
329
- def transform_sweep(
330
- self, sweep: Union[sweeps.Sweep, List[resolver.ParamResolver]]
331
- ) -> sweeps.Sweep:
332
+ def transform_sweep(self, sweep: sweeps.Sweep | list[resolver.ParamResolver]) -> sweeps.Sweep:
332
333
  """Returns a sweep to use with a circuit flattened earlier with
333
334
  `cirq.flatten`.
334
335
 
@@ -343,7 +344,7 @@ class ExpressionMap(dict):
343
344
  sweep: The sweep to transform.
344
345
  """
345
346
  sweep = sweepable.to_sweep(sweep)
346
- param_list: List[resolver.ParamDictType] = []
347
+ param_list: list[resolver.ParamDictType] = []
347
348
  for r in sweep:
348
349
  param_dict: resolver.ParamDictType = {}
349
350
  for formula, sym in self.items():
@@ -380,8 +381,8 @@ class ExpressionMap(dict):
380
381
 
381
382
 
382
383
  def _ensure_not_str(
383
- param: Union[sympy.Expr, 'cirq.TParamValComplex', str],
384
- ) -> Union[sympy.Expr, 'cirq.TParamValComplex']:
384
+ param: sympy.Expr | cirq.TParamValComplex | str,
385
+ ) -> sympy.Expr | cirq.TParamValComplex:
385
386
  if isinstance(param, str):
386
387
  return sympy.Symbol(param)
387
388
  return param
@@ -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 sympy
16
18
 
17
19
  import cirq
@@ -23,14 +25,14 @@ from cirq.study import flatten_expressions
23
25
  # factor, is not consistent between sympy versions <1.4 and >=1.4.
24
26
 
25
27
 
26
- def test_expr_map_names():
28
+ def test_expr_map_names() -> None:
27
29
  flattener = flatten_expressions._ParamFlattener({'collision': '<x + 2>'})
28
30
  expressions = [sympy.Symbol('x') + i for i in range(3)]
29
31
  syms = flattener.flatten(expressions)
30
32
  assert syms == [sympy.Symbol(name) for name in ('x', '<x + 1>', '<x + 2>_1')]
31
33
 
32
34
 
33
- def test_flattener_value_of():
35
+ def test_flattener_value_of() -> None:
34
36
  flattener = flatten_expressions._ParamFlattener({'c': 5, 'x1': 'x1'})
35
37
  assert flattener.value_of(9) == 9
36
38
  assert flattener.value_of('c') == 5
@@ -54,18 +56,18 @@ def test_flattener_value_of():
54
56
  ]
55
57
 
56
58
 
57
- def test_flattener_repr():
59
+ def test_flattener_repr() -> None:
58
60
  assert repr(flatten_expressions._ParamFlattener({'a': 1})) == ("_ParamFlattener({a: 1})")
59
61
  assert repr(
60
62
  flatten_expressions._ParamFlattener({'a': 1}, get_param_name=lambda expr: 'x')
61
63
  ).startswith("_ParamFlattener({a: 1}, get_param_name=<function ")
62
64
 
63
65
 
64
- def test_expression_map_repr():
66
+ def test_expression_map_repr() -> None:
65
67
  cirq.testing.assert_equivalent_repr(cirq.ExpressionMap({'a': 'b'}))
66
68
 
67
69
 
68
- def test_flatten_circuit():
70
+ def test_flatten_circuit() -> None:
69
71
  qubit = cirq.LineQubit(0)
70
72
  a = sympy.Symbol('a')
71
73
  circuit = cirq.Circuit(cirq.X(qubit) ** a, cirq.X(qubit) ** (1 + a / 2))
@@ -78,7 +80,7 @@ def test_flatten_circuit():
78
80
  assert expr_map == {a: a, 1 + a / 2: sympy.Symbol('<a/2 + 1>')}
79
81
 
80
82
 
81
- def test_transform_params():
83
+ def test_transform_params() -> None:
82
84
  qubit = cirq.LineQubit(0)
83
85
  a = sympy.Symbol('a')
84
86
  circuit = cirq.Circuit(cirq.X(qubit) ** (a / 4), cirq.X(qubit) ** (1 + a / 2))
@@ -90,7 +92,7 @@ def test_transform_params():
90
92
  assert new_params == expected_params
91
93
 
92
94
 
93
- def test_transform_sweep():
95
+ def test_transform_sweep() -> None:
94
96
  qubit = cirq.LineQubit(0)
95
97
  a = sympy.Symbol('a')
96
98
  circuit = cirq.Circuit(cirq.X(qubit) ** (a / 4), cirq.X(qubit) ** (1 + a / 2))
@@ -109,20 +111,20 @@ def test_transform_sweep():
109
111
  assert resolvers == expected_resolvers
110
112
 
111
113
 
112
- def test_flattener_new():
114
+ def test_flattener_new() -> None:
113
115
  flattener = flatten_expressions._ParamFlattener({'a': 'b'})
114
116
  flattener2 = flatten_expressions._ParamFlattener(flattener)
115
117
  assert isinstance(flattener2, flatten_expressions._ParamFlattener)
116
118
  assert flattener2.param_dict == flattener.param_dict
117
119
 
118
120
 
119
- def test_resolver_new():
121
+ def test_resolver_new() -> None:
120
122
  flattener = flatten_expressions._ParamFlattener({'a': 'b'})
121
123
  flattener2 = cirq.ParamResolver(flattener)
122
124
  assert flattener2 is flattener
123
125
 
124
126
 
125
- def test_transformed_sweep():
127
+ def test_transformed_sweep() -> None:
126
128
  a = sympy.Symbol('a')
127
129
  sweep = cirq.Linspace('a', start=0, stop=3, length=4)
128
130
  expr_map = cirq.ExpressionMap({a / 4: 'x0', 1 - a / 2: 'x1'})
@@ -134,7 +136,7 @@ def test_transformed_sweep():
134
136
  assert params[1] == (('x0', 1 / 4), ('x1', 1 - 1 / 2))
135
137
 
136
138
 
137
- def test_transformed_sweep_equality():
139
+ def test_transformed_sweep_equality() -> None:
138
140
  a = sympy.Symbol('a')
139
141
  sweep = cirq.Linspace('a', start=0, stop=3, length=4)
140
142
  expr_map = cirq.ExpressionMap({a / 4: 'x0', 1 - a / 4: 'x1'})
cirq/study/resolver.py CHANGED
@@ -13,8 +13,11 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Resolves ParameterValues to assigned values."""
16
+
17
+ from __future__ import annotations
18
+
16
19
  import numbers
17
- from typing import Any, cast, Dict, Iterator, Mapping, Optional, TYPE_CHECKING, Union
20
+ from typing import Any, cast, Iterator, Mapping, TYPE_CHECKING, Union
18
21
 
19
22
  import numpy as np
20
23
  import sympy
@@ -27,7 +30,7 @@ if TYPE_CHECKING:
27
30
  import cirq
28
31
 
29
32
 
30
- ParamDictType = Dict['cirq.TParamKey', 'cirq.TParamValComplex']
33
+ ParamDictType = dict['cirq.TParamKey', 'cirq.TParamValComplex']
31
34
  ParamMappingType = Mapping['cirq.TParamKey', 'cirq.TParamValComplex']
32
35
  document(ParamDictType, """Dictionary from symbols to values.""")
33
36
  document(ParamMappingType, """Immutable map from symbols to values.""")
@@ -61,16 +64,16 @@ class ParamResolver:
61
64
  TypeError if formulas are passed as keys.
62
65
  """
63
66
 
64
- def __new__(cls, param_dict: 'cirq.ParamResolverOrSimilarType' = None):
67
+ def __new__(cls, param_dict: cirq.ParamResolverOrSimilarType = None):
65
68
  if isinstance(param_dict, ParamResolver):
66
69
  return param_dict
67
70
  return super().__new__(cls)
68
71
 
69
- def __init__(self, param_dict: 'cirq.ParamResolverOrSimilarType' = None) -> None:
72
+ def __init__(self, param_dict: cirq.ParamResolverOrSimilarType = None) -> None:
70
73
  if hasattr(self, 'param_dict'):
71
74
  return # Already initialized. Got wrapped as part of the __new__.
72
75
 
73
- self._param_hash: Optional[int] = None
76
+ self._param_hash: int | None = None
74
77
  self._param_dict = cast(ParamDictType, {} if param_dict is None else param_dict)
75
78
  for key in self._param_dict:
76
79
  if isinstance(key, sympy.Expr) and not isinstance(key, sympy.Symbol):
@@ -82,8 +85,8 @@ class ParamResolver:
82
85
  return self._param_dict
83
86
 
84
87
  def value_of(
85
- self, value: Union['cirq.TParamKey', 'cirq.TParamValComplex'], recursive: bool = True
86
- ) -> 'cirq.TParamValComplex':
88
+ self, value: cirq.TParamKey | cirq.TParamValComplex, recursive: bool = True
89
+ ) -> cirq.TParamValComplex:
87
90
  """Attempt to resolve a parameter to its assigned value.
88
91
 
89
92
  Scalars are returned without modification. Strings are resolved via
@@ -193,7 +196,7 @@ class ParamResolver:
193
196
 
194
197
  return self._value_of_recursive(value)
195
198
 
196
- def _value_of_recursive(self, value: 'cirq.TParamKey') -> 'cirq.TParamValComplex':
199
+ def _value_of_recursive(self, value: cirq.TParamKey) -> cirq.TParamValComplex:
197
200
  # Recursive parameter resolution. We can safely assume that value is a
198
201
  # single symbol, since combinations are handled earlier in the method.
199
202
  if value in self._deep_eval_map:
@@ -213,8 +216,8 @@ class ParamResolver:
213
216
  self._deep_eval_map[value] = self.value_of(v, recursive=True)
214
217
  return self._deep_eval_map[value]
215
218
 
216
- def _resolve_parameters_(self, resolver: 'ParamResolver', recursive: bool) -> 'ParamResolver':
217
- new_dict: Dict['cirq.TParamKey', Union[float, str, sympy.Symbol, sympy.Expr]] = {
219
+ def _resolve_parameters_(self, resolver: ParamResolver, recursive: bool) -> ParamResolver:
220
+ new_dict: dict[cirq.TParamKey, float | str | sympy.Symbol | sympy.Expr] = {
218
221
  k: k for k in resolver
219
222
  }
220
223
  new_dict.update({k: self.value_of(k, recursive) for k in self})
@@ -225,15 +228,13 @@ class ParamResolver:
225
228
  return ParamResolver()._resolve_parameters_(new_resolver, recursive=True)
226
229
  return ParamResolver(cast(ParamDictType, new_dict))
227
230
 
228
- def __iter__(self) -> Iterator[Union[str, sympy.Expr]]:
231
+ def __iter__(self) -> Iterator[str | sympy.Expr]:
229
232
  return iter(self._param_dict)
230
233
 
231
234
  def __bool__(self) -> bool:
232
235
  return bool(self._param_dict)
233
236
 
234
- def __getitem__(
235
- self, key: Union['cirq.TParamKey', 'cirq.TParamValComplex']
236
- ) -> 'cirq.TParamValComplex':
237
+ def __getitem__(self, key: cirq.TParamKey | cirq.TParamValComplex) -> cirq.TParamValComplex:
237
238
  return self.value_of(key)
238
239
 
239
240
  def __hash__(self) -> int:
@@ -241,7 +242,7 @@ class ParamResolver:
241
242
  self._param_hash = hash(frozenset(self._param_dict.items()))
242
243
  return self._param_hash
243
244
 
244
- def __getstate__(self) -> Dict[str, Any]:
245
+ def __getstate__(self) -> dict[str, Any]:
245
246
  # clear cached hash value when pickling, see #6674
246
247
  state = self.__dict__
247
248
  if state["_param_hash"] is not None:
@@ -265,7 +266,7 @@ class ParamResolver:
265
266
  )
266
267
  return f'cirq.ParamResolver({param_dict_repr})'
267
268
 
268
- def _json_dict_(self) -> Dict[str, Any]:
269
+ def _json_dict_(self) -> dict[str, Any]:
269
270
  return {
270
271
  # JSON requires mappings to have keys of basic types.
271
272
  'param_dict': list(self._param_dict.items())
@@ -285,7 +286,7 @@ def _resolve_value(val: Any) -> Any:
285
286
  return val.p
286
287
  if isinstance(val, sympy_numbers.RationalConstant):
287
288
  return val.p / val.q
288
- if val == sympy.pi:
289
+ if val is sympy.pi:
289
290
  return np.pi
290
291
 
291
292
  getter = getattr(val, '_resolved_value_', None)