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
@@ -12,9 +12,11 @@
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
18
  import enum
17
- from typing import Dict, List, Mapping, Optional, Sequence, Tuple, TYPE_CHECKING
19
+ from typing import Mapping, Sequence, TYPE_CHECKING
18
20
 
19
21
  from typing_extensions import Self
20
22
 
@@ -45,21 +47,21 @@ class MeasurementType(enum.IntEnum):
45
47
 
46
48
  class ClassicalDataStoreReader(abc.ABC):
47
49
  @abc.abstractmethod
48
- def keys(self) -> Tuple['cirq.MeasurementKey', ...]:
50
+ def keys(self) -> tuple[cirq.MeasurementKey, ...]:
49
51
  """Gets the measurement keys in the order they were stored."""
50
52
 
51
53
  @property
52
54
  @abc.abstractmethod
53
- def records(self) -> Mapping['cirq.MeasurementKey', List[Tuple[int, ...]]]:
55
+ def records(self) -> Mapping[cirq.MeasurementKey, list[tuple[int, ...]]]:
54
56
  """Gets the a mapping from measurement key to measurement records."""
55
57
 
56
58
  @property
57
59
  @abc.abstractmethod
58
- def channel_records(self) -> Mapping['cirq.MeasurementKey', List[int]]:
60
+ def channel_records(self) -> Mapping[cirq.MeasurementKey, list[int]]:
59
61
  """Gets the a mapping from measurement key to channel measurement records."""
60
62
 
61
63
  @abc.abstractmethod
62
- def get_int(self, key: 'cirq.MeasurementKey', index=-1) -> int:
64
+ def get_int(self, key: cirq.MeasurementKey, index=-1) -> int:
63
65
  """Gets the integer corresponding to the measurement.
64
66
 
65
67
  The integer is determined by summing the qubit-dimensional basis value
@@ -81,7 +83,7 @@ class ClassicalDataStoreReader(abc.ABC):
81
83
  """
82
84
 
83
85
  @abc.abstractmethod
84
- def get_digits(self, key: 'cirq.MeasurementKey', index=-1) -> Tuple[int, ...]:
86
+ def get_digits(self, key: cirq.MeasurementKey, index=-1) -> tuple[int, ...]:
85
87
  """Gets the values of the qubits that were measured into this key.
86
88
 
87
89
  For example, if the measurement of qubits [q0, q1] produces [0, 1],
@@ -107,7 +109,7 @@ class ClassicalDataStoreReader(abc.ABC):
107
109
  class ClassicalDataStore(ClassicalDataStoreReader, abc.ABC):
108
110
  @abc.abstractmethod
109
111
  def record_measurement(
110
- self, key: 'cirq.MeasurementKey', measurement: Sequence[int], qubits: Sequence['cirq.Qid']
112
+ self, key: cirq.MeasurementKey, measurement: Sequence[int], qubits: Sequence[cirq.Qid]
111
113
  ):
112
114
  """Records a measurement.
113
115
 
@@ -122,7 +124,7 @@ class ClassicalDataStore(ClassicalDataStoreReader, abc.ABC):
122
124
  """
123
125
 
124
126
  @abc.abstractmethod
125
- def record_channel_measurement(self, key: 'cirq.MeasurementKey', measurement: int):
127
+ def record_channel_measurement(self, key: cirq.MeasurementKey, measurement: int):
126
128
  """Records a channel measurement.
127
129
 
128
130
  Args:
@@ -141,12 +143,10 @@ class ClassicalDataDictionaryStore(ClassicalDataStore):
141
143
  def __init__(
142
144
  self,
143
145
  *,
144
- _records: Optional[Dict['cirq.MeasurementKey', List[Tuple[int, ...]]]] = None,
145
- _measured_qubits: Optional[
146
- Dict['cirq.MeasurementKey', List[Tuple['cirq.Qid', ...]]]
147
- ] = None,
148
- _channel_records: Optional[Dict['cirq.MeasurementKey', List[int]]] = None,
149
- _measurement_types: Optional[Dict['cirq.MeasurementKey', 'cirq.MeasurementType']] = None,
146
+ _records: dict[cirq.MeasurementKey, list[tuple[int, ...]]] | None = None,
147
+ _measured_qubits: dict[cirq.MeasurementKey, list[tuple[cirq.Qid, ...]]] | None = None,
148
+ _channel_records: dict[cirq.MeasurementKey, list[int]] | None = None,
149
+ _measurement_types: dict[cirq.MeasurementKey, cirq.MeasurementType] | None = None,
150
150
  ):
151
151
  """Initializes a `ClassicalDataDictionaryStore` object."""
152
152
  if not _measurement_types:
@@ -165,40 +165,40 @@ class ClassicalDataDictionaryStore(ClassicalDataStore):
165
165
  _measured_qubits = {}
166
166
  if _channel_records is None:
167
167
  _channel_records = {}
168
- self._records: Dict['cirq.MeasurementKey', List[Tuple[int, ...]]] = _records
169
- self._measured_qubits: Dict['cirq.MeasurementKey', List[Tuple['cirq.Qid', ...]]] = (
168
+ self._records: dict[cirq.MeasurementKey, list[tuple[int, ...]]] = _records
169
+ self._measured_qubits: dict[cirq.MeasurementKey, list[tuple[cirq.Qid, ...]]] = (
170
170
  _measured_qubits
171
171
  )
172
- self._channel_records: Dict['cirq.MeasurementKey', List[int]] = _channel_records
173
- self._measurement_types: Dict['cirq.MeasurementKey', 'cirq.MeasurementType'] = (
172
+ self._channel_records: dict[cirq.MeasurementKey, list[int]] = _channel_records
173
+ self._measurement_types: dict[cirq.MeasurementKey, cirq.MeasurementType] = (
174
174
  _measurement_types
175
175
  )
176
176
 
177
177
  @property
178
- def records(self) -> Mapping['cirq.MeasurementKey', List[Tuple[int, ...]]]:
178
+ def records(self) -> Mapping[cirq.MeasurementKey, list[tuple[int, ...]]]:
179
179
  """Gets the a mapping from measurement key to measurement records."""
180
180
  return self._records
181
181
 
182
182
  @property
183
- def channel_records(self) -> Mapping['cirq.MeasurementKey', List[int]]:
183
+ def channel_records(self) -> Mapping[cirq.MeasurementKey, list[int]]:
184
184
  """Gets the a mapping from measurement key to channel measurement records."""
185
185
  return self._channel_records
186
186
 
187
187
  @property
188
- def measured_qubits(self) -> Mapping['cirq.MeasurementKey', List[Tuple['cirq.Qid', ...]]]:
188
+ def measured_qubits(self) -> Mapping[cirq.MeasurementKey, list[tuple[cirq.Qid, ...]]]:
189
189
  """Gets the a mapping from measurement key to the qubits measured."""
190
190
  return self._measured_qubits
191
191
 
192
192
  @property
193
- def measurement_types(self) -> Mapping['cirq.MeasurementKey', 'cirq.MeasurementType']:
193
+ def measurement_types(self) -> Mapping[cirq.MeasurementKey, cirq.MeasurementType]:
194
194
  """Gets the a mapping from measurement key to the measurement type."""
195
195
  return self._measurement_types
196
196
 
197
- def keys(self) -> Tuple['cirq.MeasurementKey', ...]:
197
+ def keys(self) -> tuple[cirq.MeasurementKey, ...]:
198
198
  return tuple(self._measurement_types.keys())
199
199
 
200
200
  def record_measurement(
201
- self, key: 'cirq.MeasurementKey', measurement: Sequence[int], qubits: Sequence['cirq.Qid']
201
+ self, key: cirq.MeasurementKey, measurement: Sequence[int], qubits: Sequence[cirq.Qid]
202
202
  ):
203
203
  if len(measurement) != len(qubits):
204
204
  raise ValueError(f'{len(measurement)} measurements but {len(qubits)} qubits.')
@@ -217,7 +217,7 @@ class ClassicalDataDictionaryStore(ClassicalDataStore):
217
217
  measured_qubits.append(tuple(qubits))
218
218
  self._records[key].append(tuple(measurement))
219
219
 
220
- def record_channel_measurement(self, key: 'cirq.MeasurementKey', measurement: int):
220
+ def record_channel_measurement(self, key: cirq.MeasurementKey, measurement: int):
221
221
  if key not in self._measurement_types:
222
222
  self._measurement_types[key] = MeasurementType.CHANNEL
223
223
  self._channel_records[key] = []
@@ -225,14 +225,14 @@ class ClassicalDataDictionaryStore(ClassicalDataStore):
225
225
  raise ValueError(f"Measurement already logged to key {key}")
226
226
  self._channel_records[key].append(measurement)
227
227
 
228
- def get_digits(self, key: 'cirq.MeasurementKey', index=-1) -> Tuple[int, ...]:
228
+ def get_digits(self, key: cirq.MeasurementKey, index=-1) -> tuple[int, ...]:
229
229
  return (
230
230
  self._records[key][index]
231
231
  if self._measurement_types[key] == MeasurementType.MEASUREMENT
232
232
  else (self._channel_records[key][index],)
233
233
  )
234
234
 
235
- def get_int(self, key: 'cirq.MeasurementKey', index=-1) -> int:
235
+ def get_int(self, key: cirq.MeasurementKey, index=-1) -> int:
236
236
  if key not in self._measurement_types:
237
237
  raise KeyError(f'The measurement key {key} is not in {self._measurement_types}')
238
238
  measurement_type = self._measurement_types[key]
@@ -11,6 +11,9 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import re
15
18
 
16
19
  import pytest
@@ -22,7 +25,7 @@ mkey_c = cirq.MeasurementKey('c')
22
25
  two_qubits = tuple(cirq.LineQubit.range(2))
23
26
 
24
27
 
25
- def test_init():
28
+ def test_init() -> None:
26
29
  cd = cirq.ClassicalDataDictionaryStore()
27
30
  assert cd.records == {}
28
31
  assert cd.keys() == ()
@@ -44,7 +47,7 @@ def test_init():
44
47
  }
45
48
 
46
49
 
47
- def test_record_measurement():
50
+ def test_record_measurement() -> None:
48
51
  cd = cirq.ClassicalDataDictionaryStore()
49
52
  cd.record_measurement(mkey_m, (0, 1), two_qubits)
50
53
  assert cd.records == {mkey_m: [(0, 1)]}
@@ -52,7 +55,7 @@ def test_record_measurement():
52
55
  assert cd.measured_qubits == {mkey_m: [two_qubits]}
53
56
 
54
57
 
55
- def test_record_measurement_errors():
58
+ def test_record_measurement_errors() -> None:
56
59
  cd = cirq.ClassicalDataDictionaryStore()
57
60
  with pytest.raises(ValueError, match='3 measurements but 2 qubits'):
58
61
  cd.record_measurement(mkey_m, (0, 1, 2), two_qubits)
@@ -68,14 +71,14 @@ def test_record_measurement_errors():
68
71
  cd.record_measurement(mkey_m, (1, 0), tuple(cirq.LineQid.range(2, dimension=3)))
69
72
 
70
73
 
71
- def test_record_channel_measurement():
74
+ def test_record_channel_measurement() -> None:
72
75
  cd = cirq.ClassicalDataDictionaryStore()
73
76
  cd.record_channel_measurement(mkey_m, 1)
74
77
  assert cd.channel_records == {mkey_m: [1]}
75
78
  assert cd.keys() == (mkey_m,)
76
79
 
77
80
 
78
- def test_record_channel_measurement_errors():
81
+ def test_record_channel_measurement_errors() -> None:
79
82
  cd = cirq.ClassicalDataDictionaryStore()
80
83
  cd.record_channel_measurement(mkey_m, 1)
81
84
  cd.record_channel_measurement(mkey_m, 1)
@@ -88,7 +91,7 @@ def test_record_channel_measurement_errors():
88
91
  cd.record_channel_measurement(mkey_m, 1)
89
92
 
90
93
 
91
- def test_get_int():
94
+ def test_get_int() -> None:
92
95
  cd = cirq.ClassicalDataDictionaryStore()
93
96
  cd.record_measurement(mkey_m, (0, 1), two_qubits)
94
97
  assert cd.get_int(mkey_m) == 1
@@ -106,7 +109,7 @@ def test_get_int():
106
109
  cd.get_int(mkey_m)
107
110
 
108
111
 
109
- def test_copy():
112
+ def test_copy() -> None:
110
113
  cd = cirq.ClassicalDataDictionaryStore(
111
114
  _records={mkey_m: [(0, 1)]},
112
115
  _measured_qubits={mkey_m: [two_qubits]},
@@ -129,7 +132,7 @@ def test_copy():
129
132
  assert cd1.measurement_types == cd.measurement_types
130
133
 
131
134
 
132
- def test_repr():
135
+ def test_repr() -> None:
133
136
  cd = cirq.ClassicalDataDictionaryStore(
134
137
  _records={mkey_m: [(0, 1)]},
135
138
  _measured_qubits={mkey_m: [two_qubits]},
cirq/value/condition.py CHANGED
@@ -12,9 +12,11 @@
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
18
  import dataclasses
17
- from typing import Any, Dict, FrozenSet, Mapping, Optional, Tuple, TYPE_CHECKING
19
+ from typing import Any, Mapping, TYPE_CHECKING
18
20
 
19
21
  import attrs
20
22
  import sympy
@@ -32,15 +34,15 @@ class Condition(abc.ABC):
32
34
 
33
35
  @property
34
36
  @abc.abstractmethod
35
- def keys(self) -> Tuple['cirq.MeasurementKey', ...]:
37
+ def keys(self) -> tuple[cirq.MeasurementKey, ...]:
36
38
  """Gets the control keys."""
37
39
 
38
40
  @abc.abstractmethod
39
- def replace_key(self, current: 'cirq.MeasurementKey', replacement: 'cirq.MeasurementKey'):
41
+ def replace_key(self, current: cirq.MeasurementKey, replacement: cirq.MeasurementKey):
40
42
  """Replaces the control keys."""
41
43
 
42
44
  @abc.abstractmethod
43
- def resolve(self, classical_data: 'cirq.ClassicalDataStoreReader') -> bool:
45
+ def resolve(self, classical_data: cirq.ClassicalDataStoreReader) -> bool:
44
46
  """Resolves the condition based on the measurements."""
45
47
 
46
48
  @property
@@ -48,24 +50,24 @@ class Condition(abc.ABC):
48
50
  def qasm(self):
49
51
  """Returns the qasm of this condition."""
50
52
 
51
- def _qasm_(self, args: 'cirq.QasmArgs', **kwargs) -> Optional[str]:
53
+ def _qasm_(self, args: cirq.QasmArgs, **kwargs) -> str | None:
52
54
  return self.qasm
53
55
 
54
- def _with_measurement_key_mapping_(self, key_map: Mapping[str, str]) -> 'cirq.Condition':
56
+ def _with_measurement_key_mapping_(self, key_map: Mapping[str, str]) -> cirq.Condition:
55
57
  condition = self
56
58
  for k in self.keys:
57
59
  condition = condition.replace_key(k, mkp.with_measurement_key_mapping(k, key_map))
58
60
  return condition
59
61
 
60
- def _with_key_path_prefix_(self, path: Tuple[str, ...]) -> 'cirq.Condition':
62
+ def _with_key_path_prefix_(self, path: tuple[str, ...]) -> cirq.Condition:
61
63
  condition = self
62
64
  for k in self.keys:
63
65
  condition = condition.replace_key(k, mkp.with_key_path_prefix(k, path))
64
66
  return condition
65
67
 
66
68
  def _with_rescoped_keys_(
67
- self, path: Tuple[str, ...], bindable_keys: FrozenSet['cirq.MeasurementKey']
68
- ) -> 'cirq.Condition':
69
+ self, path: tuple[str, ...], bindable_keys: frozenset[cirq.MeasurementKey]
70
+ ) -> cirq.Condition:
69
71
  condition = self
70
72
  for key in self.keys:
71
73
  for i in range(len(path) + 1):
@@ -85,14 +87,14 @@ class KeyCondition(Condition):
85
87
  time of resolution.
86
88
  """
87
89
 
88
- key: 'cirq.MeasurementKey'
90
+ key: cirq.MeasurementKey
89
91
  index: int = -1
90
92
 
91
93
  @property
92
94
  def keys(self):
93
95
  return (self.key,)
94
96
 
95
- def replace_key(self, current: 'cirq.MeasurementKey', replacement: 'cirq.MeasurementKey'):
97
+ def replace_key(self, current: cirq.MeasurementKey, replacement: cirq.MeasurementKey):
96
98
  return KeyCondition(replacement) if self.key == current else self
97
99
 
98
100
  def __str__(self):
@@ -103,7 +105,7 @@ class KeyCondition(Condition):
103
105
  return f'cirq.KeyCondition({self.key!r}, {self.index})'
104
106
  return f'cirq.KeyCondition({self.key!r})'
105
107
 
106
- def resolve(self, classical_data: 'cirq.ClassicalDataStoreReader') -> bool:
108
+ def resolve(self, classical_data: cirq.ClassicalDataStoreReader) -> bool:
107
109
  if self.key not in classical_data.keys():
108
110
  raise ValueError(f'Measurement key {self.key} missing when testing classical control')
109
111
  return classical_data.get_int(self.key, self.index) != 0
@@ -119,7 +121,7 @@ class KeyCondition(Condition):
119
121
  def qasm(self):
120
122
  raise ValueError('QASM is defined only for SympyConditions of type key == constant.')
121
123
 
122
- def _qasm_(self, args: 'cirq.QasmArgs', **kwargs) -> Optional[str]:
124
+ def _qasm_(self, args: cirq.QasmArgs, **kwargs) -> str | None:
123
125
  args.validate_version('2.0', '3.0')
124
126
  key_str = str(self.key)
125
127
  if key_str not in args.meas_key_id_map:
@@ -162,7 +164,7 @@ class BitMaskKeyCondition(Condition):
162
164
  - bitmask: Optional bitmask to apply before doing the comparison.
163
165
  """
164
166
 
165
- key: 'cirq.MeasurementKey' = attrs.field(
167
+ key: cirq.MeasurementKey = attrs.field(
166
168
  converter=lambda x: (
167
169
  x
168
170
  if isinstance(x, measurement_key.MeasurementKey)
@@ -172,7 +174,7 @@ class BitMaskKeyCondition(Condition):
172
174
  index: int = -1
173
175
  target_value: int = 0
174
176
  equal_target: bool = False
175
- bitmask: Optional[int] = None
177
+ bitmask: int | None = None
176
178
 
177
179
  @property
178
180
  def keys(self):
@@ -180,8 +182,8 @@ class BitMaskKeyCondition(Condition):
180
182
 
181
183
  @staticmethod
182
184
  def create_equal_mask(
183
- key: 'cirq.MeasurementKey', bitmask: int, *, index: int = -1
184
- ) -> 'BitMaskKeyCondition':
185
+ key: cirq.MeasurementKey, bitmask: int, *, index: int = -1
186
+ ) -> BitMaskKeyCondition:
185
187
  """Creates a condition that evaluates (meas & bitmask) == bitmask."""
186
188
  return BitMaskKeyCondition(
187
189
  key, index, target_value=bitmask, equal_target=True, bitmask=bitmask
@@ -189,14 +191,14 @@ class BitMaskKeyCondition(Condition):
189
191
 
190
192
  @staticmethod
191
193
  def create_not_equal_mask(
192
- key: 'cirq.MeasurementKey', bitmask: int, *, index: int = -1
193
- ) -> 'BitMaskKeyCondition':
194
+ key: cirq.MeasurementKey, bitmask: int, *, index: int = -1
195
+ ) -> BitMaskKeyCondition:
194
196
  """Creates a condition that evaluates (meas & bitmask) != bitmask."""
195
197
  return BitMaskKeyCondition(
196
198
  key, index, target_value=bitmask, equal_target=False, bitmask=bitmask
197
199
  )
198
200
 
199
- def replace_key(self, current: 'cirq.MeasurementKey', replacement: 'cirq.MeasurementKey'):
201
+ def replace_key(self, current: cirq.MeasurementKey, replacement: cirq.MeasurementKey):
200
202
  return BitMaskKeyCondition(replacement) if self.key == current else self
201
203
 
202
204
  def __str__(self):
@@ -218,7 +220,7 @@ class BitMaskKeyCondition(Condition):
218
220
  parameters = ', '.join(f'{f.name}={repr(values[f.name])}' for f in attrs.fields(type(self)))
219
221
  return f'cirq.BitMaskKeyCondition({parameters})'
220
222
 
221
- def resolve(self, classical_data: 'cirq.ClassicalDataStoreReader') -> bool:
223
+ def resolve(self, classical_data: cirq.ClassicalDataStoreReader) -> bool:
222
224
  if self.key not in classical_data.keys():
223
225
  raise ValueError(f'Measurement key {self.key} missing when testing classical control')
224
226
  value = classical_data.get_int(self.key, self.index)
@@ -269,7 +271,7 @@ class SympyCondition(Condition):
269
271
  # keep the former here.
270
272
  )
271
273
 
272
- def replace_key(self, current: 'cirq.MeasurementKey', replacement: 'cirq.MeasurementKey'):
274
+ def replace_key(self, current: cirq.MeasurementKey, replacement: cirq.MeasurementKey):
273
275
  return SympyCondition(self.expr.subs({str(current): sympy.Symbol(str(replacement))}))
274
276
 
275
277
  def __str__(self):
@@ -278,12 +280,12 @@ class SympyCondition(Condition):
278
280
  def __repr__(self):
279
281
  return f'cirq.SympyCondition({proper_repr(self.expr)})'
280
282
 
281
- def resolve(self, classical_data: 'cirq.ClassicalDataStoreReader') -> bool:
283
+ def resolve(self, classical_data: cirq.ClassicalDataStoreReader) -> bool:
282
284
  missing = [str(k) for k in self.keys if k not in classical_data.keys()]
283
285
  if missing:
284
286
  raise ValueError(f'Measurement keys {missing} missing when testing classical control')
285
287
 
286
- replacements: Dict[str, Any] = {}
288
+ replacements: dict[str, Any] = {}
287
289
  for symbol in self.expr.free_symbols:
288
290
  if isinstance(symbol, sympy.Symbol):
289
291
  name = symbol.name
@@ -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 re
16
18
 
17
19
  import pytest
cirq/value/digits.py CHANGED
@@ -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 Any, Iterable, List, Optional, overload, Union
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Iterable, overload
16
18
 
17
19
 
18
20
  def big_endian_bits_to_int(bits: Iterable[Any]) -> int:
@@ -46,7 +48,7 @@ def big_endian_bits_to_int(bits: Iterable[Any]) -> int:
46
48
  return result
47
49
 
48
50
 
49
- def big_endian_int_to_bits(val: int, *, bit_count: int) -> List[int]:
51
+ def big_endian_int_to_bits(val: int, *, bit_count: int) -> list[int]:
50
52
  """Returns the big-endian bits of an integer.
51
53
 
52
54
  Args:
@@ -72,7 +74,7 @@ def big_endian_int_to_bits(val: int, *, bit_count: int) -> List[int]:
72
74
  return [(val >> i) & 1 for i in range(bit_count)[::-1]]
73
75
 
74
76
 
75
- def big_endian_digits_to_int(digits: Iterable[int], *, base: Union[int, Iterable[int]]) -> int:
77
+ def big_endian_digits_to_int(digits: Iterable[int], *, base: int | Iterable[int]) -> int:
76
78
  """Returns the big-endian integer specified by the given digits and base.
77
79
 
78
80
  Args:
@@ -118,20 +120,24 @@ def big_endian_digits_to_int(digits: Iterable[int], *, base: Union[int, Iterable
118
120
  return result
119
121
 
120
122
 
121
- # pylint: disable=function-redefined
122
123
  @overload
123
- def big_endian_int_to_digits(val: int, *, digit_count: int, base: int) -> List[int]:
124
+ def big_endian_int_to_digits(val: int, *, digit_count: int, base: int) -> list[int]:
124
125
  pass
125
126
 
126
127
 
127
128
  @overload
128
- def big_endian_int_to_digits(val: int, *, base: Iterable[int]) -> List[int]:
129
+ def big_endian_int_to_digits(val: int, *, digit_count: int, base: Iterable[int]) -> list[int]:
130
+ pass
131
+
132
+
133
+ @overload
134
+ def big_endian_int_to_digits(val: int, *, base: Iterable[int]) -> list[int]:
129
135
  pass
130
136
 
131
137
 
132
138
  def big_endian_int_to_digits(
133
- val: int, *, digit_count: Optional[int] = None, base: Union[int, Iterable[int]]
134
- ) -> List[int]:
139
+ val: int, *, digit_count: int | None = None, base: int | Iterable[int]
140
+ ) -> list[int]:
135
141
  """Separates an integer into big-endian digits.
136
142
 
137
143
  Args:
@@ -187,6 +193,3 @@ def big_endian_int_to_digits(
187
193
  )
188
194
 
189
195
  return result[::-1]
190
-
191
-
192
- # pylint: enable=function-redefined
cirq/value/digits_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 pytest
16
18
 
17
19
  import cirq
cirq/value/duration.py CHANGED
@@ -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
  """A typed time delta that supports picosecond accuracy."""
15
16
 
17
+ from __future__ import annotations
18
+
16
19
  import datetime
17
- from typing import AbstractSet, Any, Dict, List, Optional, Tuple, TYPE_CHECKING, Union
20
+ from typing import AbstractSet, Any, TYPE_CHECKING, TypeAlias, Union
18
21
 
19
22
  import numpy as np
20
23
  import sympy
@@ -42,8 +45,8 @@ document(
42
45
  )
43
46
 
44
47
 
45
- _NUMERIC_INPUT_TYPE = Union[int, float, sympy.Expr, np.number]
46
- _NUMERIC_OUTPUT_TYPE = Union[int, float, sympy.Expr]
48
+ _NUMERIC_INPUT_TYPE: TypeAlias = int | float | sympy.Expr | np.number
49
+ _NUMERIC_OUTPUT_TYPE: TypeAlias = int | float | sympy.Expr
47
50
 
48
51
 
49
52
  class Duration:
@@ -51,7 +54,7 @@ class Duration:
51
54
 
52
55
  def __init__(
53
56
  self,
54
- value: DURATION_LIKE = None,
57
+ value: DURATION_LIKE | int = None,
55
58
  *, # Force keyword args.
56
59
  picos: _NUMERIC_INPUT_TYPE = 0,
57
60
  nanos: _NUMERIC_INPUT_TYPE = 0,
@@ -79,7 +82,7 @@ class Duration:
79
82
  >>> print(cirq.Duration(micros=1.5 * sympy.Symbol('t')))
80
83
  (1500.0*t) ns
81
84
  """
82
- self._time_vals: List[_NUMERIC_INPUT_TYPE] = [0, 0, 0, 0]
85
+ self._time_vals: list[_NUMERIC_INPUT_TYPE] = [0, 0, 0, 0]
83
86
  self._multipliers = [1, 1000, 1000_000, 1000_000_000]
84
87
  if value is not None and value != 0:
85
88
  if isinstance(value, datetime.timedelta):
@@ -98,7 +101,7 @@ class Duration:
98
101
  def _parameter_names_(self) -> AbstractSet[str]:
99
102
  return protocols.parameter_names(self._time_vals)
100
103
 
101
- def _resolve_parameters_(self, resolver: 'cirq.ParamResolver', recursive: bool) -> 'Duration':
104
+ def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> Duration:
102
105
  return _duration_from_time_vals(
103
106
  protocols.resolve_parameters(self._time_vals, resolver, recursive)
104
107
  )
@@ -121,16 +124,16 @@ class Duration:
121
124
  """Returns the number of milliseconds that the duration spans."""
122
125
  return self.total_picos() / 1000_000_000
123
126
 
124
- def __add__(self, other) -> 'Duration':
127
+ def __add__(self, other) -> Duration:
125
128
  other = _attempt_duration_like_to_duration(other)
126
129
  if other is None:
127
130
  return NotImplemented
128
131
  return _duration_from_time_vals(_add_time_vals(self._time_vals, other._time_vals))
129
132
 
130
- def __radd__(self, other) -> 'Duration':
133
+ def __radd__(self, other) -> Duration:
131
134
  return self.__add__(other)
132
135
 
133
- def __sub__(self, other) -> 'Duration':
136
+ def __sub__(self, other) -> Duration:
134
137
  other = _attempt_duration_like_to_duration(other)
135
138
  if other is None:
136
139
  return NotImplemented
@@ -138,7 +141,7 @@ class Duration:
138
141
  _add_time_vals(self._time_vals, [-x for x in other._time_vals])
139
142
  )
140
143
 
141
- def __rsub__(self, other) -> 'Duration':
144
+ def __rsub__(self, other) -> Duration:
142
145
  other = _attempt_duration_like_to_duration(other)
143
146
  if other is None:
144
147
  return NotImplemented
@@ -146,17 +149,17 @@ class Duration:
146
149
  _add_time_vals(other._time_vals, [-x for x in self._time_vals])
147
150
  )
148
151
 
149
- def __mul__(self, other) -> 'Duration':
152
+ def __mul__(self, other) -> Duration:
150
153
  if not isinstance(other, (int, float, sympy.Expr)):
151
154
  return NotImplemented
152
155
  if other == 0:
153
156
  return _duration_from_time_vals([0] * 4)
154
157
  return _duration_from_time_vals([x * other for x in self._time_vals])
155
158
 
156
- def __rmul__(self, other) -> 'Duration':
159
+ def __rmul__(self, other) -> Duration:
157
160
  return self.__mul__(other)
158
161
 
159
- def __truediv__(self, other) -> Union['Duration', float]:
162
+ def __truediv__(self, other) -> Duration | float:
160
163
  if isinstance(other, (int, float, sympy.Expr)):
161
164
  new_time_vals = [x / other for x in self._time_vals]
162
165
  return _duration_from_time_vals(new_time_vals)
@@ -211,7 +214,7 @@ class Duration:
211
214
  return hash(datetime.timedelta(microseconds=self.total_picos() / 1000000))
212
215
  return hash((Duration, self.total_picos()))
213
216
 
214
- def _decompose_into_amount_unit_suffix(self) -> Tuple[int, str, str]:
217
+ def _decompose_into_amount_unit_suffix(self) -> tuple[int, str, str]:
215
218
  picos = self.total_picos()
216
219
  if (
217
220
  isinstance(picos, sympy.Mul)
@@ -258,11 +261,11 @@ class Duration:
258
261
  amount, unit, _ = self._decompose_into_amount_unit_suffix()
259
262
  return f'cirq.Duration({unit}={proper_repr(amount)})'
260
263
 
261
- def _json_dict_(self) -> Dict[str, Any]:
264
+ def _json_dict_(self) -> dict[str, Any]:
262
265
  return {'picos': self.total_picos()}
263
266
 
264
267
 
265
- def _attempt_duration_like_to_duration(value: Any) -> Optional[Duration]:
268
+ def _attempt_duration_like_to_duration(value: Any) -> Duration | None:
266
269
  if isinstance(value, Duration):
267
270
  return value
268
271
  if isinstance(value, datetime.timedelta):
@@ -273,9 +276,9 @@ def _attempt_duration_like_to_duration(value: Any) -> Optional[Duration]:
273
276
 
274
277
 
275
278
  def _add_time_vals(
276
- val1: List[_NUMERIC_INPUT_TYPE], val2: List[_NUMERIC_INPUT_TYPE]
277
- ) -> List[_NUMERIC_INPUT_TYPE]:
278
- ret: List[_NUMERIC_INPUT_TYPE] = []
279
+ val1: list[_NUMERIC_INPUT_TYPE], val2: list[_NUMERIC_INPUT_TYPE]
280
+ ) -> list[_NUMERIC_INPUT_TYPE]:
281
+ ret: list[_NUMERIC_INPUT_TYPE] = []
279
282
  for i in range(4):
280
283
  if val1[i] and val2[i]:
281
284
  ret.append(val1[i] + val2[i])
@@ -284,7 +287,7 @@ def _add_time_vals(
284
287
  return ret
285
288
 
286
289
 
287
- def _duration_from_time_vals(time_vals: List[_NUMERIC_INPUT_TYPE]):
290
+ def _duration_from_time_vals(time_vals: list[_NUMERIC_INPUT_TYPE]):
288
291
  ret = Duration()
289
292
  ret._time_vals = time_vals
290
293
  return ret
@@ -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
  from datetime import timedelta
16
18
 
17
19
  import numpy as np