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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,18 +12,20 @@
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
 
18
20
  import cirq
19
21
 
20
22
 
21
- def test_assert_consistent_channel_valid():
23
+ def test_assert_consistent_channel_valid() -> None:
22
24
  channel = cirq.KrausChannel(kraus_ops=(np.array([[0, 1], [0, 0]]), np.array([[1, 0], [0, 0]])))
23
25
  cirq.testing.assert_consistent_channel(channel)
24
26
 
25
27
 
26
- def test_assert_consistent_channel_tolerances():
28
+ def test_assert_consistent_channel_tolerances() -> None:
27
29
  # This channel is off by 1e-5 from the identity matrix in the consistency condition.
28
30
  channel = cirq.KrausChannel(
29
31
  kraus_ops=(np.array([[0, np.sqrt(1 - 1e-5)], [0, 0]]), np.array([[1, 0], [0, 0]]))
@@ -37,23 +39,23 @@ def test_assert_consistent_channel_tolerances():
37
39
  cirq.testing.assert_consistent_channel(channel, rtol=0, atol=1e-6)
38
40
 
39
41
 
40
- def test_assert_consistent_channel_invalid():
42
+ def test_assert_consistent_channel_invalid() -> None:
41
43
  channel = cirq.KrausChannel(kraus_ops=(np.array([[1, 1], [0, 0]]), np.array([[1, 0], [0, 0]])))
42
44
  with pytest.raises(AssertionError, match=r"cirq.KrausChannel.*2 1"):
43
45
  cirq.testing.assert_consistent_channel(channel)
44
46
 
45
47
 
46
- def test_assert_consistent_channel_not_kraus():
48
+ def test_assert_consistent_channel_not_kraus() -> None:
47
49
  with pytest.raises(AssertionError, match="12.*has_kraus"):
48
50
  cirq.testing.assert_consistent_channel(12)
49
51
 
50
52
 
51
- def test_assert_consistent_mixture_valid():
53
+ def test_assert_consistent_mixture_valid() -> None:
52
54
  mixture = cirq.X.with_probability(0.1)
53
55
  cirq.testing.assert_consistent_mixture(mixture)
54
56
 
55
57
 
56
- def test_assert_consistent_mixture_not_mixture():
58
+ def test_assert_consistent_mixture_not_mixture() -> None:
57
59
  not_mixture = cirq.amplitude_damp(0.1)
58
60
  with pytest.raises(AssertionError, match="has_mixture"):
59
61
  cirq.testing.assert_consistent_mixture(not_mixture)
@@ -69,7 +71,7 @@ class _MixtureGate(cirq.testing.SingleQubitGate):
69
71
  return (self._p, cirq.unitary(cirq.I)), (self._q, cirq.unitary(cirq.X))
70
72
 
71
73
 
72
- def test_assert_consistent_mixture_not_normalized():
74
+ def test_assert_consistent_mixture_not_normalized() -> None:
73
75
  mixture = _MixtureGate(0.1, 0.85)
74
76
  with pytest.raises(AssertionError, match="sum to 1"):
75
77
  cirq.testing.assert_consistent_mixture(mixture)
@@ -79,7 +81,7 @@ def test_assert_consistent_mixture_not_normalized():
79
81
  cirq.testing.assert_consistent_mixture(mixture)
80
82
 
81
83
 
82
- def test_assert_consistent_mixture_tolerances():
84
+ def test_assert_consistent_mixture_tolerances() -> None:
83
85
 
84
86
  # This gate is 1e-5 off being properly normalized.
85
87
  mixture = _MixtureGate(0.1, 0.9 - 1e-5)
@@ -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 Collection, Optional, Sequence, Union
15
+ from __future__ import annotations
16
+
17
+ from typing import Collection, Sequence
16
18
 
17
19
  import numpy as np
18
20
 
@@ -23,7 +25,7 @@ def assert_controlled_and_controlled_by_identical(
23
25
  gate: ops.Gate,
24
26
  *,
25
27
  num_controls: Sequence[int] = (2, 1, 3, 10),
26
- control_values: Optional[Sequence[Optional[Sequence[Union[int, Collection[int]]]]]] = None,
28
+ control_values: Sequence[Sequence[int | Collection[int]] | None] | None = None,
27
29
  ) -> None:
28
30
  """Checks that gate.on().controlled_by() == gate.controlled().on()"""
29
31
  if control_values is not None:
@@ -50,9 +52,7 @@ def assert_controlled_unitary_consistent(gate: ops.Gate):
50
52
 
51
53
 
52
54
  def _assert_gate_consistent(
53
- gate: ops.Gate,
54
- num_controls: int,
55
- control_values: Optional[Sequence[Union[int, Collection[int]]]],
55
+ gate: ops.Gate, num_controls: int, control_values: Sequence[int | Collection[int]] | None
56
56
  ) -> None:
57
57
  gate_controlled = gate.controlled(num_controls, control_values)
58
58
  qubits = devices.LineQid.for_gate(gate_controlled)
@@ -12,53 +12,53 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Collection, List, Optional, Sequence, Tuple, Union
15
+ from __future__ import annotations
16
+
17
+ from typing import Collection, Sequence, TYPE_CHECKING
16
18
 
17
19
  import numpy as np
18
20
  import pytest
19
21
 
20
22
  import cirq
21
- from cirq.ops import control_values as cv
23
+
24
+ if TYPE_CHECKING:
25
+ from cirq.ops import control_values as cv
22
26
 
23
27
 
24
28
  class GoodGate(cirq.EigenGate, cirq.testing.SingleQubitGate):
25
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]: # pragma: no cover
29
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]: # pragma: no cover
26
30
  return [(0, np.diag([1, 0])), (1, np.diag([0, 1]))]
27
31
 
28
32
 
29
33
  class BadGateOperation(cirq.GateOperation):
30
34
  def controlled_by(
31
35
  self,
32
- *control_qubits: 'cirq.Qid',
33
- control_values: Optional[
34
- Union[cv.AbstractControlValues, Sequence[Union[int, Collection[int]]]]
35
- ] = None,
36
- ) -> 'cirq.Operation':
36
+ *control_qubits: cirq.Qid,
37
+ control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
38
+ ) -> cirq.Operation:
37
39
  return cirq.ControlledOperation(control_qubits, self, control_values)
38
40
 
39
41
 
40
42
  class BadGate(cirq.EigenGate, cirq.testing.SingleQubitGate):
41
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
43
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
42
44
  return [(0, np.diag([1, 0])), (1, np.diag([0, 1]))]
43
45
 
44
- def on(self, *qubits: 'cirq.Qid') -> 'cirq.Operation':
46
+ def on(self, *qubits: cirq.Qid) -> cirq.Operation:
45
47
  return BadGateOperation(self, list(qubits))
46
48
 
47
49
  def controlled(
48
50
  self,
49
- num_controls: Optional[int] = None,
50
- control_values: Optional[
51
- Union[cv.AbstractControlValues, Sequence[Union[int, Collection[int]]]]
52
- ] = None,
53
- control_qid_shape: Optional[Tuple[int, ...]] = None,
54
- ) -> 'cirq.Gate':
51
+ num_controls: int | None = None,
52
+ control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
53
+ control_qid_shape: tuple[int, ...] | None = None,
54
+ ) -> cirq.Gate:
55
55
  ret = super().controlled(num_controls, control_values, control_qid_shape)
56
56
  if num_controls == 1 and control_values is None:
57
57
  return cirq.CZPowGate(exponent=self._exponent, global_shift=self._global_shift)
58
58
  return ret
59
59
 
60
60
 
61
- def test_assert_controlled_and_controlled_by_identical():
61
+ def test_assert_controlled_and_controlled_by_identical() -> None:
62
62
  cirq.testing.assert_controlled_and_controlled_by_identical(GoodGate())
63
63
 
64
64
  with pytest.raises(AssertionError):
@@ -75,7 +75,7 @@ def test_assert_controlled_and_controlled_by_identical():
75
75
  )
76
76
 
77
77
 
78
- def test_assert_controlled_unitary_consistent():
78
+ def test_assert_controlled_unitary_consistent() -> None:
79
79
  cirq.testing.assert_controlled_and_controlled_by_identical(
80
80
  GoodGate(exponent=0.5, global_shift=1 / 3)
81
81
  )
@@ -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 Any
16
18
 
17
19
  import numpy as np
@@ -22,9 +24,7 @@ from cirq.testing import lin_alg_utils
22
24
 
23
25
  def assert_decompose_is_consistent_with_unitary(val: Any, ignoring_global_phase: bool = False):
24
26
  """Uses `val._unitary_` to check `val._phase_by_`'s behavior."""
25
- # pylint: disable=unused-variable
26
27
  __tracebackhide__ = True
27
- # pylint: enable=unused-variable
28
28
 
29
29
  expected = protocols.unitary(val, None)
30
30
  if expected is None:
@@ -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
@@ -35,7 +37,7 @@ class BadGateDecompose(cirq.testing.SingleQubitGate):
35
37
  return np.array([[0, 1], [1, 0]])
36
38
 
37
39
 
38
- def test_assert_decompose_is_consistent_with_unitary():
40
+ def test_assert_decompose_is_consistent_with_unitary() -> None:
39
41
  cirq.testing.assert_decompose_is_consistent_with_unitary(GoodGateDecompose())
40
42
 
41
43
  cirq.testing.assert_decompose_is_consistent_with_unitary(
@@ -89,7 +91,7 @@ class ParameterizedGate(cirq.Gate):
89
91
  yield cirq.Y(qubits[1]) ** sympy.Symbol("y")
90
92
 
91
93
 
92
- def test_assert_decompose_ends_at_default_gateset():
94
+ def test_assert_decompose_ends_at_default_gateset() -> None:
93
95
  cirq.testing.assert_decompose_ends_at_default_gateset(GateDecomposesToDefaultGateset())
94
96
  cirq.testing.assert_decompose_ends_at_default_gateset(
95
97
  GateDecomposesToDefaultGateset().on(*cirq.LineQubit.range(2))
@@ -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 Any
16
18
 
17
19
  import numpy as np
@@ -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
 
@@ -52,7 +54,7 @@ class BadGateInconsistentPauliExpansion(cirq.testing.SingleQubitGate):
52
54
  return cirq.LinearDict({'X': np.sqrt(1 / 6), 'Y': np.sqrt(1 / 3), 'Z': np.sqrt(1 / 2)})
53
55
 
54
56
 
55
- def test_assert_pauli_expansion_is_consistent_with_unitary():
57
+ def test_assert_pauli_expansion_is_consistent_with_unitary() -> None:
56
58
  cirq.testing.assert_pauli_expansion_is_consistent_with_unitary(GoodGateExplicitPauliExpansion())
57
59
  cirq.testing.assert_pauli_expansion_is_consistent_with_unitary(GoodGateNoPauliExpansion())
58
60
  cirq.testing.assert_pauli_expansion_is_consistent_with_unitary(GoodGateNoUnitary())
@@ -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 Any
16
18
 
17
19
  import numpy as np
@@ -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
 
@@ -89,7 +91,7 @@ class SemiBadPhaser:
89
91
  return SemiBadPhaser([resolver.value_of(val, recursive) for val in self.e])
90
92
 
91
93
 
92
- def test_assert_phase_by_is_consistent_with_unitary():
94
+ def test_assert_phase_by_is_consistent_with_unitary() -> None:
93
95
  cirq.testing.assert_phase_by_is_consistent_with_unitary(GoodPhaser(0.5))
94
96
 
95
97
  cirq.testing.assert_phase_by_is_consistent_with_unitary(GoodQuditPhaser(0.5))
@@ -12,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import itertools
16
- from typing import Any, Dict, Optional, Sequence, Type
18
+ from typing import Any, Sequence
17
19
 
18
20
  import numpy as np
19
21
  import sympy
@@ -47,11 +49,11 @@ def assert_implements_consistent_protocols(
47
49
  val: Any,
48
50
  *,
49
51
  exponents: Sequence[Any] = (0, 1, -1, 0.25, sympy.Symbol('s')),
50
- qubit_count: Optional[int] = None,
52
+ qubit_count: int | None = None,
51
53
  ignoring_global_phase: bool = False,
52
54
  setup_code: str = 'import cirq\nimport numpy as np\nimport sympy',
53
- global_vals: Optional[Dict[str, Any]] = None,
54
- local_vals: Optional[Dict[str, Any]] = None,
55
+ global_vals: dict[str, Any] | None = None,
56
+ local_vals: dict[str, Any] | None = None,
55
57
  ignore_decompose_to_default_gateset: bool = False,
56
58
  ) -> None:
57
59
  """Checks that a value is internally consistent and has a good __repr__."""
@@ -81,22 +83,20 @@ def assert_implements_consistent_protocols(
81
83
 
82
84
 
83
85
  def assert_eigengate_implements_consistent_protocols(
84
- eigen_gate_type: Type[ops.EigenGate],
86
+ eigen_gate_type: type[ops.EigenGate],
85
87
  *,
86
88
  exponents: Sequence[value.TParamVal] = (0, 1, -1, 0.25, sympy.Symbol('s')),
87
89
  global_shifts: Sequence[float] = (0, -0.5, 0.1),
88
- qubit_count: Optional[int] = None,
90
+ qubit_count: int | None = None,
89
91
  ignoring_global_phase: bool = False,
90
92
  setup_code: str = 'import cirq\nimport numpy as np\nimport sympy',
91
- global_vals: Optional[Dict[str, Any]] = None,
92
- local_vals: Optional[Dict[str, Any]] = None,
93
+ global_vals: dict[str, Any] | None = None,
94
+ local_vals: dict[str, Any] | None = None,
93
95
  ignore_decompose_to_default_gateset: bool = False,
94
96
  ) -> None:
95
97
  """Checks that an EigenGate subclass is internally consistent and has a
96
98
  good __repr__."""
97
- # pylint: disable=unused-variable
98
99
  __tracebackhide__ = True
99
- # pylint: enable=unused-variable
100
100
 
101
101
  for exponent in exponents:
102
102
  for shift in global_shifts:
@@ -111,9 +111,7 @@ def assert_eigengate_implements_consistent_protocols(
111
111
 
112
112
 
113
113
  def assert_eigen_shifts_is_consistent_with_eigen_components(val: ops.EigenGate) -> None:
114
- # pylint: disable=unused-variable
115
114
  __tracebackhide__ = True
116
- # pylint: enable=unused-variable
117
115
  if not protocols.is_parameterized(val):
118
116
  assert val._eigen_shifts() == [
119
117
  e[0] for e in val._eigen_components()
@@ -121,9 +119,7 @@ def assert_eigen_shifts_is_consistent_with_eigen_components(val: ops.EigenGate)
121
119
 
122
120
 
123
121
  def assert_has_consistent_trace_distance_bound(val: Any) -> None:
124
- # pylint: disable=unused-variable
125
122
  __tracebackhide__ = True
126
- # pylint: enable=unused-variable
127
123
  u = protocols.unitary(val, default=None)
128
124
  val_from_trace = protocols.trace_distance_bound(val)
129
125
  assert 0.0 <= val_from_trace <= 1.0
@@ -143,11 +139,11 @@ def _assert_meets_standards_helper(
143
139
  *,
144
140
  ignoring_global_phase: bool,
145
141
  setup_code: str,
146
- global_vals: Optional[Dict[str, Any]],
147
- local_vals: Optional[Dict[str, Any]],
142
+ global_vals: dict[str, Any] | None,
143
+ local_vals: dict[str, Any] | None,
148
144
  ignore_decompose_to_default_gateset: bool,
149
145
  ) -> None:
150
- __tracebackhide__ = True # pylint: disable=unused-variable
146
+ __tracebackhide__ = True
151
147
 
152
148
  assert_consistent_resolve_parameters(val)
153
149
  assert_specifies_has_unitary_if_unitary(val)
@@ -174,9 +170,7 @@ def _assert_meets_standards_helper(
174
170
  assert_controlled_unitary_consistent(val)
175
171
 
176
172
 
177
- def assert_commutes_magic_method_consistent_with_unitaries(
178
- *vals: Sequence[Any], atol: float = 1e-8
179
- ) -> None:
173
+ def assert_commutes_magic_method_consistent_with_unitaries(*vals: Any, atol: float = 1e-8) -> None:
180
174
  if any(isinstance(val, ops.Operation) for val in vals):
181
175
  raise TypeError('`_commutes_` need not be consistent with unitaries for `Operation`.')
182
176
  unitaries = [protocols.unitary(val, None) for val in vals]
@@ -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 AbstractSet, List, Sequence, Tuple, Union
18
+ from typing import AbstractSet, Sequence
17
19
 
18
20
  import numpy as np
19
21
  import pytest
@@ -26,7 +28,7 @@ from cirq._compat import proper_repr
26
28
 
27
29
  class GoodGate(cirq.testing.SingleQubitGate):
28
30
  def __init__(
29
- self, *, phase_exponent: Union[float, sympy.Expr], exponent: Union[float, sympy.Expr] = 1.0
31
+ self, *, phase_exponent: float | sympy.Expr, exponent: float | sympy.Expr = 1.0
30
32
  ) -> None:
31
33
  self.phase_exponent = cirq.canonicalize_half_turns(phase_exponent)
32
34
  self.exponent = exponent
@@ -34,14 +36,14 @@ class GoodGate(cirq.testing.SingleQubitGate):
34
36
  def _has_unitary_(self):
35
37
  return not cirq.is_parameterized(self)
36
38
 
37
- def _unitary_(self) -> Union[np.ndarray, NotImplementedType]:
39
+ def _unitary_(self) -> np.ndarray | NotImplementedType:
38
40
  if cirq.is_parameterized(self):
39
41
  return NotImplemented
40
42
  z = cirq.unitary(cirq.Z**self.phase_exponent)
41
43
  x = cirq.unitary(cirq.X**self.exponent)
42
44
  return np.dot(np.dot(z, x), np.conj(z))
43
45
 
44
- def _apply_unitary_(self, args: cirq.ApplyUnitaryArgs) -> Union[np.ndarray, NotImplementedType]:
46
+ def _apply_unitary_(self, args: cirq.ApplyUnitaryArgs) -> np.ndarray | NotImplementedType:
45
47
  if self.exponent != 1 or cirq.is_parameterized(self):
46
48
  return NotImplemented
47
49
 
@@ -83,7 +85,7 @@ class GoodGate(cirq.testing.SingleQubitGate):
83
85
  exponent=self.exponent, phase_exponent=self.phase_exponent + phase_turns * 2
84
86
  )
85
87
 
86
- def __pow__(self, exponent: Union[float, sympy.Expr]) -> 'GoodGate':
88
+ def __pow__(self, exponent: float | sympy.Expr) -> GoodGate:
87
89
  new_exponent = cirq.mul(self.exponent, exponent, NotImplemented)
88
90
  if new_exponent is NotImplemented:
89
91
  return NotImplemented # pragma: no cover
@@ -101,7 +103,7 @@ class GoodGate(cirq.testing.SingleQubitGate):
101
103
  def _parameter_names_(self) -> AbstractSet[str]:
102
104
  return cirq.parameter_names(self.exponent) | cirq.parameter_names(self.phase_exponent)
103
105
 
104
- def _resolve_parameters_(self, resolver, recursive) -> 'GoodGate':
106
+ def _resolve_parameters_(self, resolver, recursive) -> GoodGate:
105
107
  return GoodGate(
106
108
  phase_exponent=resolver.value_of(self.phase_exponent, recursive),
107
109
  exponent=resolver.value_of(self.exponent, recursive),
@@ -127,7 +129,7 @@ class BadGateParameterNames(GoodGate):
127
129
 
128
130
 
129
131
  class BadGateApplyUnitaryToTensor(GoodGate):
130
- def _apply_unitary_(self, args: cirq.ApplyUnitaryArgs) -> Union[np.ndarray, NotImplementedType]:
132
+ def _apply_unitary_(self, args: cirq.ApplyUnitaryArgs) -> np.ndarray | NotImplementedType:
131
133
  if self.exponent != 1 or cirq.is_parameterized(self):
132
134
  return NotImplemented # pragma: no cover
133
135
 
@@ -176,7 +178,7 @@ class BadGateRepr(GoodGate):
176
178
 
177
179
 
178
180
  class GoodEigenGate(cirq.EigenGate, cirq.testing.SingleQubitGate):
179
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
181
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
180
182
  return [(0, np.diag([1, 0])), (1, np.diag([0, 1]))]
181
183
 
182
184
  def __repr__(self):
@@ -199,7 +201,7 @@ class BadEigenGate(GoodEigenGate):
199
201
  )
200
202
 
201
203
 
202
- def test_assert_implements_consistent_protocols():
204
+ def test_assert_implements_consistent_protocols() -> None:
203
205
  cirq.testing.assert_implements_consistent_protocols(
204
206
  GoodGate(phase_exponent=0.0), global_vals={'GoodGate': GoodGate}
205
207
  )
@@ -247,7 +249,7 @@ def test_assert_implements_consistent_protocols():
247
249
  cirq.testing.assert_implements_consistent_protocols(controlled_gate_op_test.BadGate())
248
250
 
249
251
 
250
- def test_assert_eigengate_implements_consistent_protocols():
252
+ def test_assert_eigengate_implements_consistent_protocols() -> None:
251
253
  cirq.testing.assert_eigengate_implements_consistent_protocols(
252
254
  GoodEigenGate,
253
255
  global_vals={'GoodEigenGate': GoodEigenGate},
@@ -262,7 +264,7 @@ def test_assert_eigengate_implements_consistent_protocols():
262
264
  )
263
265
 
264
266
 
265
- def test_assert_commutes_magic_method_consistent_with_unitaries():
267
+ def test_assert_commutes_magic_method_consistent_with_unitaries() -> None:
266
268
  gate_op = cirq.CNOT(*cirq.LineQubit.range(2))
267
269
  with pytest.raises(TypeError):
268
270
  cirq.testing.assert_commutes_magic_method_consistent_with_unitaries(gate_op)
@@ -12,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import warnings
16
- from typing import Any, List, Optional, Sequence
18
+ from typing import Any, Sequence
17
19
 
18
20
  import numpy as np
19
21
 
@@ -85,8 +87,8 @@ qreg q[{num_qubits}];
85
87
  qasm_unitary, unitary, rtol=1e-8, atol=1e-8
86
88
  )
87
89
  except Exception as ex:
88
- p_unitary: Optional[np.ndarray]
89
- p_qasm_unitary: Optional[np.ndarray]
90
+ p_unitary: np.ndarray | None
91
+ p_qasm_unitary: np.ndarray | None
90
92
  if qasm_unitary is not None:
91
93
  p_unitary, p_qasm_unitary = linalg.match_global_phase(unitary, qasm_unitary)
92
94
  else:
@@ -125,7 +127,7 @@ def _indent(*content: str) -> str:
125
127
  return ' ' + '\n'.join(content).replace('\n', '\n ')
126
128
 
127
129
 
128
- def _reorder_indices_of_matrix(matrix: np.ndarray, new_order: List[int]):
130
+ def _reorder_indices_of_matrix(matrix: np.ndarray, new_order: list[int]):
129
131
  num_qubits = matrix.shape[0].bit_length() - 1
130
132
  matrix = np.reshape(matrix, (2,) * 2 * num_qubits)
131
133
  all_indices = range(2 * num_qubits)
@@ -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
+
17
+ import importlib.util
15
18
  import warnings
16
- from typing import Tuple
17
19
 
18
20
  import numpy as np
19
21
  import pytest
@@ -41,20 +43,18 @@ class Fixed(cirq.Operation):
41
43
 
42
44
 
43
45
  class QuditGate(cirq.Gate):
44
- def _qid_shape_(self) -> Tuple[int, ...]:
46
+ def _qid_shape_(self) -> tuple[int, ...]:
45
47
  return (3, 3)
46
48
 
47
49
  def _unitary_(self):
48
50
  return np.eye(9)
49
51
 
50
- def _qasm_(self, args: cirq.QasmArgs, qubits: Tuple[cirq.Qid, ...]):
52
+ def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]):
51
53
  return NotImplemented
52
54
 
53
55
 
54
- def test_assert_qasm_is_consistent_with_unitary():
55
- try:
56
- import qiskit as _
57
- except ImportError: # pragma: no cover
56
+ def test_assert_qasm_is_consistent_with_unitary() -> None:
57
+ if importlib.util.find_spec('qiskit') is None: # pragma: no cover
58
58
  warnings.warn(
59
59
  "Skipped test_assert_qasm_is_consistent_with_unitary "
60
60
  "because qiskit isn't installed to verify against."
@@ -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 Any
16
18
 
17
19
  import sympy
@@ -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 Any
16
18
 
17
19
  from cirq import protocols
@@ -20,9 +22,7 @@ from cirq import protocols
20
22
  def assert_specifies_has_unitary_if_unitary(val: Any) -> None:
21
23
  """Checks that unitary values can be cheaply identifies as unitary."""
22
24
 
23
- # pylint: disable=unused-variable
24
25
  __tracebackhide__ = True
25
- # pylint: enable=unused-variable
26
26
 
27
27
  assert not protocols.has_unitary(val) or hasattr(val, '_has_unitary_'), (
28
28
  "Value is unitary but doesn't specify a _has_unitary_ method that "
@@ -12,13 +12,15 @@
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
 
18
20
  import cirq
19
21
 
20
22
 
21
- def test_assert_specifies_has_unitary_if_unitary_from_matrix():
23
+ def test_assert_specifies_has_unitary_if_unitary_from_matrix() -> None:
22
24
  class Bad:
23
25
  def _unitary_(self):
24
26
  return np.array([[1]])
@@ -28,7 +30,7 @@ def test_assert_specifies_has_unitary_if_unitary_from_matrix():
28
30
  cirq.testing.assert_specifies_has_unitary_if_unitary(Bad())
29
31
 
30
32
 
31
- def test_assert_specifies_has_unitary_if_unitary_from_apply():
33
+ def test_assert_specifies_has_unitary_if_unitary_from_apply() -> None:
32
34
  class Bad(cirq.Operation):
33
35
  @property
34
36
  def qubits(self):
@@ -45,7 +47,7 @@ def test_assert_specifies_has_unitary_if_unitary_from_apply():
45
47
  cirq.testing.assert_specifies_has_unitary_if_unitary(Bad())
46
48
 
47
49
 
48
- def test_assert_specifies_has_unitary_if_unitary_from_decompose():
50
+ def test_assert_specifies_has_unitary_if_unitary_from_decompose() -> None:
49
51
  class Bad:
50
52
  def _decompose_(self):
51
53
  return []
@@ -70,7 +72,7 @@ def test_assert_specifies_has_unitary_if_unitary_from_decompose():
70
72
  cirq.testing.assert_specifies_has_unitary_if_unitary(Okay())
71
73
 
72
74
 
73
- def test_assert_specifies_has_unitary_if_unitary_pass():
75
+ def test_assert_specifies_has_unitary_if_unitary_pass() -> None:
74
76
  class Good:
75
77
  def _has_unitary_(self):
76
78
  return True
@@ -12,6 +12,7 @@
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
15
16
 
16
17
  from typing import Any
17
18
 
@@ -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
 
@@ -78,7 +80,7 @@ class CleanCorrectButBorrowableIncorrectGate(cirq.Gate):
78
80
  (CleanCorrectButBorrowableIncorrectGate(use_clean_ancilla=False), False),
79
81
  ],
80
82
  )
81
- def test_assert_unitary_is_consistent(g, ignore_phase, is_consistent):
83
+ def test_assert_unitary_is_consistent(g, ignore_phase, is_consistent) -> None:
82
84
  if is_consistent:
83
85
  cirq.testing.assert_unitary_is_consistent(g, ignore_phase)
84
86
  cirq.testing.assert_unitary_is_consistent(g.on(*cirq.LineQid.for_gate(g)), ignore_phase)
@@ -89,7 +91,7 @@ def test_assert_unitary_is_consistent(g, ignore_phase, is_consistent):
89
91
  cirq.testing.assert_unitary_is_consistent(g.on(*cirq.LineQid.for_gate(g)), ignore_phase)
90
92
 
91
93
 
92
- def test_failed_decomposition():
94
+ def test_failed_decomposition() -> None:
93
95
  with pytest.raises(ValueError):
94
96
  cirq.testing.assert_unitary_is_consistent(FailsOnDecompostion())
95
97