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
@@ -14,22 +14,12 @@
14
14
 
15
15
  """Defines primitives for common transformer patterns."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import bisect
18
20
  import dataclasses
19
21
  from collections import defaultdict
20
- from typing import (
21
- Callable,
22
- cast,
23
- Dict,
24
- Hashable,
25
- List,
26
- Optional,
27
- Sequence,
28
- Set,
29
- Tuple,
30
- TYPE_CHECKING,
31
- Union,
32
- )
22
+ from typing import Callable, cast, Hashable, Sequence, TYPE_CHECKING
33
23
 
34
24
  from cirq import circuits, ops, protocols
35
25
  from cirq.circuits.circuit import CIRCUIT_TYPE
@@ -61,7 +51,7 @@ def _create_target_circuit_type(ops: ops.OP_TREE, target_circuit: CIRCUIT_TYPE)
61
51
 
62
52
  def map_moments(
63
53
  circuit: CIRCUIT_TYPE,
64
- map_func: Callable[[circuits.Moment, int], Union[circuits.Moment, Sequence[circuits.Moment]]],
54
+ map_func: Callable[[circuits.Moment, int], circuits.Moment | Sequence[circuits.Moment]],
65
55
  *,
66
56
  tags_to_ignore: Sequence[Hashable] = (),
67
57
  deep: bool = False,
@@ -135,7 +125,7 @@ def _map_operations_impl(
135
125
  resulting optree spans more than 1 moment, it's either wrapped in a tagged circuit
136
126
  operation and inserted in-place in the same moment (if `wrap_in_circuit_op` is True)
137
127
  OR the mapped operations are inserted directly in the circuit, preserving moment
138
- strucutre. The effect is equivalent to (but much faster) a two-step approach of first
128
+ structure. The effect is equivalent to (but much faster) a two-step approach of first
139
129
  wrapping the operations in a circuit operation and then calling `cirq.unroll_circuit_op`
140
130
  to unroll the corresponding circuit ops.
141
131
  deep: If true, `map_func` will be recursively applied to circuits wrapped inside
@@ -157,7 +147,7 @@ def _map_operations_impl(
157
147
  """
158
148
  tags_to_ignore_set = set(tags_to_ignore)
159
149
 
160
- def apply_map_func(op: 'cirq.Operation', idx: int) -> List['cirq.Operation']:
150
+ def apply_map_func(op: cirq.Operation, idx: int) -> list[cirq.Operation]:
161
151
  if tags_to_ignore_set.intersection(op.tags):
162
152
  return [op]
163
153
  if deep and isinstance(op.untagged, circuits.CircuitOperation):
@@ -173,7 +163,7 @@ def _map_operations_impl(
173
163
  ).with_tags(*op.tags)
174
164
  mapped_ops = [*ops.flatten_to_ops(map_func(op, idx))]
175
165
  op_qubits = set(op.qubits)
176
- mapped_ops_qubits: Set['cirq.Qid'] = set()
166
+ mapped_ops_qubits: set[cirq.Qid] = set()
177
167
  has_overlapping_ops = False
178
168
  for mapped_op in mapped_ops:
179
169
  if raise_if_add_qubits and not op_qubits.issuperset(mapped_op.qubits):
@@ -194,9 +184,9 @@ def _map_operations_impl(
194
184
  ]
195
185
  return mapped_ops
196
186
 
197
- new_moments: List[List['cirq.Operation']] = []
187
+ new_moments: list[list[cirq.Operation]] = []
198
188
  for idx, moment in enumerate(circuit):
199
- curr_moments: List[List['cirq.Operation']] = [[]] if wrap_in_circuit_op else []
189
+ curr_moments: list[list[cirq.Operation]] = [[]] if wrap_in_circuit_op else []
200
190
  placement_cache = circuits.circuit._PlacementCache()
201
191
  for op in moment:
202
192
  mapped_ops = apply_map_func(op, idx)
@@ -305,21 +295,21 @@ class _MergedCircuit:
305
295
  of a set to store operations to preserve insertion order.
306
296
  """
307
297
 
308
- qubit_indexes: Dict['cirq.Qid', List[int]] = dataclasses.field(
298
+ qubit_indexes: dict[cirq.Qid, list[int]] = dataclasses.field(
309
299
  default_factory=lambda: defaultdict(lambda: [-1])
310
300
  )
311
- mkey_indexes: Dict['cirq.MeasurementKey', List[int]] = dataclasses.field(
301
+ mkey_indexes: dict[cirq.MeasurementKey, list[int]] = dataclasses.field(
312
302
  default_factory=lambda: defaultdict(lambda: [-1])
313
303
  )
314
- ckey_indexes: Dict['cirq.MeasurementKey', List[int]] = dataclasses.field(
304
+ ckey_indexes: dict[cirq.MeasurementKey, list[int]] = dataclasses.field(
315
305
  default_factory=lambda: defaultdict(lambda: [-1])
316
306
  )
317
- ops_by_index: List[Dict['cirq.Operation', int]] = dataclasses.field(default_factory=list)
307
+ ops_by_index: list[dict[cirq.Operation, int]] = dataclasses.field(default_factory=list)
318
308
 
319
309
  def append_empty_moment(self) -> None:
320
310
  self.ops_by_index.append({})
321
311
 
322
- def add_op_to_moment(self, moment_index: int, op: 'cirq.Operation') -> None:
312
+ def add_op_to_moment(self, moment_index: int, op: cirq.Operation) -> None:
323
313
  self.ops_by_index[moment_index][op] = 0
324
314
  for q in op.qubits:
325
315
  if moment_index > self.qubit_indexes[q][-1]:
@@ -331,7 +321,7 @@ class _MergedCircuit:
331
321
  for ckey in protocols.control_keys(op):
332
322
  bisect.insort(self.ckey_indexes[ckey], moment_index)
333
323
 
334
- def remove_op_from_moment(self, moment_index: int, op: 'cirq.Operation') -> None:
324
+ def remove_op_from_moment(self, moment_index: int, op: cirq.Operation) -> None:
335
325
  self.ops_by_index[moment_index].pop(op)
336
326
  for q in op.qubits:
337
327
  if self.qubit_indexes[q][-1] == moment_index:
@@ -344,8 +334,8 @@ class _MergedCircuit:
344
334
  self.ckey_indexes[ckey].remove(moment_index)
345
335
 
346
336
  def get_mergeable_ops(
347
- self, op: 'cirq.Operation', op_qs: Set['cirq.Qid']
348
- ) -> Tuple[int, List['cirq.Operation']]:
337
+ self, op: cirq.Operation, op_qs: set[cirq.Qid]
338
+ ) -> tuple[int, list[cirq.Operation]]:
349
339
  # Find the index of previous moment which can be merged with `op`.
350
340
  idx = max([self.qubit_indexes[q][-1] for q in op_qs], default=-1)
351
341
  idx = max([idx] + [self.mkey_indexes[ckey][-1] for ckey in protocols.control_keys(op)])
@@ -360,13 +350,13 @@ class _MergedCircuit:
360
350
  left_op for left_op in self.ops_by_index[idx] if not op_qs.isdisjoint(left_op.qubits)
361
351
  ]
362
352
 
363
- def get_cirq_circuit(self) -> 'cirq.Circuit':
353
+ def get_cirq_circuit(self) -> cirq.Circuit:
364
354
  return circuits.Circuit(circuits.Moment(m.keys()) for m in self.ops_by_index)
365
355
 
366
356
 
367
357
  def merge_operations(
368
358
  circuit: CIRCUIT_TYPE,
369
- merge_func: Callable[[ops.Operation, ops.Operation], Optional[ops.Operation]],
359
+ merge_func: Callable[[ops.Operation, ops.Operation], ops.Operation | None],
370
360
  *,
371
361
  tags_to_ignore: Sequence[Hashable] = (),
372
362
  deep: bool = False,
@@ -374,13 +364,13 @@ def merge_operations(
374
364
  """Merges operations in a circuit by calling `merge_func` iteratively on operations.
375
365
 
376
366
  Two operations op1 and op2 are merge-able if
377
- - There is no other operations between op1 and op2 in the circuit
367
+ - There is no other operation between op1 and op2 in the circuit
378
368
  - is_subset(op1.qubits, op2.qubits) or is_subset(op2.qubits, op1.qubits)
379
369
 
380
370
  The `merge_func` is a callable which, given two merge-able operations
381
371
  op1 and op2, decides whether they should be merged into a single operation
382
372
  or not. If not, it should return None, else it should return the single merged
383
- operations `op`.
373
+ operation `op`.
384
374
 
385
375
  The method iterates on the input circuit moment-by-moment from left to right and attempts
386
376
  to repeatedly merge each operation in the latest moment with all the corresponding merge-able
@@ -393,7 +383,7 @@ def merge_operations(
393
383
 
394
384
  The number of calls to `merge_func` is O(N), where N = Total no. of operations, because:
395
385
  - Every time the `merge_func` returns a new operation, the number of operations in the
396
- circuit reduce by 1 and hence this can happen at most O(N) times
386
+ circuit reduces by 1 and hence this can happen at most O(N) times
397
387
  - Every time the `merge_func` returns None, the current operation is inserted into the
398
388
  frontier and we go on to process the next operation, which can also happen at-most
399
389
  O(N) times.
@@ -420,7 +410,7 @@ def merge_operations(
420
410
  _circuit_op_tag = "_internal_tag_to_mark_circuit_ops_in_circuit"
421
411
  tags_to_ignore_set = set(tags_to_ignore) | {_circuit_op_tag}
422
412
 
423
- def apply_merge_func(op1: ops.Operation, op2: ops.Operation) -> Optional[ops.Operation]:
413
+ def apply_merge_func(op1: ops.Operation, op2: ops.Operation) -> ops.Operation | None:
424
414
  if not all(tags_to_ignore_set.isdisjoint(op.tags) for op in [op1, op2]):
425
415
  return None
426
416
  new_op = merge_func(op1, op2)
@@ -433,7 +423,7 @@ def merge_operations(
433
423
  return new_op
434
424
 
435
425
  merged_circuit = _MergedCircuit()
436
- for moment_idx, current_moment in enumerate(cast(List['cirq.Moment'], circuit)):
426
+ for moment_idx, current_moment in enumerate(cast(list['cirq.Moment'], circuit)):
437
427
  merged_circuit.append_empty_moment()
438
428
  for op in sorted(current_moment.operations, key=lambda op: op.qubits):
439
429
  if (
@@ -493,7 +483,7 @@ def merge_operations(
493
483
 
494
484
  def merge_operations_to_circuit_op(
495
485
  circuit: CIRCUIT_TYPE,
496
- can_merge: Callable[[Sequence['cirq.Operation'], Sequence['cirq.Operation']], bool],
486
+ can_merge: Callable[[Sequence[cirq.Operation], Sequence[cirq.Operation]], bool],
497
487
  *,
498
488
  tags_to_ignore: Sequence[Hashable] = (),
499
489
  merged_circuit_op_tag: str = "Merged connected component",
@@ -511,7 +501,7 @@ def merge_operations_to_circuit_op(
511
501
  Args:
512
502
  circuit: Input circuit to apply the transformations on. The input circuit is not mutated.
513
503
  can_merge: Callable to determine whether a new operation `right_op` can be merged into an
514
- existing connected component of operations `left_ops` based on boolen returned by
504
+ existing connected component of operations `left_ops` based on boolean returned by
515
505
  `can_merge(left_ops, right_op)`.
516
506
  tags_to_ignore: Tagged operations marked any of `tags_to_ignore` will not be considered as
517
507
  potential candidates for any connected component.
@@ -524,8 +514,8 @@ def merge_operations_to_circuit_op(
524
514
  Copy of input circuit with valid connected components wrapped in tagged circuit operations.
525
515
  """
526
516
 
527
- def merge_func(op1: 'cirq.Operation', op2: 'cirq.Operation') -> Optional['cirq.Operation']:
528
- def get_ops(op: 'cirq.Operation'):
517
+ def merge_func(op1: cirq.Operation, op2: cirq.Operation) -> cirq.Operation | None:
518
+ def get_ops(op: cirq.Operation):
529
519
  op_untagged = op.untagged
530
520
  return (
531
521
  [*op_untagged.circuit.all_operations()]
@@ -549,7 +539,7 @@ def merge_k_qubit_unitaries_to_circuit_op(
549
539
  k: int,
550
540
  *,
551
541
  tags_to_ignore: Sequence[Hashable] = (),
552
- merged_circuit_op_tag: Optional[str] = None,
542
+ merged_circuit_op_tag: str | None = None,
553
543
  deep: bool = False,
554
544
  ) -> CIRCUIT_TYPE:
555
545
  """Merges connected components of operations, acting on <= k qubits, into circuit operations.
@@ -573,7 +563,7 @@ def merge_k_qubit_unitaries_to_circuit_op(
573
563
  Copy of input circuit with valid connected components wrapped in tagged circuit operations.
574
564
  """
575
565
 
576
- def can_merge(ops1: Sequence['cirq.Operation'], ops2: Sequence['cirq.Operation']) -> bool:
566
+ def can_merge(ops1: Sequence[cirq.Operation], ops2: Sequence[cirq.Operation]) -> bool:
577
567
  return all(
578
568
  protocols.num_qubits(op) <= k and protocols.has_unitary(op)
579
569
  for op_list in [ops1, ops2]
@@ -591,7 +581,7 @@ def merge_k_qubit_unitaries_to_circuit_op(
591
581
 
592
582
  def merge_moments(
593
583
  circuit: CIRCUIT_TYPE,
594
- merge_func: Callable[[circuits.Moment, circuits.Moment], Optional[circuits.Moment]],
584
+ merge_func: Callable[[circuits.Moment, circuits.Moment], circuits.Moment | None],
595
585
  *,
596
586
  tags_to_ignore: Sequence[Hashable] = (),
597
587
  deep: bool = False,
@@ -626,7 +616,7 @@ def merge_moments(
626
616
  ),
627
617
  tags_to_ignore=tags_to_ignore,
628
618
  )
629
- merged_moments: List[circuits.Moment] = [circuit[0]]
619
+ merged_moments: list[circuits.Moment] = [circuit[0]]
630
620
  for current_moment in circuit[1:]:
631
621
  merged_moment = merge_func(merged_moments[-1], current_moment)
632
622
  if merged_moment is None:
@@ -640,7 +630,7 @@ def unroll_circuit_op(
640
630
  circuit: CIRCUIT_TYPE,
641
631
  *,
642
632
  deep: bool = False,
643
- tags_to_check: Optional[Sequence[Hashable]] = (MAPPED_CIRCUIT_OP_TAG,),
633
+ tags_to_check: Sequence[Hashable] | None = (MAPPED_CIRCUIT_OP_TAG,),
644
634
  ) -> CIRCUIT_TYPE:
645
635
  """Unrolls (tagged) `cirq.CircuitOperation`s while preserving the moment structure.
646
636
 
@@ -659,7 +649,7 @@ def unroll_circuit_op(
659
649
  """
660
650
 
661
651
  def map_func(m: circuits.Moment, _: int):
662
- to_zip: List['cirq.AbstractCircuit'] = []
652
+ to_zip: list[cirq.AbstractCircuit] = []
663
653
  for op in m:
664
654
  op_untagged = op.untagged
665
655
  if isinstance(op_untagged, circuits.CircuitOperation):
@@ -685,7 +675,7 @@ def unroll_circuit_op_greedy_earliest(
685
675
  circuit: CIRCUIT_TYPE,
686
676
  *,
687
677
  deep: bool = False,
688
- tags_to_check: Optional[Sequence[Hashable]] = (MAPPED_CIRCUIT_OP_TAG,),
678
+ tags_to_check: Sequence[Hashable] | None = (MAPPED_CIRCUIT_OP_TAG,),
689
679
  ) -> CIRCUIT_TYPE:
690
680
  """Unrolls (tagged) `cirq.CircuitOperation`s by inserting operations using EARLIEST strategy.
691
681
 
@@ -732,7 +722,7 @@ def unroll_circuit_op_greedy_frontier(
732
722
  circuit: CIRCUIT_TYPE,
733
723
  *,
734
724
  deep: bool = False,
735
- tags_to_check: Optional[Sequence[Hashable]] = (MAPPED_CIRCUIT_OP_TAG,),
725
+ tags_to_check: Sequence[Hashable] | None = (MAPPED_CIRCUIT_OP_TAG,),
736
726
  ) -> CIRCUIT_TYPE:
737
727
  """Unrolls (tagged) `cirq.CircuitOperation`s by inserting operations inline at qubit frontier.
738
728
 
@@ -751,7 +741,7 @@ def unroll_circuit_op_greedy_frontier(
751
741
  Copy of input circuit with (Tagged) CircuitOperation's expanded inline at qubit frontier.
752
742
  """
753
743
  unrolled_circuit = circuit.unfreeze(copy=True)
754
- frontier: Dict['cirq.Qid', int] = defaultdict(lambda: 0)
744
+ frontier: dict[cirq.Qid, int] = defaultdict(lambda: 0)
755
745
  idx = 0
756
746
  while idx < len(unrolled_circuit):
757
747
  for op in unrolled_circuit[idx].operations:
@@ -781,7 +771,7 @@ def unroll_circuit_op_greedy_frontier(
781
771
  def toggle_tags(circuit: CIRCUIT_TYPE, tags: Sequence[Hashable], *, deep: bool = False):
782
772
  """Toggles tags applied on each operation in the circuit, via `op.tags ^= tags`
783
773
 
784
- For every operations `op` in the input circuit, the tags on `op` are replaced by a symmetric
774
+ For every operation `op` in the input circuit, the tags on `op` are replaced by a symmetric
785
775
  difference of `op.tags` and `tags` -- this is useful in scenarios where you mark a small subset
786
776
  of operations with a specific tag and then toggle the set of marked operations s.t. every
787
777
  marked operation is now unmarked and vice versa.
@@ -799,7 +789,7 @@ def toggle_tags(circuit: CIRCUIT_TYPE, tags: Sequence[Hashable], *, deep: bool =
799
789
  """
800
790
  tags_to_xor = set(tags)
801
791
 
802
- def map_func(op: 'cirq.Operation', _) -> 'cirq.Operation':
792
+ def map_func(op: cirq.Operation, _) -> cirq.Operation:
803
793
  return (
804
794
  op
805
795
  if deep and isinstance(op, circuits.CircuitOperation)
@@ -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 Iterator, List, Optional
15
+ from __future__ import annotations
16
+
17
+ from typing import Iterator
16
18
 
17
19
  import pytest
18
20
 
@@ -114,7 +116,6 @@ def test_map_operations_does_not_insert_too_many_moments():
114
116
  )
115
117
 
116
118
 
117
- # pylint: disable=line-too-long
118
119
  def test_map_operations_deep_subcircuits():
119
120
  q = cirq.LineQubit.range(5)
120
121
  c_orig = cirq.Circuit(cirq.CX(q[0], q[1]), cirq.CX(q[3], q[2]), cirq.CX(q[3], q[4]))
@@ -164,7 +165,7 @@ def test_map_operations_deep_subcircuits():
164
165
  3: ───#4──────────────────────────────────────────────────────────────────────────────────────────────────────
165
166
 
166
167
  4: ───#5──────────────────────────────────────────────────────────────────────────────────────────────────────
167
- ''',
168
+ ''', # noqa: E501
168
169
  )
169
170
 
170
171
  c_mapped = cirq.map_operations(c_orig_with_circuit_ops, map_func, deep=True)
@@ -199,13 +200,10 @@ def test_map_operations_deep_subcircuits():
199
200
  3: ───#4──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
200
201
 
201
202
  4: ───#5──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
202
- ''',
203
+ ''', # noqa: E501
203
204
  )
204
205
 
205
206
 
206
- # pylint: enable=line-too-long
207
-
208
-
209
207
  @pytest.mark.parametrize("deep", [False, True])
210
208
  def test_map_operations_preserves_circuit_tags(deep: bool) -> None:
211
209
  tag = "should be preserved"
@@ -501,7 +499,7 @@ def test_map_moments_drop_empty_moments_deep():
501
499
  cirq.testing.assert_same_circuits(c_mapped, c_expected)
502
500
 
503
501
 
504
- def _merge_z_moments_func(m1: cirq.Moment, m2: cirq.Moment) -> Optional[cirq.Moment]:
502
+ def _merge_z_moments_func(m1: cirq.Moment, m2: cirq.Moment) -> cirq.Moment | None:
505
503
  if any(op.gate != cirq.Z for m in [m1, m2] for op in m):
506
504
  return None
507
505
  return cirq.Moment(
@@ -705,9 +703,6 @@ def test_merge_operations_deep():
705
703
  )
706
704
 
707
705
 
708
- # pylint: disable=line-too-long
709
-
710
-
711
706
  def test_merge_operations_to_circuit_op_merges_connected_component():
712
707
  c_orig = _create_circuit_to_merge()
713
708
  cirq.testing.assert_has_diagram(
@@ -721,7 +716,7 @@ def test_merge_operations_to_circuit_op_merges_connected_component():
721
716
  ''',
722
717
  )
723
718
 
724
- def can_merge(ops1: List['cirq.Operation'], ops2: List['cirq.Operation']) -> bool:
719
+ def can_merge(ops1: list[cirq.Operation], ops2: list[cirq.Operation]) -> bool:
725
720
  """Artificial example where a CZ will absorb any merge-able operation."""
726
721
  return any(o.gate == cirq.CZ for op_list in [ops1, ops2] for o in op_list)
727
722
 
@@ -738,7 +733,7 @@ def test_merge_operations_to_circuit_op_merges_connected_component():
738
733
  1: ───────┼───────────#2───────────────────────────────────────────────────────────@───────Y───────────X───
739
734
  │ │
740
735
  2: ───H───X────────────────────────────────────────────────────────────────────────X───────────────────────
741
- ''',
736
+ ''', # noqa: E501
742
737
  )
743
738
 
744
739
 
@@ -770,13 +765,11 @@ def test_merge_2q_unitaries_to_circuit_op():
770
765
  1: ───┼────────────────────────────#2───────────────────────────────────────────────[ │ ]───────────────────────X───
771
766
  │ [ 2: ───X─────── ][merged]
772
767
  │ │
773
- 2: ───#2────────────────────────────────────────────────────────────────────────────#2───────────────────────────────────────M───''',
768
+ 2: ───#2────────────────────────────────────────────────────────────────────────────#2───────────────────────────────────────M───
769
+ ''', # noqa: E501
774
770
  )
775
771
 
776
772
 
777
- # pylint: enable=line-too-long
778
-
779
-
780
773
  def test_merge_operations_respects_tags_to_ignore():
781
774
  q = cirq.LineQubit.range(2)
782
775
  c = cirq.Circuit(
cirq/value/abc_alt.py CHANGED
@@ -14,9 +14,11 @@
14
14
 
15
15
  """A more flexible abstract base class metaclass ABCMetaImplementAnyOneOf."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import abc
18
20
  import functools
19
- from typing import Callable, cast, Set, TypeVar
21
+ from typing import Callable, cast, TypeVar
20
22
 
21
23
  T = TypeVar('T')
22
24
 
@@ -80,8 +82,8 @@ class ABCMetaImplementAnyOneOf(abc.ABCMeta):
80
82
  `@alternative(...)` may be used.
81
83
  """
82
84
 
83
- def __new__(mcls, name, bases, namespace, **kwargs):
84
- cls = super().__new__(mcls, name, bases, namespace, **kwargs)
85
+ def __new__(mcs, name, bases, namespace, **kwargs):
86
+ cls = super().__new__(mcs, name, bases, namespace, **kwargs)
85
87
  implemented_by = {}
86
88
 
87
89
  def has_some_implementation(name: str) -> bool:
@@ -101,7 +103,7 @@ class ABCMetaImplementAnyOneOf(abc.ABCMeta):
101
103
  return False
102
104
  return True
103
105
 
104
- def find_next_implementations(all_names: Set[str]) -> bool:
106
+ def find_next_implementations(all_names: set[str]) -> bool:
105
107
  next_implemented_by = {}
106
108
  for name in all_names:
107
109
  if has_some_implementation(name):
@@ -12,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import abc
16
- from typing import NoReturn, Optional
18
+ from typing import NoReturn
17
19
 
18
20
  import pytest
19
21
 
@@ -158,11 +160,11 @@ def test_two_alternatives():
158
160
  raise NotImplementedError
159
161
 
160
162
  @abc.abstractmethod
161
- def alt1(self) -> Optional[str]:
163
+ def alt1(self) -> str | None:
162
164
  pass
163
165
 
164
166
  @abc.abstractmethod
165
- def alt2(self) -> Optional[str]:
167
+ def alt2(self) -> str | None:
166
168
  pass
167
169
 
168
170
  class TwoAlternativesChild(TwoAlternatives):
cirq/value/angle.py CHANGED
@@ -12,18 +12,21 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Optional, overload
15
+ from __future__ import annotations
16
+
17
+ from typing import overload, TYPE_CHECKING
16
18
 
17
19
  import numpy as np
18
20
  import sympy
19
21
 
20
- from cirq.value import type_alias
22
+ if TYPE_CHECKING:
23
+ from cirq.value import type_alias
21
24
 
22
25
 
23
26
  def chosen_angle_to_half_turns(
24
- half_turns: Optional[type_alias.TParamVal] = None,
25
- rads: Optional[float] = None,
26
- degs: Optional[float] = None,
27
+ half_turns: type_alias.TParamVal | None = None,
28
+ rads: float | None = None,
29
+ degs: float | None = None,
27
30
  default: float = 1.0,
28
31
  ) -> type_alias.TParamVal:
29
32
  """Returns a half_turns value based on the given arguments.
@@ -60,9 +63,9 @@ def chosen_angle_to_half_turns(
60
63
 
61
64
 
62
65
  def chosen_angle_to_canonical_half_turns(
63
- half_turns: Optional[type_alias.TParamVal] = None,
64
- rads: Optional[float] = None,
65
- degs: Optional[float] = None,
66
+ half_turns: type_alias.TParamVal | None = None,
67
+ rads: float | None = None,
68
+ degs: float | None = None,
66
69
  default: float = 1.0,
67
70
  ) -> type_alias.TParamVal:
68
71
  """Returns a canonicalized half_turns based on the given arguments.
@@ -84,7 +87,6 @@ def chosen_angle_to_canonical_half_turns(
84
87
  )
85
88
 
86
89
 
87
- # pylint: disable=function-redefined
88
90
  @overload
89
91
  def canonicalize_half_turns(half_turns: float) -> float:
90
92
  pass
@@ -105,6 +107,3 @@ def canonicalize_half_turns(half_turns: type_alias.TParamVal) -> type_alias.TPar
105
107
  if half_turns > 1:
106
108
  half_turns -= 2
107
109
  return half_turns
108
-
109
-
110
- # pylint: enable=function-redefined
cirq/value/angle_test.py CHANGED
@@ -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
@@ -19,7 +21,7 @@ import sympy
19
21
  import cirq
20
22
 
21
23
 
22
- def test_canonicalize_half_turns():
24
+ def test_canonicalize_half_turns() -> None:
23
25
  assert cirq.canonicalize_half_turns(0) == 0
24
26
  assert cirq.canonicalize_half_turns(1) == +1
25
27
  assert cirq.canonicalize_half_turns(-1) == +1
@@ -34,7 +36,7 @@ def test_canonicalize_half_turns():
34
36
  assert cirq.canonicalize_half_turns(sympy.Symbol('a') * 0 + 3) == 1
35
37
 
36
38
 
37
- def test_chosen_angle_to_half_turns():
39
+ def test_chosen_angle_to_half_turns() -> None:
38
40
  assert cirq.chosen_angle_to_half_turns() == 1
39
41
  assert cirq.chosen_angle_to_half_turns(default=0.5) == 0.5
40
42
  assert cirq.chosen_angle_to_half_turns(half_turns=0.25, default=0.75) == 0.25
@@ -54,7 +56,7 @@ def test_chosen_angle_to_half_turns():
54
56
  _ = cirq.chosen_angle_to_half_turns(half_turns=0, rads=0, degs=0)
55
57
 
56
58
 
57
- def test_chosen_angle_to_canonical_half_turns():
59
+ def test_chosen_angle_to_canonical_half_turns() -> None:
58
60
  assert cirq.chosen_angle_to_canonical_half_turns() == 1
59
61
  assert cirq.chosen_angle_to_canonical_half_turns(default=0.5) == 0.5
60
62
  assert cirq.chosen_angle_to_canonical_half_turns(half_turns=0.25, default=0.75) == 0.25