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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/ops/measure_util.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 Callable, Dict, Iterable, List, Optional, overload, Tuple, TYPE_CHECKING, Union
15
+ from __future__ import annotations
16
+
17
+ from typing import Callable, Iterable, overload, TYPE_CHECKING
16
18
 
17
19
  import numpy as np
18
20
 
@@ -30,8 +32,7 @@ def _default_measurement_key(qubits: Iterable[raw_types.Qid]) -> str:
30
32
 
31
33
 
32
34
  def measure_single_paulistring(
33
- pauli_observable: pauli_string.PauliString,
34
- key: Optional[Union[str, 'cirq.MeasurementKey']] = None,
35
+ pauli_observable: pauli_string.PauliString, key: str | cirq.MeasurementKey | None = None
35
36
  ) -> raw_types.Operation:
36
37
  """Returns a single PauliMeasurementGate which measures the pauli observable
37
38
 
@@ -66,7 +67,7 @@ def measure_single_paulistring(
66
67
 
67
68
  def measure_paulistring_terms(
68
69
  pauli_basis: pauli_string.PauliString, key_func: Callable[[raw_types.Qid], str] = str
69
- ) -> List[raw_types.Operation]:
70
+ ) -> list[raw_types.Operation]:
70
71
  """Returns a list of operations individually measuring qubits in the pauli basis.
71
72
 
72
73
  Args:
@@ -89,14 +90,11 @@ def measure_paulistring_terms(
89
90
  return [PauliMeasurementGate([pauli_basis[q]], key=key_func(q)).on(q) for q in pauli_basis]
90
91
 
91
92
 
92
- # pylint: disable=function-redefined
93
-
94
-
95
93
  @overload
96
94
  def measure(
97
95
  *target: raw_types.Qid,
98
- key: Optional[Union[str, 'cirq.MeasurementKey']] = None,
99
- invert_mask: Tuple[bool, ...] = (),
96
+ key: str | cirq.MeasurementKey | None = None,
97
+ invert_mask: tuple[bool, ...] = (),
100
98
  ) -> raw_types.Operation:
101
99
  pass
102
100
 
@@ -105,17 +103,17 @@ def measure(
105
103
  def measure(
106
104
  __target: Iterable[raw_types.Qid],
107
105
  *,
108
- key: Optional[Union[str, 'cirq.MeasurementKey']] = None,
109
- invert_mask: Tuple[bool, ...] = (),
106
+ key: str | cirq.MeasurementKey | None = None,
107
+ invert_mask: tuple[bool, ...] = (),
110
108
  ) -> raw_types.Operation:
111
109
  pass
112
110
 
113
111
 
114
112
  def measure(
115
113
  *target,
116
- key: Optional[Union[str, 'cirq.MeasurementKey']] = None,
117
- invert_mask: Tuple[bool, ...] = (),
118
- confusion_map: Optional[Dict[Tuple[int, ...], np.ndarray]] = None,
114
+ key: str | cirq.MeasurementKey | None = None,
115
+ invert_mask: tuple[bool, ...] = (),
116
+ confusion_map: dict[tuple[int, ...], np.ndarray] | None = None,
119
117
  ) -> raw_types.Operation:
120
118
  """Returns a single MeasurementGate applied to all the given qubits.
121
119
 
@@ -170,20 +168,20 @@ M = measure
170
168
  @overload
171
169
  def measure_each(
172
170
  *qubits: raw_types.Qid, key_func: Callable[[raw_types.Qid], str] = str
173
- ) -> List[raw_types.Operation]:
171
+ ) -> list[raw_types.Operation]:
174
172
  pass
175
173
 
176
174
 
177
175
  @overload
178
176
  def measure_each(
179
177
  __qubits: Iterable[raw_types.Qid], *, key_func: Callable[[raw_types.Qid], str] = str
180
- ) -> List[raw_types.Operation]:
178
+ ) -> list[raw_types.Operation]:
181
179
  pass
182
180
 
183
181
 
184
182
  def measure_each(
185
183
  *qubits, key_func: Callable[[raw_types.Qid], str] = str
186
- ) -> List[raw_types.Operation]:
184
+ ) -> list[raw_types.Operation]:
187
185
  """Returns a list of operations individually measuring the given qubits.
188
186
 
189
187
  The qubits are measured in the computational basis.
@@ -204,6 +202,3 @@ def measure_each(
204
202
  )
205
203
  qubitsequence = qubits[0] if one_iterable_arg else qubits
206
204
  return [MeasurementGate(1, key_func(q), qid_shape=(q.dimension,)).on(q) for q in qubitsequence]
207
-
208
-
209
- # pylint: enable=function-redefined
@@ -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
 
@@ -12,18 +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 (
16
- Any,
17
- Dict,
18
- FrozenSet,
19
- Iterable,
20
- Mapping,
21
- Optional,
22
- Sequence,
23
- Tuple,
24
- TYPE_CHECKING,
25
- Union,
26
- )
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Iterable, Mapping, Sequence, TYPE_CHECKING
27
18
 
28
19
  import numpy as np
29
20
 
@@ -47,11 +38,11 @@ class MeasurementGate(raw_types.Gate):
47
38
 
48
39
  def __init__(
49
40
  self,
50
- num_qubits: Optional[int] = None,
51
- key: Union[str, 'cirq.MeasurementKey'] = '',
52
- invert_mask: Tuple[bool, ...] = (),
53
- qid_shape: Optional[Tuple[int, ...]] = None,
54
- confusion_map: Optional[Dict[Tuple[int, ...], np.ndarray]] = None,
41
+ num_qubits: int | None = None,
42
+ key: str | cirq.MeasurementKey = '',
43
+ invert_mask: tuple[bool, ...] = (),
44
+ qid_shape: tuple[int, ...] | None = None,
45
+ confusion_map: dict[tuple[int, ...], np.ndarray] | None = None,
55
46
  ) -> None:
56
47
  """Inits MeasurementGate.
57
48
 
@@ -100,24 +91,24 @@ class MeasurementGate(raw_types.Gate):
100
91
  return str(self.mkey)
101
92
 
102
93
  @property
103
- def mkey(self) -> 'cirq.MeasurementKey':
94
+ def mkey(self) -> cirq.MeasurementKey:
104
95
  return self._mkey
105
96
 
106
97
  @property
107
- def invert_mask(self) -> Tuple[bool, ...]:
98
+ def invert_mask(self) -> tuple[bool, ...]:
108
99
  return self._invert_mask
109
100
 
110
101
  @property
111
- def confusion_map(self) -> Dict[Tuple[int, ...], np.ndarray]:
102
+ def confusion_map(self) -> dict[tuple[int, ...], np.ndarray]:
112
103
  return self._confusion_map
113
104
 
114
- def _qid_shape_(self) -> Tuple[int, ...]:
105
+ def _qid_shape_(self) -> tuple[int, ...]:
115
106
  return self._qid_shape
116
107
 
117
108
  def _has_unitary_(self) -> bool:
118
109
  return False
119
110
 
120
- def with_key(self, key: Union[str, 'cirq.MeasurementKey']) -> 'MeasurementGate':
111
+ def with_key(self, key: str | cirq.MeasurementKey) -> MeasurementGate:
121
112
  """Creates a measurement gate with a new key but otherwise identical."""
122
113
  if key == self.key:
123
114
  return self
@@ -129,21 +120,21 @@ class MeasurementGate(raw_types.Gate):
129
120
  confusion_map=self.confusion_map,
130
121
  )
131
122
 
132
- def _with_key_path_(self, path: Tuple[str, ...]):
123
+ def _with_key_path_(self, path: tuple[str, ...]):
133
124
  return self.with_key(self.mkey._with_key_path_(path))
134
125
 
135
- def _with_key_path_prefix_(self, prefix: Tuple[str, ...]):
126
+ def _with_key_path_prefix_(self, prefix: tuple[str, ...]):
136
127
  return self.with_key(self.mkey._with_key_path_prefix_(prefix))
137
128
 
138
129
  def _with_rescoped_keys_(
139
- self, path: Tuple[str, ...], bindable_keys: FrozenSet['cirq.MeasurementKey']
130
+ self, path: tuple[str, ...], bindable_keys: frozenset[cirq.MeasurementKey]
140
131
  ):
141
132
  return self.with_key(protocols.with_rescoped_keys(self.mkey, path, bindable_keys))
142
133
 
143
134
  def _with_measurement_key_mapping_(self, key_map: Mapping[str, str]):
144
135
  return self.with_key(protocols.with_measurement_key_mapping(self.mkey, key_map))
145
136
 
146
- def with_bits_flipped(self, *bit_positions: int) -> 'MeasurementGate':
137
+ def with_bits_flipped(self, *bit_positions: int) -> MeasurementGate:
147
138
  """Toggles whether or not the measurement inverts various outputs.
148
139
 
149
140
  This only affects the invert_mask, which is applied after confusion
@@ -162,7 +153,7 @@ class MeasurementGate(raw_types.Gate):
162
153
  confusion_map=self.confusion_map,
163
154
  )
164
155
 
165
- def full_invert_mask(self) -> Tuple[bool, ...]:
156
+ def full_invert_mask(self) -> tuple[bool, ...]:
166
157
  """Returns the invert mask for all qubits.
167
158
 
168
159
  If the user supplies a partial invert_mask, this returns that mask
@@ -182,7 +173,7 @@ class MeasurementGate(raw_types.Gate):
182
173
  def _measurement_key_name_(self) -> str:
183
174
  return self.key
184
175
 
185
- def _measurement_key_obj_(self) -> 'cirq.MeasurementKey':
176
+ def _measurement_key_obj_(self) -> cirq.MeasurementKey:
186
177
  return self.mkey
187
178
 
188
179
  def _kraus_(self):
@@ -198,9 +189,7 @@ class MeasurementGate(raw_types.Gate):
198
189
  def _has_kraus_(self):
199
190
  return True
200
191
 
201
- def _circuit_diagram_info_(
202
- self, args: 'cirq.CircuitDiagramInfoArgs'
203
- ) -> 'cirq.CircuitDiagramInfo':
192
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
204
193
  symbols = ['M'] * self.num_qubits()
205
194
  flipped_indices = {i for i, x in enumerate(self.full_invert_mask()) if x}
206
195
  confused_indices = {x for idxs in self.confusion_map for x in idxs}
@@ -224,7 +213,7 @@ class MeasurementGate(raw_types.Gate):
224
213
 
225
214
  return protocols.CircuitDiagramInfo(symbols)
226
215
 
227
- def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
216
+ def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
228
217
  if self.confusion_map or not all(d == 2 for d in self._qid_shape):
229
218
  return NotImplemented
230
219
  args.validate_version('2.0', '3.0')
@@ -243,7 +232,7 @@ class MeasurementGate(raw_types.Gate):
243
232
  lines.append(args.format('x {0}; // Undo the inversion\n', qubit))
244
233
  return ''.join(lines)
245
234
 
246
- def _op_repr_(self, qubits: Sequence['cirq.Qid']) -> str:
235
+ def _op_repr_(self, qubits: Sequence[cirq.Qid]) -> str:
247
236
  args = list(repr(q) for q in qubits)
248
237
  if self.key != _default_measurement_key(qubits):
249
238
  args.append(f'key={self.mkey!r}')
@@ -275,8 +264,8 @@ class MeasurementGate(raw_types.Gate):
275
264
  )
276
265
  return self.key, self.full_invert_mask(), self._qid_shape, hashable_cmap
277
266
 
278
- def _json_dict_(self) -> Dict[str, Any]:
279
- other: Dict[str, Any] = {}
267
+ def _json_dict_(self) -> dict[str, Any]:
268
+ other: dict[str, Any] = {}
280
269
  if not all(d == 2 for d in self._qid_shape):
281
270
  other['qid_shape'] = self._qid_shape
282
271
  if self.confusion_map:
@@ -301,10 +290,10 @@ class MeasurementGate(raw_types.Gate):
301
290
  confusion_map={tuple(k): np.array(v) for k, v in confusion_map or []},
302
291
  )
303
292
 
304
- def _has_stabilizer_effect_(self) -> Optional[bool]:
293
+ def _has_stabilizer_effect_(self) -> bool | None:
305
294
  return True
306
295
 
307
- def _act_on_(self, sim_state: 'cirq.SimulationStateBase', qubits: Sequence['cirq.Qid']) -> bool:
296
+ def _act_on_(self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]) -> bool:
308
297
  from cirq.sim import SimulationState
309
298
 
310
299
  if not isinstance(sim_state, SimulationState):
@@ -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 typing import cast
16
18
 
17
19
  import numpy as np
@@ -1,5 +1,8 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
- from typing import Any, Dict, FrozenSet, Iterable, Mapping, Tuple, TYPE_CHECKING, Union
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Iterable, Mapping, TYPE_CHECKING
3
6
 
4
7
  import numpy as np
5
8
 
@@ -27,8 +30,8 @@ class MixedUnitaryChannel(raw_types.Gate):
27
30
 
28
31
  def __init__(
29
32
  self,
30
- mixture: Iterable[Tuple[float, np.ndarray]],
31
- key: Union[str, 'cirq.MeasurementKey', None] = None,
33
+ mixture: Iterable[tuple[float, np.ndarray]],
34
+ key: str | cirq.MeasurementKey | None = None,
32
35
  validate: bool = False,
33
36
  ):
34
37
  mixture = list(mixture)
@@ -58,7 +61,7 @@ class MixedUnitaryChannel(raw_types.Gate):
58
61
 
59
62
  @staticmethod
60
63
  def from_mixture(
61
- mixture: 'protocols.SupportsMixture', key: Union[str, 'cirq.MeasurementKey', None] = None
64
+ mixture: protocols.SupportsMixture, key: str | cirq.MeasurementKey | None = None
62
65
  ):
63
66
  """Creates a copy of a mixture with the given measurement key."""
64
67
  return MixedUnitaryChannel(mixture=list(protocols.mixture(mixture)), key=key)
@@ -85,7 +88,7 @@ class MixedUnitaryChannel(raw_types.Gate):
85
88
  return NotImplemented
86
89
  return str(self._key)
87
90
 
88
- def _measurement_key_obj_(self) -> 'cirq.MeasurementKey':
91
+ def _measurement_key_obj_(self) -> cirq.MeasurementKey:
89
92
  if self._key is None:
90
93
  return NotImplemented
91
94
  return self._key
@@ -97,18 +100,18 @@ class MixedUnitaryChannel(raw_types.Gate):
97
100
  return self
98
101
  return MixedUnitaryChannel(mixture=self._mixture, key=key_map[str(self._key)])
99
102
 
100
- def _with_key_path_(self, path: Tuple[str, ...]):
103
+ def _with_key_path_(self, path: tuple[str, ...]):
101
104
  return MixedUnitaryChannel(
102
105
  mixture=self._mixture, key=protocols.with_key_path(self._key, path)
103
106
  )
104
107
 
105
- def _with_key_path_prefix_(self, prefix: Tuple[str, ...]):
108
+ def _with_key_path_prefix_(self, prefix: tuple[str, ...]):
106
109
  return MixedUnitaryChannel(
107
110
  mixture=self._mixture, key=protocols.with_key_path_prefix(self._key, prefix)
108
111
  )
109
112
 
110
113
  def _with_rescoped_keys_(
111
- self, path: Tuple[str, ...], bindable_keys: FrozenSet['cirq.MeasurementKey']
114
+ self, path: tuple[str, ...], bindable_keys: frozenset[cirq.MeasurementKey]
112
115
  ):
113
116
  return MixedUnitaryChannel(
114
117
  mixture=self._mixture, key=protocols.with_rescoped_keys(self._key, path, bindable_keys)
@@ -128,7 +131,7 @@ class MixedUnitaryChannel(raw_types.Gate):
128
131
  args.append(f'key=\'{self._key}\'')
129
132
  return f'cirq.MixedUnitaryChannel({", ".join(args)})'
130
133
 
131
- def _json_dict_(self) -> Dict[str, Any]:
134
+ def _json_dict_(self) -> dict[str, Any]:
132
135
  return protocols.obj_to_dict_helper(self, ['_mixture', '_key'])
133
136
 
134
137
  @classmethod
@@ -1,11 +1,14 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import numpy as np
3
6
  import pytest
4
7
 
5
8
  import cirq
6
9
 
7
10
 
8
- def test_matrix_mixture_from_mixture():
11
+ def test_matrix_mixture_from_mixture() -> None:
9
12
  q0 = cirq.LineQubit(0)
10
13
  dp = cirq.depolarize(0.1)
11
14
  mm = cirq.MixedUnitaryChannel.from_mixture(dp, key='dp')
@@ -22,7 +25,7 @@ def test_matrix_mixture_from_mixture():
22
25
  assert results.measurements['dp'] in range(4)
23
26
 
24
27
 
25
- def test_matrix_mixture_equality():
28
+ def test_matrix_mixture_equality() -> None:
26
29
  dp_pt1 = cirq.depolarize(0.1)
27
30
  dp_pt2 = cirq.depolarize(0.2)
28
31
  mm_a1 = cirq.MixedUnitaryChannel.from_mixture(dp_pt1, key='a')
@@ -45,7 +48,7 @@ def test_matrix_mixture_equality():
45
48
  assert half_flip != half_flip_inv
46
49
 
47
50
 
48
- def test_matrix_mixture_remap_keys():
51
+ def test_matrix_mixture_remap_keys() -> None:
49
52
  dp = cirq.depolarize(0.1)
50
53
  mm = cirq.MixedUnitaryChannel.from_mixture(dp)
51
54
  with pytest.raises(TypeError):
@@ -63,7 +66,7 @@ def test_matrix_mixture_remap_keys():
63
66
  assert cirq.with_measurement_key_mapping(mm_a, {'a': 'b'}) == mm_b
64
67
 
65
68
 
66
- def test_matrix_mixture_from_unitaries():
69
+ def test_matrix_mixture_from_unitaries() -> None:
67
70
  q0 = cirq.LineQubit(0)
68
71
  mix = [(0.5, np.array([[1, 0], [0, 1]])), (0.5, np.array([[0, 1], [1, 0]]))]
69
72
  half_flip = cirq.MixedUnitaryChannel(mix, key='flip')
@@ -77,7 +80,7 @@ def test_matrix_mixture_from_unitaries():
77
80
  assert results.measurements['flip'] == results.measurements['m']
78
81
 
79
82
 
80
- def test_matrix_mixture_str():
83
+ def test_matrix_mixture_str() -> None:
81
84
  mix = [(0.5, np.array([[1, 0], [0, 1]])), (0.5, np.array([[0, 1], [1, 0]]))]
82
85
  half_flip = cirq.MixedUnitaryChannel(mix)
83
86
  assert (
@@ -95,7 +98,7 @@ def test_matrix_mixture_str():
95
98
  )
96
99
 
97
100
 
98
- def test_matrix_mixture_repr():
101
+ def test_matrix_mixture_repr() -> None:
99
102
  mix = [
100
103
  (0.5, np.array([[1, 0], [0, 1]], dtype=np.dtype('complex64'))),
101
104
  (0.5, np.array([[0, 1], [1, 0]], dtype=np.dtype('complex64'))),
@@ -111,19 +114,19 @@ key='flip')"""
111
114
  )
112
115
 
113
116
 
114
- def test_mix_no_unitaries_fails():
117
+ def test_mix_no_unitaries_fails() -> None:
115
118
  with pytest.raises(ValueError, match='must have at least one unitary'):
116
119
  _ = cirq.MixedUnitaryChannel(mixture=[], key='m')
117
120
 
118
121
 
119
- def test_mix_bad_prob_fails():
122
+ def test_mix_bad_prob_fails() -> None:
120
123
  mix = [(0.5, np.array([[1, 0], [0, 0]]))]
121
124
 
122
125
  with pytest.raises(ValueError, match='Unitary probabilities must sum to 1'):
123
126
  _ = cirq.MixedUnitaryChannel(mixture=mix, key='m')
124
127
 
125
128
 
126
- def test_mix_mismatch_fails():
129
+ def test_mix_mismatch_fails() -> None:
127
130
  op2 = np.zeros((4, 4))
128
131
  op2[1][1] = 1
129
132
  mix = [(0.5, np.array([[1, 0], [0, 0]])), (0.5, op2)]
@@ -132,14 +135,14 @@ def test_mix_mismatch_fails():
132
135
  _ = cirq.MixedUnitaryChannel(mixture=mix, key='m')
133
136
 
134
137
 
135
- def test_nonqubit_mixture_fails():
138
+ def test_nonqubit_mixture_fails() -> None:
136
139
  mix = [(0.5, np.array([[1, 0, 0], [0, 1, 0]])), (0.5, np.array([[0, 1, 0], [1, 0, 0]]))]
137
140
 
138
141
  with pytest.raises(ValueError, match='Input mixture'):
139
142
  _ = cirq.MixedUnitaryChannel(mixture=mix, key='m')
140
143
 
141
144
 
142
- def test_validate():
145
+ def test_validate() -> None:
143
146
  mix = [(0.5, np.array([[1, 0], [0, 0]])), (0.5, np.array([[0, 0], [0, 1]]))]
144
147
  with pytest.raises(ValueError, match='non-unitary'):
145
148
  _ = cirq.MixedUnitaryChannel(mixture=mix, key='m', validate=True)
cirq/ops/named_qubit.py CHANGED
@@ -11,9 +11,12 @@
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 functools
15
18
  import weakref
16
- from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING
19
+ from typing import Any, TYPE_CHECKING
17
20
 
18
21
  from cirq import protocols
19
22
  from cirq.ops import raw_types
@@ -28,8 +31,8 @@ class _BaseNamedQid(raw_types.Qid):
28
31
 
29
32
  _name: str
30
33
  _dimension: int
31
- _comp_key: Optional[str] = None
32
- _hash: Optional[int] = None
34
+ _comp_key: str | None = None
35
+ _hash: int | None = None
33
36
 
34
37
  def __hash__(self) -> int:
35
38
  if self._hash is None:
@@ -93,7 +96,7 @@ class _BaseNamedQid(raw_types.Qid):
93
96
  def dimension(self) -> int:
94
97
  return self._dimension
95
98
 
96
- def with_dimension(self, dimension: int) -> 'NamedQid':
99
+ def with_dimension(self, dimension: int) -> NamedQid:
97
100
  return NamedQid(self._name, dimension=dimension)
98
101
 
99
102
 
@@ -109,9 +112,9 @@ class NamedQid(_BaseNamedQid):
109
112
 
110
113
  # Cache of existing NamedQid instances, returned by __new__ if available.
111
114
  # Holds weak references so instances can still be garbage collected.
112
- _cache = weakref.WeakValueDictionary[Tuple[str, int], 'cirq.NamedQid']()
115
+ _cache = weakref.WeakValueDictionary[tuple[str, int], 'cirq.NamedQid']()
113
116
 
114
- def __new__(cls, name: str, dimension: int) -> 'cirq.NamedQid':
117
+ def __new__(cls, name: str, dimension: int) -> cirq.NamedQid:
115
118
  """Initializes a `NamedQid` with a given name and dimension.
116
119
 
117
120
  Args:
@@ -134,7 +137,7 @@ class NamedQid(_BaseNamedQid):
134
137
  return (self._name, self._dimension)
135
138
 
136
139
  # avoid pickling the _hash value, attributes are already stored with __getnewargs__
137
- def __getstate__(self) -> Dict[str, Any]:
140
+ def __getstate__(self) -> dict[str, Any]:
138
141
  return {}
139
142
 
140
143
  def __repr__(self) -> str:
@@ -144,7 +147,7 @@ class NamedQid(_BaseNamedQid):
144
147
  return f'{self._name} (d={self._dimension})'
145
148
 
146
149
  @staticmethod
147
- def range(*args, prefix: str, dimension: int) -> List['NamedQid']:
150
+ def range(*args, prefix: str, dimension: int) -> list[NamedQid]:
148
151
  """Returns a range of ``NamedQid``\\s.
149
152
 
150
153
  The range returned starts with the prefix, and followed by a qid for
@@ -167,7 +170,7 @@ class NamedQid(_BaseNamedQid):
167
170
  """
168
171
  return [NamedQid(f"{prefix}{i}", dimension=dimension) for i in range(*args)]
169
172
 
170
- def _json_dict_(self) -> Dict[str, Any]:
173
+ def _json_dict_(self) -> dict[str, Any]:
171
174
  return protocols.obj_to_dict_helper(self, ['name', 'dimension'])
172
175
 
173
176
 
@@ -186,7 +189,7 @@ class NamedQubit(_BaseNamedQid):
186
189
  # Holds weak references so instances can still be garbage collected.
187
190
  _cache = weakref.WeakValueDictionary[str, 'cirq.NamedQubit']()
188
191
 
189
- def __new__(cls, name: str) -> 'cirq.NamedQubit':
192
+ def __new__(cls, name: str) -> cirq.NamedQubit:
190
193
  """Initializes a `NamedQid` with a given name and dimension.
191
194
 
192
195
  Args:
@@ -206,7 +209,7 @@ class NamedQubit(_BaseNamedQid):
206
209
  return (self._name,)
207
210
 
208
211
  # avoid pickling the _hash value, attributes are already stored with __getnewargs__
209
- def __getstate__(self) -> Dict[str, Any]:
212
+ def __getstate__(self) -> dict[str, Any]:
210
213
  return {}
211
214
 
212
215
  def __str__(self) -> str:
@@ -216,7 +219,7 @@ class NamedQubit(_BaseNamedQid):
216
219
  return f'cirq.NamedQubit({self._name!r})'
217
220
 
218
221
  @staticmethod
219
- def range(*args, prefix: str) -> List['NamedQubit']:
222
+ def range(*args, prefix: str) -> list[NamedQubit]:
220
223
  r"""Returns a range of `cirq.NamedQubit`s.
221
224
 
222
225
  The range returned starts with the prefix, and followed by a qubit for
@@ -238,7 +241,7 @@ class NamedQubit(_BaseNamedQid):
238
241
  """
239
242
  return [NamedQubit(f"{prefix}{i}") for i in range(*args)]
240
243
 
241
- def _json_dict_(self) -> Dict[str, Any]:
244
+ def _json_dict_(self) -> dict[str, Any]:
242
245
  return protocols.obj_to_dict_helper(self, ['name'])
243
246
 
244
247
 
@@ -12,21 +12,23 @@
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 cirq
16
18
  from cirq.devices.grid_qubit_test import _test_qid_pickled_hash
17
19
  from cirq.ops.named_qubit import _pad_digits
18
20
 
19
21
 
20
- def test_init():
22
+ def test_init() -> None:
21
23
  q = cirq.NamedQubit('a')
22
24
  assert q.name == 'a'
23
25
 
24
- q = cirq.NamedQid('a', dimension=3)
25
- assert q.name == 'a'
26
- assert q.dimension == 3
26
+ qid = cirq.NamedQid('a', dimension=3)
27
+ assert qid.name == 'a'
28
+ assert qid.dimension == 3
27
29
 
28
30
 
29
- def test_named_qubit_str():
31
+ def test_named_qubit_str() -> None:
30
32
  q = cirq.NamedQubit('a')
31
33
  assert q.name == 'a'
32
34
  assert str(q) == 'a'
@@ -35,14 +37,14 @@ def test_named_qubit_str():
35
37
  assert str(qid) == 'a (d=3)'
36
38
 
37
39
 
38
- def test_named_qubit_repr():
40
+ def test_named_qubit_repr() -> None:
39
41
  q = cirq.NamedQubit('a')
40
42
  assert repr(q) == "cirq.NamedQubit('a')"
41
43
  qid = cirq.NamedQid('a', dimension=3)
42
44
  assert repr(qid) == "cirq.NamedQid('a', dimension=3)"
43
45
 
44
46
 
45
- def test_named_qubit_pickled_hash():
47
+ def test_named_qubit_pickled_hash() -> None:
46
48
  # Use a name that is unlikely to be used by any other tests.
47
49
  x = "test_named_qubit_pickled_hash"
48
50
  q_bad = cirq.NamedQubit(x)
@@ -51,7 +53,7 @@ def test_named_qubit_pickled_hash():
51
53
  _test_qid_pickled_hash(q, q_bad)
52
54
 
53
55
 
54
- def test_named_qid_pickled_hash():
56
+ def test_named_qid_pickled_hash() -> None:
55
57
  # Use a name that is unlikely to be used by any other tests.
56
58
  x = "test_named_qid_pickled_hash"
57
59
  q_bad = cirq.NamedQid(x, dimension=3)
@@ -60,7 +62,7 @@ def test_named_qid_pickled_hash():
60
62
  _test_qid_pickled_hash(q, q_bad)
61
63
 
62
64
 
63
- def test_named_qubit_order():
65
+ def test_named_qubit_order() -> None:
64
66
  order = cirq.testing.OrderTester()
65
67
  order.add_ascending(
66
68
  cirq.NamedQid('', dimension=1),
@@ -108,7 +110,7 @@ def test_named_qubit_order():
108
110
  )
109
111
 
110
112
 
111
- def test_pad_digits():
113
+ def test_pad_digits() -> None:
112
114
  assert _pad_digits('') == ''
113
115
  assert _pad_digits('a') == 'a'
114
116
  assert _pad_digits('a0') == 'a00000000:1'
@@ -119,7 +121,7 @@ def test_pad_digits():
119
121
  assert _pad_digits('a00000000:8') == 'a00000000:8:00000008:1'
120
122
 
121
123
 
122
- def test_named_qubit_range():
124
+ def test_named_qubit_range() -> None:
123
125
  qubits = cirq.NamedQubit.range(2, prefix='a')
124
126
  assert qubits == [cirq.NamedQubit('a0'), cirq.NamedQubit('a1')]
125
127
 
@@ -127,7 +129,7 @@ def test_named_qubit_range():
127
129
  assert qubits == [cirq.NamedQubit('a-1'), cirq.NamedQubit('a1'), cirq.NamedQubit('a3')]
128
130
 
129
131
 
130
- def test_named_qid_range():
132
+ def test_named_qid_range() -> None:
131
133
  qids = cirq.NamedQid.range(2, prefix='a', dimension=3)
132
134
  assert qids == [cirq.NamedQid('a0', dimension=3), cirq.NamedQid('a1', dimension=3)]
133
135
 
@@ -149,7 +151,7 @@ def test_named_qid_range():
149
151
  ]
150
152
 
151
153
 
152
- def test_to_json():
154
+ def test_to_json() -> None:
153
155
  assert cirq.NamedQubit('c')._json_dict_() == {'name': 'c'}
154
156
 
155
157
  assert cirq.NamedQid('c', dimension=3)._json_dict_() == {'name': 'c', 'dimension': 3}