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
@@ -18,7 +18,9 @@ The gate is used to create a 4x4 matrix with the diagonal elements
18
18
  passed as a list.
19
19
  """
20
20
 
21
- from typing import AbstractSet, Any, Dict, Iterator, Optional, Sequence, Tuple, TYPE_CHECKING
21
+ from __future__ import annotations
22
+
23
+ from typing import AbstractSet, Any, Iterator, Sequence, TYPE_CHECKING
22
24
 
23
25
  import numpy as np
24
26
  import sympy
@@ -62,10 +64,10 @@ class TwoQubitDiagonalGate(raw_types.Gate):
62
64
  If these values are $(x_0, x_1, \ldots , x_3)$ then the unitary
63
65
  has diagonal values $(e^{i x_0}, e^{i x_1}, \ldots, e^{i x_3})$.
64
66
  """
65
- self._diag_angles_radians: Tuple[value.TParamVal, ...] = tuple(diag_angles_radians)
67
+ self._diag_angles_radians: tuple[value.TParamVal, ...] = tuple(diag_angles_radians)
66
68
 
67
69
  @property
68
- def diag_angles_radians(self) -> Tuple[value.TParamVal, ...]:
70
+ def diag_angles_radians(self) -> tuple[value.TParamVal, ...]:
69
71
  return self._diag_angles_radians
70
72
 
71
73
  def _num_qubits_(self) -> int:
@@ -80,8 +82,8 @@ class TwoQubitDiagonalGate(raw_types.Gate):
80
82
  }
81
83
 
82
84
  def _resolve_parameters_(
83
- self, resolver: 'cirq.ParamResolver', recursive: bool
84
- ) -> 'TwoQubitDiagonalGate':
85
+ self, resolver: cirq.ParamResolver, recursive: bool
86
+ ) -> TwoQubitDiagonalGate:
85
87
  return TwoQubitDiagonalGate(
86
88
  protocols.resolve_parameters(self._diag_angles_radians, resolver, recursive)
87
89
  )
@@ -89,12 +91,12 @@ class TwoQubitDiagonalGate(raw_types.Gate):
89
91
  def _has_unitary_(self) -> bool:
90
92
  return not self._is_parameterized_()
91
93
 
92
- def _unitary_(self) -> Optional[np.ndarray]:
94
+ def _unitary_(self) -> np.ndarray | None:
93
95
  if self._is_parameterized_():
94
96
  return None
95
97
  return np.diag([np.exp(1j * angle) for angle in self._diag_angles_radians])
96
98
 
97
- def _decompose_(self, qubits: Sequence['cirq.Qid']) -> Iterator['cirq.OP_TREE']:
99
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
98
100
  x0, x1, x2, x3 = self._diag_angles_radians
99
101
  q0, q1 = qubits
100
102
  yield common_gates.ZPowGate(exponent=x2 / np.pi).on(q0)
@@ -104,7 +106,7 @@ class TwoQubitDiagonalGate(raw_types.Gate):
104
106
  yield common_gates.CZPowGate(exponent=x0 / np.pi).on(q0, q1)
105
107
  yield common_gates.XPowGate().on_each(q0, q1)
106
108
 
107
- def _apply_unitary_(self, args: 'protocols.ApplyUnitaryArgs') -> np.ndarray:
109
+ def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
108
110
  if self._is_parameterized_():
109
111
  return NotImplemented
110
112
  for index, angle in enumerate(self._diag_angles_radians):
@@ -112,16 +114,14 @@ class TwoQubitDiagonalGate(raw_types.Gate):
112
114
  args.target_tensor[subspace_index] *= np.exp(1j * angle)
113
115
  return args.target_tensor
114
116
 
115
- def _circuit_diagram_info_(
116
- self, args: 'cirq.CircuitDiagramInfoArgs'
117
- ) -> 'cirq.CircuitDiagramInfo':
117
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
118
118
  rounded_angles = np.array(self._diag_angles_radians)
119
119
  if args.precision is not None:
120
120
  rounded_angles = rounded_angles.round(args.precision)
121
121
  diag_str = f"diag({', '.join(proper_repr(angle) for angle in rounded_angles)})"
122
122
  return protocols.CircuitDiagramInfo((diag_str, '#2'))
123
123
 
124
- def __pow__(self, exponent: Any) -> 'TwoQubitDiagonalGate':
124
+ def __pow__(self, exponent: Any) -> TwoQubitDiagonalGate:
125
125
  if not isinstance(exponent, (int, float, sympy.Basic)):
126
126
  return NotImplemented
127
127
  angles = []
@@ -139,5 +139,5 @@ class TwoQubitDiagonalGate(raw_types.Gate):
139
139
  angles = ','.join(proper_repr(angle) for angle in self._diag_angles_radians)
140
140
  return f'cirq.TwoQubitDiagonalGate([{angles}])'
141
141
 
142
- def _json_dict_(self) -> Dict[str, Any]:
142
+ def _json_dict_(self) -> dict[str, Any]:
143
143
  return protocols.obj_to_dict_helper(self, attribute_names=["diag_angles_radians"])
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
  import sympy
@@ -30,15 +32,15 @@ import cirq
30
32
  )
31
33
  ),
32
34
  )
33
- def test_consistent_protocols(gate):
35
+ def test_consistent_protocols(gate) -> None:
34
36
  cirq.testing.assert_implements_consistent_protocols(gate)
35
37
 
36
38
 
37
- def test_property():
39
+ def test_property() -> None:
38
40
  assert cirq.TwoQubitDiagonalGate([2, 3, 5, 7]).diag_angles_radians == (2, 3, 5, 7)
39
41
 
40
42
 
41
- def test_parameterized_decompose():
43
+ def test_parameterized_decompose() -> None:
42
44
  angles = sympy.symbols('x0, x1, x2, x3')
43
45
  parameterized_op = cirq.TwoQubitDiagonalGate(angles).on(*cirq.LineQubit.range(2))
44
46
  decomposed_circuit = cirq.Circuit(cirq.decompose(parameterized_op))
@@ -54,7 +56,7 @@ def test_parameterized_decompose():
54
56
  )
55
57
 
56
58
 
57
- def test_unitary():
59
+ def test_unitary() -> None:
58
60
  diagonal_angles = [2, 3, 5, 7]
59
61
  assert cirq.has_unitary(cirq.TwoQubitDiagonalGate(diagonal_angles))
60
62
  np.testing.assert_allclose(
@@ -64,7 +66,7 @@ def test_unitary():
64
66
  )
65
67
 
66
68
 
67
- def test_diagram():
69
+ def test_diagram() -> None:
68
70
  a, b = cirq.LineQubit.range(2)
69
71
 
70
72
  diagonal_circuit = cirq.Circuit(cirq.TwoQubitDiagonalGate([2, 3, 5, 7])(a, b))
@@ -87,7 +89,7 @@ def test_diagram():
87
89
  )
88
90
 
89
91
 
90
- def test_diagonal_exponent():
92
+ def test_diagonal_exponent() -> None:
91
93
  diagonal_angles = [2, 3, 5, 7]
92
94
  diagonal_gate = cirq.TwoQubitDiagonalGate(diagonal_angles)
93
95
 
@@ -99,7 +101,7 @@ def test_diagonal_exponent():
99
101
  assert cirq.pow(cirq.TwoQubitDiagonalGate(diagonal_angles), "test", None) is None
100
102
 
101
103
 
102
- def test_protocols_mul_not_implemented():
104
+ def test_protocols_mul_not_implemented() -> None:
103
105
  diagonal_angles = [2, 3, None, 7]
104
106
  diagonal_gate = cirq.TwoQubitDiagonalGate(diagonal_angles)
105
107
  with pytest.raises(TypeError):
@@ -107,7 +109,7 @@ def test_protocols_mul_not_implemented():
107
109
 
108
110
 
109
111
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
110
- def test_resolve(resolve_fn):
112
+ def test_resolve(resolve_fn) -> None:
111
113
  diagonal_angles = [2, 3, 5, 7]
112
114
  diagonal_gate = cirq.TwoQubitDiagonalGate(
113
115
  diagonal_angles[:2] + [sympy.Symbol('a'), sympy.Symbol('b')]
@@ -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, Dict, Iterator, Sequence, TYPE_CHECKING
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Iterator, Sequence, TYPE_CHECKING
16
18
 
17
19
  import numpy as np
18
20
 
@@ -58,7 +60,7 @@ class UniformSuperpositionGate(raw_types.Gate):
58
60
  self._m_value = m_value
59
61
  self._num_qubits = num_qubits
60
62
 
61
- def _decompose_(self, qubits: Sequence["cirq.Qid"]) -> Iterator["cirq.OP_TREE"]:
63
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
62
64
  """Decomposes the gate into a sequence of standard gates.
63
65
  Implements the construction from https://arxiv.org/pdf/2306.11747.
64
66
  """
@@ -113,7 +115,7 @@ class UniformSuperpositionGate(raw_types.Gate):
113
115
  def __repr__(self) -> str:
114
116
  return f'UniformSuperpositionGate(m_value={self._m_value}, num_qubits={self._num_qubits})'
115
117
 
116
- def _json_dict_(self) -> Dict[str, Any]:
118
+ def _json_dict_(self) -> dict[str, Any]:
117
119
  d = {}
118
120
  d['m_value'] = self._m_value
119
121
  d['num_qubits'] = self._num_qubits
@@ -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
 
@@ -65,18 +67,18 @@ def test_incompatible_m_value_and_qubit_args(m: int, n: int) -> None:
65
67
  cirq.UniformSuperpositionGate(m, n)
66
68
 
67
69
 
68
- def test_repr():
70
+ def test_repr() -> None:
69
71
  assert (
70
72
  repr(cirq.UniformSuperpositionGate(7, 3))
71
73
  == 'UniformSuperpositionGate(m_value=7, num_qubits=3)'
72
74
  )
73
75
 
74
76
 
75
- def test_uniform_superposition_gate_json_dict():
77
+ def test_uniform_superposition_gate_json_dict() -> None:
76
78
  assert cirq.UniformSuperpositionGate(7, 3)._json_dict_() == {'m_value': 7, 'num_qubits': 3}
77
79
 
78
80
 
79
- def test_str():
81
+ def test_str() -> None:
80
82
  assert (
81
83
  str(cirq.UniformSuperpositionGate(7, 3))
82
84
  == 'UniformSuperpositionGate(m_value=7, num_qubits=3)'
cirq/ops/wait_gate.py CHANGED
@@ -11,7 +11,10 @@
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
- from typing import AbstractSet, Any, Dict, Optional, Tuple, TYPE_CHECKING
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import AbstractSet, Any, TYPE_CHECKING
15
18
 
16
19
  from cirq import protocols, value
17
20
  from cirq.ops import raw_types
@@ -30,9 +33,9 @@ class WaitGate(raw_types.Gate):
30
33
 
31
34
  def __init__(
32
35
  self,
33
- duration: 'cirq.DURATION_LIKE',
34
- num_qubits: Optional[int] = None,
35
- qid_shape: Optional[Tuple[int, ...]] = None,
36
+ duration: cirq.DURATION_LIKE | int,
37
+ num_qubits: int | None = None,
38
+ qid_shape: tuple[int, ...] | None = None,
36
39
  ) -> None:
37
40
  """Initialize a wait gate with the given duration.
38
41
 
@@ -66,7 +69,7 @@ class WaitGate(raw_types.Gate):
66
69
  self._qid_shape = qid_shape
67
70
 
68
71
  @property
69
- def duration(self) -> 'cirq.Duration':
72
+ def duration(self) -> cirq.Duration:
70
73
  return self._duration
71
74
 
72
75
  def _is_parameterized_(self) -> bool:
@@ -75,13 +78,13 @@ class WaitGate(raw_types.Gate):
75
78
  def _parameter_names_(self) -> AbstractSet[str]:
76
79
  return protocols.parameter_names(self.duration)
77
80
 
78
- def _resolve_parameters_(self, resolver: 'cirq.ParamResolver', recursive: bool) -> 'WaitGate':
81
+ def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> WaitGate:
79
82
  return WaitGate(
80
83
  protocols.resolve_parameters(self.duration, resolver, recursive),
81
84
  qid_shape=self._qid_shape,
82
85
  )
83
86
 
84
- def _qid_shape_(self) -> Tuple[int, ...]:
87
+ def _qid_shape_(self) -> tuple[int, ...]:
85
88
  return self._qid_shape
86
89
 
87
90
  def _has_unitary_(self) -> bool:
@@ -111,7 +114,7 @@ class WaitGate(raw_types.Gate):
111
114
  def __repr__(self) -> str:
112
115
  return f'cirq.WaitGate({repr(self.duration)})'
113
116
 
114
- def _json_dict_(self) -> Dict[str, Any]:
117
+ def _json_dict_(self) -> dict[str, Any]:
115
118
  d = protocols.obj_to_dict_helper(self, ['duration'])
116
119
  if len(self._qid_shape) != 1:
117
120
  d['num_qubits'] = len(self._qid_shape)
@@ -132,12 +135,12 @@ class WaitGate(raw_types.Gate):
132
135
 
133
136
 
134
137
  def wait(
135
- *target: 'cirq.Qid',
136
- duration: 'cirq.DURATION_LIKE' = None,
137
- picos: 'cirq.TParamVal' = 0,
138
- nanos: 'cirq.TParamVal' = 0,
139
- micros: 'cirq.TParamVal' = 0,
140
- millis: 'cirq.TParamVal' = 0,
138
+ *target: cirq.Qid,
139
+ duration: cirq.DURATION_LIKE = None,
140
+ picos: cirq.TParamVal = 0,
141
+ nanos: cirq.TParamVal = 0,
142
+ micros: cirq.TParamVal = 0,
143
+ millis: cirq.TParamVal = 0,
141
144
  ) -> raw_types.Operation:
142
145
  """Creates a WaitGate applied to all the given qubits.
143
146
 
@@ -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 datetime
15
18
 
16
19
  import pytest
@@ -19,7 +22,7 @@ import sympy
19
22
  import cirq
20
23
 
21
24
 
22
- def test_init():
25
+ def test_init() -> None:
23
26
  g = cirq.WaitGate(datetime.timedelta(0, 0, 5))
24
27
  assert g.duration == cirq.Duration(micros=5)
25
28
 
@@ -36,13 +39,13 @@ def test_init():
36
39
  _ = cirq.WaitGate(2)
37
40
 
38
41
 
39
- def test_eq():
42
+ def test_eq() -> None:
40
43
  eq = cirq.testing.EqualsTester()
41
44
  eq.add_equality_group(cirq.WaitGate(0), cirq.WaitGate(cirq.Duration()))
42
45
  eq.make_equality_group(lambda: cirq.WaitGate(cirq.Duration(nanos=4)))
43
46
 
44
47
 
45
- def test_protocols():
48
+ def test_protocols() -> None:
46
49
  t = sympy.Symbol('t')
47
50
  p = cirq.WaitGate(cirq.Duration(millis=5 * t))
48
51
  c = cirq.WaitGate(cirq.Duration(millis=2))
@@ -67,7 +70,7 @@ def test_protocols():
67
70
  assert cirq.decompose(p.on(q)) == []
68
71
 
69
72
 
70
- def test_qid_shape():
73
+ def test_qid_shape() -> None:
71
74
  assert cirq.qid_shape(cirq.WaitGate(0, qid_shape=(2, 3))) == (2, 3)
72
75
  assert cirq.qid_shape(cirq.WaitGate(0, num_qubits=3)) == (2, 2, 2)
73
76
  with pytest.raises(ValueError, match='empty set of qubits'):
@@ -84,7 +87,7 @@ def test_resolve_parameters(num_qubits: int) -> None:
84
87
  assert cirq.num_qubits(resolved) == num_qubits
85
88
 
86
89
 
87
- def test_json():
90
+ def test_json() -> None:
88
91
  q0, q1 = cirq.GridQubit.rect(1, 2)
89
92
  qtrit = cirq.GridQid(1, 2, dimension=3)
90
93
  cirq.testing.assert_json_roundtrip_works(cirq.wait(q0, nanos=10))
@@ -93,5 +96,5 @@ def test_json():
93
96
  cirq.testing.assert_json_roundtrip_works(cirq.wait(qtrit, q1, nanos=10))
94
97
 
95
98
 
96
- def test_str():
99
+ def test_str() -> None:
97
100
  assert str(cirq.WaitGate(cirq.Duration(nanos=5))) == 'WaitGate(5 ns)'
@@ -139,11 +139,8 @@ from cirq.protocols.pauli_expansion_protocol import (
139
139
  SupportsPauliExpansion as SupportsPauliExpansion,
140
140
  )
141
141
 
142
- # pylint: disable=redefined-builtin
143
142
  from cirq.protocols.pow_protocol import pow as pow
144
143
 
145
- # pylint: enable=redefined-builtin
146
-
147
144
  from cirq.protocols.qasm import (
148
145
  qasm as qasm,
149
146
  QasmArgs as QasmArgs,
@@ -12,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from types import NotImplementedType
16
- from typing import Any, Optional, Sequence, TYPE_CHECKING, Union
18
+ from typing import Any, Sequence, TYPE_CHECKING
17
19
 
18
20
  from typing_extensions import Protocol
19
21
 
@@ -28,7 +30,7 @@ class SupportsActOn(Protocol):
28
30
  """An object that explicitly specifies how to act on simulator states."""
29
31
 
30
32
  @doc_private
31
- def _act_on_(self, sim_state: 'cirq.SimulationStateBase') -> Union[NotImplementedType, bool]:
33
+ def _act_on_(self, sim_state: cirq.SimulationStateBase) -> NotImplementedType | bool:
32
34
  """Applies an action to the given argument, if it is a supported type.
33
35
 
34
36
  For example, unitary operations can implement an `_act_on_` method that
@@ -59,8 +61,8 @@ class SupportsActOnQubits(Protocol):
59
61
 
60
62
  @doc_private
61
63
  def _act_on_(
62
- self, sim_state: 'cirq.SimulationStateBase', qubits: Sequence['cirq.Qid']
63
- ) -> Union[NotImplementedType, bool]:
64
+ self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]
65
+ ) -> NotImplementedType | bool:
64
66
  """Applies an action to the given argument, if it is a supported type.
65
67
 
66
68
  For example, unitary operations can implement an `_act_on_` method that
@@ -88,8 +90,8 @@ class SupportsActOnQubits(Protocol):
88
90
 
89
91
  def act_on(
90
92
  action: Any,
91
- sim_state: 'cirq.SimulationStateBase',
92
- qubits: Optional[Sequence['cirq.Qid']] = None,
93
+ sim_state: cirq.SimulationStateBase,
94
+ qubits: Sequence[cirq.Qid] | None = None,
93
95
  *,
94
96
  allow_decompose: bool = True,
95
97
  ):
@@ -11,7 +11,10 @@
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
- from typing import Any, Sequence, Tuple
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Sequence
15
18
 
16
19
  import numpy as np
17
20
  import pytest
@@ -34,7 +37,7 @@ class ExampleSimulationState(cirq.SimulationState):
34
37
  self.fallback_result = fallback_result
35
38
 
36
39
  def _act_on_fallback_(
37
- self, action: Any, qubits: Sequence['cirq.Qid'], allow_decompose: bool = True
40
+ self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
38
41
  ):
39
42
  return self.fallback_result
40
43
 
@@ -42,30 +45,30 @@ class ExampleSimulationState(cirq.SimulationState):
42
45
  op = cirq.X(cirq.LineQubit(0))
43
46
 
44
47
 
45
- def test_act_on_fallback_succeeds():
48
+ def test_act_on_fallback_succeeds() -> None:
46
49
  state = ExampleSimulationState(fallback_result=True)
47
50
  cirq.act_on(op, state)
48
51
 
49
52
 
50
- def test_act_on_fallback_fails():
53
+ def test_act_on_fallback_fails() -> None:
51
54
  state = ExampleSimulationState(fallback_result=NotImplemented)
52
55
  with pytest.raises(TypeError, match='Failed to act'):
53
56
  cirq.act_on(op, state)
54
57
 
55
58
 
56
- def test_act_on_fallback_errors():
59
+ def test_act_on_fallback_errors() -> None:
57
60
  state = ExampleSimulationState(fallback_result=False)
58
61
  with pytest.raises(ValueError, match='_act_on_fallback_ must return True or NotImplemented'):
59
62
  cirq.act_on(op, state)
60
63
 
61
64
 
62
- def test_act_on_errors():
65
+ def test_act_on_errors() -> None:
63
66
  class Op(cirq.Operation):
64
67
  @property
65
- def qubits(self) -> Tuple['cirq.Qid', ...]: # type: ignore[empty-body]
68
+ def qubits(self) -> tuple[cirq.Qid, ...]: # type: ignore[empty-body]
66
69
  pass
67
70
 
68
- def with_qubits(self, *new_qubits: 'cirq.Qid') -> Self: # type: ignore[empty-body]
71
+ def with_qubits(self, *new_qubits: cirq.Qid) -> Self: # type: ignore[empty-body]
69
72
  pass
70
73
 
71
74
  def _act_on_(self, sim_state):
@@ -76,13 +79,13 @@ def test_act_on_errors():
76
79
  cirq.act_on(Op(), state)
77
80
 
78
81
 
79
- def test_qubits_not_allowed_for_operations():
82
+ def test_qubits_not_allowed_for_operations() -> None:
80
83
  class Op(cirq.Operation):
81
84
  @property
82
- def qubits(self) -> Tuple['cirq.Qid', ...]: # type: ignore[empty-body]
85
+ def qubits(self) -> tuple[cirq.Qid, ...]: # type: ignore[empty-body]
83
86
  pass
84
87
 
85
- def with_qubits(self, *new_qubits: 'cirq.Qid') -> Self: # type: ignore[empty-body]
88
+ def with_qubits(self, *new_qubits: cirq.Qid) -> Self: # type: ignore[empty-body]
86
89
  pass
87
90
 
88
91
  state = ExampleSimulationState()
@@ -92,7 +95,7 @@ def test_qubits_not_allowed_for_operations():
92
95
  cirq.act_on(Op(), state, qubits=[])
93
96
 
94
97
 
95
- def test_qubits_should_be_defined_for_operations():
98
+ def test_qubits_should_be_defined_for_operations() -> None:
96
99
  state = ExampleSimulationState()
97
100
  with pytest.raises(ValueError, match='Calls to act_on should'):
98
101
  cirq.act_on(cirq.KrausChannel([np.array([[1, 0], [0, 0]])]), state, qubits=None)
@@ -14,8 +14,10 @@
14
14
 
15
15
  """A protocol for implementing high performance channel evolutions."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  from types import NotImplementedType
18
- from typing import Any, Iterable, Optional, Sequence, Tuple, TypeVar, Union
20
+ from typing import Any, Iterable, Sequence, TypeVar
19
21
 
20
22
  import numpy as np
21
23
  from typing_extensions import Protocol
@@ -124,9 +126,7 @@ class SupportsApplyChannel(Protocol):
124
126
  """An object that can efficiently implement a channel."""
125
127
 
126
128
  @doc_private
127
- def _apply_channel_(
128
- self, args: ApplyChannelArgs
129
- ) -> Union[np.ndarray, None, NotImplementedType]:
129
+ def _apply_channel_(self, args: ApplyChannelArgs) -> np.ndarray | None | NotImplementedType:
130
130
  """Efficiently applies a channel.
131
131
 
132
132
  This method is given both the target tensor and workspace of the same
@@ -166,10 +166,8 @@ class SupportsApplyChannel(Protocol):
166
166
 
167
167
 
168
168
  def apply_channel(
169
- val: Any,
170
- args: ApplyChannelArgs,
171
- default: Union[np.ndarray, TDefault] = RaiseTypeErrorIfNotProvided,
172
- ) -> Union[np.ndarray, TDefault]:
169
+ val: Any, args: ApplyChannelArgs, default: np.ndarray | TDefault = RaiseTypeErrorIfNotProvided
170
+ ) -> np.ndarray | TDefault:
173
171
  """High performance evolution under a channel evolution.
174
172
 
175
173
  If `val` defines an `_apply_channel_` method, that method will be
@@ -273,7 +271,7 @@ def apply_channel(
273
271
  )
274
272
 
275
273
 
276
- def _apply_unitary(val: Any, args: 'ApplyChannelArgs') -> Optional[np.ndarray]:
274
+ def _apply_unitary(val: Any, args: ApplyChannelArgs) -> np.ndarray | None:
277
275
  """Attempt to use `apply_unitary` and return the result.
278
276
 
279
277
  If `val` does not support `apply_unitary` returns None.
@@ -296,9 +294,7 @@ def _apply_unitary(val: Any, args: 'ApplyChannelArgs') -> Optional[np.ndarray]:
296
294
  return right_result
297
295
 
298
296
 
299
- def _apply_kraus(
300
- kraus: Union[Tuple[np.ndarray], Sequence[Any]], args: 'ApplyChannelArgs'
301
- ) -> np.ndarray:
297
+ def _apply_kraus(kraus: tuple[np.ndarray] | Sequence[Any], args: ApplyChannelArgs) -> np.ndarray:
302
298
  """Directly apply the kraus operators to the target tensor."""
303
299
  # Initialize output.
304
300
  args.out_buffer[:] = 0
@@ -313,7 +309,7 @@ def _apply_kraus(
313
309
 
314
310
 
315
311
  def _apply_kraus_single_qubit(
316
- kraus: Union[Tuple[Any], Sequence[Any]], args: 'ApplyChannelArgs'
312
+ kraus: tuple[Any] | Sequence[Any], args: ApplyChannelArgs
317
313
  ) -> np.ndarray:
318
314
  """Use slicing to apply single qubit channel. Only for two-level qubits."""
319
315
  zero_left = linalg.slice_for_qubits_equal_to(args.left_axes, 0)
@@ -338,7 +334,7 @@ def _apply_kraus_single_qubit(
338
334
 
339
335
 
340
336
  def _apply_kraus_multi_qubit(
341
- kraus: Union[Tuple[Any], Sequence[Any]], args: 'ApplyChannelArgs'
337
+ kraus: tuple[Any] | Sequence[Any], args: ApplyChannelArgs
342
338
  ) -> np.ndarray:
343
339
  """Use numpy's einsum to apply a multi-qubit channel."""
344
340
  qid_shape = tuple(args.target_tensor.shape[i] for i in args.left_axes)
@@ -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