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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,12 +12,14 @@
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
18
  import os
17
19
  import time
18
20
  from collections import defaultdict
19
21
  from random import randint, random, randrange, sample
20
- from typing import Iterator, Optional, Tuple
22
+ from typing import Iterator, Sequence
21
23
 
22
24
  import numpy as np
23
25
  import pytest
@@ -53,7 +55,7 @@ BCONE = ValidatingTestDevice(
53
55
  q0, q1, q2, q3 = cirq.LineQubit.range(4)
54
56
 
55
57
 
56
- def test_from_moments():
58
+ def test_from_moments() -> None:
57
59
  a, b, c, d = cirq.LineQubit.range(4)
58
60
  moment = cirq.Moment(cirq.Z(a), cirq.Z(b))
59
61
  subcircuit = cirq.FrozenCircuit.from_moments(cirq.X(c), cirq.Y(d))
@@ -81,15 +83,16 @@ def test_from_moments():
81
83
  cirq.Moment(cirq.measure(a, b, key='ab'), cirq.measure(c, d, key='cd')),
82
84
  )
83
85
  assert circuit[0] is moment
86
+ assert isinstance(circuit[1].operations[0], cirq.CircuitOperation)
84
87
  assert circuit[1].operations[0].circuit is subcircuit
85
88
 
86
89
 
87
- def test_alignment():
90
+ def test_alignment() -> None:
88
91
  assert repr(cirq.Alignment.LEFT) == 'cirq.Alignment.LEFT'
89
92
  assert repr(cirq.Alignment.RIGHT) == 'cirq.Alignment.RIGHT'
90
93
 
91
94
 
92
- def test_setitem():
95
+ def test_setitem() -> None:
93
96
  circuit = cirq.Circuit([cirq.Moment(), cirq.Moment()])
94
97
 
95
98
  circuit[1] = cirq.Moment([cirq.X(cirq.LineQubit(0))])
@@ -110,7 +113,7 @@ def test_setitem():
110
113
 
111
114
 
112
115
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
113
- def test_equality(circuit_cls):
116
+ def test_equality(circuit_cls) -> None:
114
117
  a = cirq.NamedQubit('a')
115
118
  b = cirq.NamedQubit('b')
116
119
 
@@ -140,7 +143,7 @@ def test_equality(circuit_cls):
140
143
 
141
144
 
142
145
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
143
- def test_approx_eq(circuit_cls):
146
+ def test_approx_eq(circuit_cls) -> None:
144
147
  a = cirq.NamedQubit('a')
145
148
  b = cirq.NamedQubit('b')
146
149
 
@@ -169,7 +172,7 @@ def test_approx_eq(circuit_cls):
169
172
  )
170
173
 
171
174
 
172
- def test_append_single():
175
+ def test_append_single() -> None:
173
176
  a = cirq.NamedQubit('a')
174
177
 
175
178
  c = cirq.Circuit()
@@ -191,7 +194,7 @@ def test_append_single():
191
194
  )
192
195
 
193
196
 
194
- def test_append_control_key():
197
+ def test_append_control_key() -> None:
195
198
  q0, q1, q2 = cirq.LineQubit.range(3)
196
199
  c = cirq.Circuit()
197
200
  c.append(cirq.measure(q0, key='a'))
@@ -205,7 +208,7 @@ def test_append_control_key():
205
208
  assert len(c) == 1
206
209
 
207
210
 
208
- def test_append_multiple():
211
+ def test_append_multiple() -> None:
209
212
  a = cirq.NamedQubit('a')
210
213
  b = cirq.NamedQubit('b')
211
214
 
@@ -223,7 +226,7 @@ def test_append_multiple():
223
226
  assert c == cirq.Circuit([cirq.Moment([cirq.X(a), cirq.X(b)])])
224
227
 
225
228
 
226
- def test_append_control_key_subcircuit():
229
+ def test_append_control_key_subcircuit() -> None:
227
230
  q0, q1 = cirq.LineQubit.range(2)
228
231
 
229
232
  c = cirq.Circuit()
@@ -289,7 +292,7 @@ def test_append_control_key_subcircuit():
289
292
  assert len(c) == 1
290
293
 
291
294
 
292
- def test_measurement_key_paths():
295
+ def test_measurement_key_paths() -> None:
293
296
  a = cirq.LineQubit(0)
294
297
  circuit1 = cirq.Circuit(cirq.measure(a, key='A'))
295
298
  assert cirq.measurement_key_names(circuit1) == {'A'}
@@ -299,7 +302,7 @@ def test_measurement_key_paths():
299
302
  assert cirq.measurement_key_names(circuit3) == {'C:B:A'}
300
303
 
301
304
 
302
- def test_append_moments():
305
+ def test_append_moments() -> None:
303
306
  a = cirq.NamedQubit('a')
304
307
  b = cirq.NamedQubit('b')
305
308
 
@@ -318,7 +321,7 @@ def test_append_moments():
318
321
 
319
322
 
320
323
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
321
- def test_add_op_tree(circuit_cls):
324
+ def test_add_op_tree(circuit_cls) -> None:
322
325
  a = cirq.NamedQubit('a')
323
326
  b = cirq.NamedQubit('b')
324
327
 
@@ -335,7 +338,7 @@ def test_add_op_tree(circuit_cls):
335
338
 
336
339
 
337
340
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
338
- def test_radd_op_tree(circuit_cls):
341
+ def test_radd_op_tree(circuit_cls) -> None:
339
342
  a = cirq.NamedQubit('a')
340
343
  b = cirq.NamedQubit('b')
341
344
 
@@ -353,6 +356,7 @@ def test_radd_op_tree(circuit_cls):
353
356
  _ = 0 + c
354
357
 
355
358
  # non-empty circuit addition
359
+ d: cirq.AbstractCircuit
356
360
  if circuit_cls == cirq.FrozenCircuit:
357
361
  d = cirq.FrozenCircuit(cirq.Y(b))
358
362
  else:
@@ -364,7 +368,7 @@ def test_radd_op_tree(circuit_cls):
364
368
  )
365
369
 
366
370
 
367
- def test_add_iadd_equivalence():
371
+ def test_add_iadd_equivalence() -> None:
368
372
  q0, q1 = cirq.LineQubit.range(2)
369
373
  iadd_circuit = cirq.Circuit(cirq.X(q0))
370
374
  iadd_circuit += cirq.H(q1)
@@ -374,13 +378,13 @@ def test_add_iadd_equivalence():
374
378
 
375
379
 
376
380
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
377
- def test_bool(circuit_cls):
381
+ def test_bool(circuit_cls) -> None:
378
382
  assert not circuit_cls()
379
383
  assert circuit_cls(cirq.X(cirq.NamedQubit('a')))
380
384
 
381
385
 
382
386
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
383
- def test_repr(circuit_cls):
387
+ def test_repr(circuit_cls) -> None:
384
388
  assert repr(circuit_cls()) == f'cirq.{circuit_cls.__name__}()'
385
389
 
386
390
  a = cirq.NamedQubit('a')
@@ -405,7 +409,7 @@ def test_repr(circuit_cls):
405
409
 
406
410
 
407
411
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
408
- def test_empty_moments(circuit_cls):
412
+ def test_empty_moments(circuit_cls) -> None:
409
413
  # 1-qubit test
410
414
  op = cirq.X(cirq.NamedQubit('a'))
411
415
  op_moment = cirq.Moment([op])
@@ -510,7 +514,7 @@ a b
510
514
 
511
515
 
512
516
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
513
- def test_symbol_addition_in_gate_exponent(circuit_cls):
517
+ def test_symbol_addition_in_gate_exponent(circuit_cls) -> None:
514
518
  # 1-qubit test
515
519
  qubit = cirq.NamedQubit('a')
516
520
  circuit = circuit_cls(
@@ -556,7 +560,7 @@ Y^(a + b)
556
560
 
557
561
 
558
562
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
559
- def test_slice(circuit_cls):
563
+ def test_slice(circuit_cls) -> None:
560
564
  a = cirq.NamedQubit('a')
561
565
  b = cirq.NamedQubit('b')
562
566
  c = circuit_cls(
@@ -581,7 +585,7 @@ def test_slice(circuit_cls):
581
585
  assert c[0:2:-1] == circuit_cls()
582
586
 
583
587
 
584
- def test_concatenate():
588
+ def test_concatenate() -> None:
585
589
  a = cirq.NamedQubit('a')
586
590
  b = cirq.NamedQubit('b')
587
591
 
@@ -614,7 +618,7 @@ def test_concatenate():
614
618
 
615
619
 
616
620
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
617
- def test_multiply(circuit_cls):
621
+ def test_multiply(circuit_cls) -> None:
618
622
  a = cirq.NamedQubit('a')
619
623
 
620
624
  c = circuit_cls()
@@ -648,7 +652,7 @@ def test_multiply(circuit_cls):
648
652
 
649
653
 
650
654
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
651
- def test_container_methods(circuit_cls):
655
+ def test_container_methods(circuit_cls) -> None:
652
656
  a = cirq.NamedQubit('a')
653
657
  b = cirq.NamedQubit('b')
654
658
  c = circuit_cls(
@@ -670,7 +674,7 @@ def test_container_methods(circuit_cls):
670
674
 
671
675
 
672
676
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
673
- def test_bad_index(circuit_cls):
677
+ def test_bad_index(circuit_cls) -> None:
674
678
  a = cirq.NamedQubit('a')
675
679
  b = cirq.NamedQubit('b')
676
680
  c = circuit_cls([cirq.Moment([cirq.H(a), cirq.H(b)])])
@@ -678,7 +682,7 @@ def test_bad_index(circuit_cls):
678
682
  _ = c['string']
679
683
 
680
684
 
681
- def test_append_strategies():
685
+ def test_append_strategies() -> None:
682
686
  a = cirq.NamedQubit('a')
683
687
  b = cirq.NamedQubit('b')
684
688
  stream = [cirq.X(a), cirq.CZ(a, b), cirq.X(b), cirq.X(b), cirq.X(a)]
@@ -718,7 +722,7 @@ def test_append_strategies():
718
722
  )
719
723
 
720
724
 
721
- def test_insert_op_tree_new():
725
+ def test_insert_op_tree_new() -> None:
722
726
  a = cirq.NamedQubit('alice')
723
727
  b = cirq.NamedQubit('bob')
724
728
  c = cirq.Circuit()
@@ -751,7 +755,7 @@ def test_insert_op_tree_new():
751
755
  c.insert(1, cirq.X(a), BAD_INSERT)
752
756
 
753
757
 
754
- def test_insert_op_tree_newinline():
758
+ def test_insert_op_tree_newinline() -> None:
755
759
  a = cirq.NamedQubit('alice')
756
760
  b = cirq.NamedQubit('bob')
757
761
  c = cirq.Circuit()
@@ -776,7 +780,7 @@ def test_insert_op_tree_newinline():
776
780
  assert c == c2
777
781
 
778
782
 
779
- def test_insert_op_tree_inline():
783
+ def test_insert_op_tree_inline() -> None:
780
784
  a = cirq.NamedQubit('alice')
781
785
  b = cirq.NamedQubit('bob')
782
786
  c = cirq.Circuit([cirq.Moment([cirq.H(a)])])
@@ -796,7 +800,7 @@ def test_insert_op_tree_inline():
796
800
  assert c.operation_at(qubits[i], actual_index) == op_list[i]
797
801
 
798
802
 
799
- def test_insert_op_tree_earliest():
803
+ def test_insert_op_tree_earliest() -> None:
800
804
  a = cirq.NamedQubit('alice')
801
805
  b = cirq.NamedQubit('bob')
802
806
  c = cirq.Circuit([cirq.Moment([cirq.H(a)])])
@@ -813,7 +817,7 @@ def test_insert_op_tree_earliest():
813
817
  assert c.operation_at(qubits[i], actual_index[i]) == op_list[i]
814
818
 
815
819
 
816
- def test_insert_moment():
820
+ def test_insert_moment() -> None:
817
821
  a = cirq.NamedQubit('alice')
818
822
  b = cirq.NamedQubit('bob')
819
823
  c = cirq.Circuit()
@@ -831,18 +835,18 @@ def test_insert_moment():
831
835
  assert c.operation_at(qubit, actual_index) == operation[0]
832
836
 
833
837
 
834
- def test_circuit_length_inference():
838
+ def test_circuit_length_inference() -> None:
835
839
  # tests that `get_earliest_accommodating_moment_index` properly computes circuit length
836
840
  circuit = cirq.Circuit(cirq.X(cirq.q(0)))
837
- qubit_indices = {cirq.q(0): 0}
838
- mkey_indices = {}
839
- ckey_indices = {}
841
+ qubit_indices: dict[cirq.Qid, int] = {cirq.q(0): 0}
842
+ mkey_indices: dict[cirq.MeasurementKey, int] = {}
843
+ ckey_indices: dict[cirq.MeasurementKey, int] = {}
840
844
  assert circuits.circuit.get_earliest_accommodating_moment_index(
841
845
  cirq.Moment(), qubit_indices, mkey_indices, ckey_indices
842
846
  ) == len(circuit)
843
847
 
844
848
 
845
- def test_insert_inline_near_start():
849
+ def test_insert_inline_near_start() -> None:
846
850
  a = cirq.NamedQubit('a')
847
851
  b = cirq.NamedQubit('b')
848
852
 
@@ -865,7 +869,7 @@ def test_insert_inline_near_start():
865
869
  )
866
870
 
867
871
 
868
- def test_insert_at_frontier_init():
872
+ def test_insert_at_frontier_init() -> None:
869
873
  x = cirq.NamedQubit('x')
870
874
  op = cirq.X(x)
871
875
  circuit = cirq.Circuit(op)
@@ -880,11 +884,11 @@ def test_insert_at_frontier_init():
880
884
 
881
885
  with pytest.raises(ValueError):
882
886
  circuit = cirq.Circuit([cirq.Moment(), cirq.Moment([op])])
883
- frontier = {x: 2}
887
+ frontier: dict[cirq.Qid, int] = {x: 2}
884
888
  circuit.insert_at_frontier(op, 0, frontier)
885
889
 
886
890
 
887
- def test_insert_at_frontier():
891
+ def test_insert_at_frontier() -> None:
888
892
  class Replacer(cirq.PointOptimizer):
889
893
  def __init__(self, replacer=(lambda x: x)):
890
894
  super().__init__()
@@ -892,7 +896,7 @@ def test_insert_at_frontier():
892
896
 
893
897
  def optimization_at(
894
898
  self, circuit: cirq.Circuit, index: int, op: cirq.Operation
895
- ) -> Optional[cirq.PointOptimizationSummary]:
899
+ ) -> cirq.PointOptimizationSummary | None:
896
900
  new_ops = self.replacer(op)
897
901
  return cirq.PointOptimizationSummary(
898
902
  clear_span=1, clear_qubits=op.qubits, new_operations=new_ops
@@ -989,7 +993,7 @@ d: ───@───────@───────
989
993
  )
990
994
 
991
995
 
992
- def test_insert_into_range():
996
+ def test_insert_into_range() -> None:
993
997
  x = cirq.NamedQubit('x')
994
998
  y = cirq.NamedQubit('y')
995
999
  c = cirq.Circuit([cirq.Moment([cirq.X(x)])] * 4)
@@ -1038,7 +1042,7 @@ y: ───T───Y───Y───@───Y───@───H──
1038
1042
 
1039
1043
 
1040
1044
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1041
- def test_next_moment_operating_on(circuit_cls):
1045
+ def test_next_moment_operating_on(circuit_cls) -> None:
1042
1046
  a = cirq.NamedQubit('a')
1043
1047
  b = cirq.NamedQubit('b')
1044
1048
 
@@ -1078,7 +1082,7 @@ def test_next_moment_operating_on(circuit_cls):
1078
1082
 
1079
1083
 
1080
1084
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1081
- def test_next_moment_operating_on_distance(circuit_cls):
1085
+ def test_next_moment_operating_on_distance(circuit_cls) -> None:
1082
1086
  a = cirq.NamedQubit('a')
1083
1087
 
1084
1088
  c = circuit_cls(
@@ -1117,7 +1121,7 @@ def test_next_moment_operating_on_distance(circuit_cls):
1117
1121
 
1118
1122
 
1119
1123
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1120
- def test_prev_moment_operating_on(circuit_cls):
1124
+ def test_prev_moment_operating_on(circuit_cls) -> None:
1121
1125
  a = cirq.NamedQubit('a')
1122
1126
  b = cirq.NamedQubit('b')
1123
1127
 
@@ -1160,7 +1164,7 @@ def test_prev_moment_operating_on(circuit_cls):
1160
1164
 
1161
1165
 
1162
1166
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1163
- def test_prev_moment_operating_on_distance(circuit_cls):
1167
+ def test_prev_moment_operating_on_distance(circuit_cls) -> None:
1164
1168
  a = cirq.NamedQubit('a')
1165
1169
 
1166
1170
  c = circuit_cls(
@@ -1200,7 +1204,7 @@ def test_prev_moment_operating_on_distance(circuit_cls):
1200
1204
  c.prev_moment_operating_on([a], 6, max_distance=-1)
1201
1205
 
1202
1206
 
1203
- def test_earliest_available_moment():
1207
+ def test_earliest_available_moment() -> None:
1204
1208
  q = cirq.LineQubit.range(3)
1205
1209
  c = cirq.Circuit(
1206
1210
  cirq.Moment(cirq.measure(q[0], key="m")),
@@ -1223,7 +1227,7 @@ def test_earliest_available_moment():
1223
1227
 
1224
1228
 
1225
1229
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1226
- def test_operation_at(circuit_cls):
1230
+ def test_operation_at(circuit_cls) -> None:
1227
1231
  a = cirq.NamedQubit('a')
1228
1232
  b = cirq.NamedQubit('b')
1229
1233
 
@@ -1246,7 +1250,7 @@ def test_operation_at(circuit_cls):
1246
1250
 
1247
1251
 
1248
1252
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1249
- def test_findall_operations(circuit_cls):
1253
+ def test_findall_operations(circuit_cls) -> None:
1250
1254
  a = cirq.NamedQubit('a')
1251
1255
  b = cirq.NamedQubit('b')
1252
1256
 
@@ -1290,7 +1294,7 @@ def test_findall_operations(circuit_cls):
1290
1294
 
1291
1295
 
1292
1296
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1293
- def test_findall_operations_with_gate(circuit_cls):
1297
+ def test_findall_operations_with_gate(circuit_cls) -> None:
1294
1298
  a = cirq.NamedQubit('a')
1295
1299
  b = cirq.NamedQubit('b')
1296
1300
  c = circuit_cls(
@@ -1318,7 +1322,7 @@ def test_findall_operations_with_gate(circuit_cls):
1318
1322
 
1319
1323
  def assert_findall_operations_until_blocked_as_expected(
1320
1324
  circuit=None, start_frontier=None, is_blocker=None, expected_ops=None
1321
- ):
1325
+ ) -> None:
1322
1326
  if circuit is None:
1323
1327
  circuit = cirq.Circuit()
1324
1328
  if start_frontier is None:
@@ -1336,7 +1340,7 @@ def assert_findall_operations_until_blocked_as_expected(
1336
1340
 
1337
1341
 
1338
1342
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1339
- def test_findall_operations_until_blocked(circuit_cls):
1343
+ def test_findall_operations_until_blocked(circuit_cls) -> None:
1340
1344
  a, b, c, d = cirq.LineQubit.range(4)
1341
1345
 
1342
1346
  assert_findall_operations_until_blocked_as_expected()
@@ -1503,7 +1507,7 @@ def test_findall_operations_until_blocked(circuit_cls):
1503
1507
 
1504
1508
  @pytest.mark.parametrize('seed', [randint(0, 2**31)])
1505
1509
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1506
- def test_findall_operations_until_blocked_docstring_examples(seed, circuit_cls):
1510
+ def test_findall_operations_until_blocked_docstring_examples(seed, circuit_cls) -> None:
1507
1511
  prng = np.random.RandomState(seed)
1508
1512
 
1509
1513
  class ExampleGate(cirq.Gate):
@@ -1616,7 +1620,7 @@ def test_findall_operations_until_blocked_docstring_examples(seed, circuit_cls):
1616
1620
 
1617
1621
 
1618
1622
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1619
- def test_has_measurements(circuit_cls):
1623
+ def test_has_measurements(circuit_cls) -> None:
1620
1624
  a = cirq.NamedQubit('a')
1621
1625
  b = cirq.NamedQubit('b')
1622
1626
 
@@ -1661,7 +1665,7 @@ def test_has_measurements(circuit_cls):
1661
1665
 
1662
1666
 
1663
1667
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1664
- def test_are_all_or_any_measurements_terminal(circuit_cls):
1668
+ def test_are_all_or_any_measurements_terminal(circuit_cls) -> None:
1665
1669
  a = cirq.NamedQubit('a')
1666
1670
  b = cirq.NamedQubit('b')
1667
1671
 
@@ -1717,7 +1721,7 @@ def test_are_all_or_any_measurements_terminal(circuit_cls):
1717
1721
 
1718
1722
 
1719
1723
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1720
- def test_all_or_any_terminal(circuit_cls):
1724
+ def test_all_or_any_terminal(circuit_cls) -> None:
1721
1725
  def is_x_pow_gate(op):
1722
1726
  return isinstance(op.gate, cirq.XPowGate)
1723
1727
 
@@ -1785,7 +1789,7 @@ def test_all_or_any_terminal(circuit_cls):
1785
1789
  assert not c.are_any_matches_terminal(is_circuit_op)
1786
1790
 
1787
1791
 
1788
- def test_clear_operations_touching():
1792
+ def test_clear_operations_touching() -> None:
1789
1793
  a = cirq.NamedQubit('a')
1790
1794
  b = cirq.NamedQubit('b')
1791
1795
 
@@ -1847,7 +1851,7 @@ def test_clear_operations_touching():
1847
1851
 
1848
1852
 
1849
1853
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1850
- def test_all_qubits(circuit_cls):
1854
+ def test_all_qubits(circuit_cls) -> None:
1851
1855
  a = cirq.NamedQubit('a')
1852
1856
  b = cirq.NamedQubit('b')
1853
1857
 
@@ -1865,7 +1869,7 @@ def test_all_qubits(circuit_cls):
1865
1869
 
1866
1870
 
1867
1871
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1868
- def test_all_operations(circuit_cls):
1872
+ def test_all_operations(circuit_cls) -> None:
1869
1873
  a = cirq.NamedQubit('a')
1870
1874
  b = cirq.NamedQubit('b')
1871
1875
 
@@ -1899,7 +1903,7 @@ def test_all_operations(circuit_cls):
1899
1903
 
1900
1904
 
1901
1905
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1902
- def test_qid_shape_qubit(circuit_cls):
1906
+ def test_qid_shape_qubit(circuit_cls) -> None:
1903
1907
  a = cirq.NamedQubit('a')
1904
1908
  b = cirq.NamedQubit('b')
1905
1909
  c = cirq.NamedQubit('c')
@@ -1915,7 +1919,7 @@ def test_qid_shape_qubit(circuit_cls):
1915
1919
 
1916
1920
 
1917
1921
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1918
- def test_qid_shape_qudit(circuit_cls):
1922
+ def test_qid_shape_qudit(circuit_cls) -> None:
1919
1923
  class PlusOneMod3Gate(cirq.testing.SingleQubitGate):
1920
1924
  def _qid_shape_(self):
1921
1925
  return (3,)
@@ -1941,7 +1945,7 @@ def test_qid_shape_qudit(circuit_cls):
1941
1945
 
1942
1946
 
1943
1947
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
1944
- def test_to_text_diagram_teleportation_to_diagram(circuit_cls):
1948
+ def test_to_text_diagram_teleportation_to_diagram(circuit_cls) -> None:
1945
1949
  ali = cirq.NamedQubit('(0, 0)')
1946
1950
  bob = cirq.NamedQubit('(0, 1)')
1947
1951
  msg = cirq.NamedQubit('(1, 0)')
@@ -2018,7 +2022,7 @@ M | M |
2018
2022
 
2019
2023
 
2020
2024
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2021
- def test_diagram_with_unknown_exponent(circuit_cls):
2025
+ def test_diagram_with_unknown_exponent(circuit_cls) -> None:
2022
2026
  class WeirdGate(cirq.testing.SingleQubitGate):
2023
2027
  def _circuit_diagram_info_(
2024
2028
  self, args: cirq.CircuitDiagramInfoArgs
@@ -2038,7 +2042,7 @@ def test_diagram_with_unknown_exponent(circuit_cls):
2038
2042
 
2039
2043
 
2040
2044
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2041
- def test_circuit_diagram_on_gate_without_info(circuit_cls):
2045
+ def test_circuit_diagram_on_gate_without_info(circuit_cls) -> None:
2042
2046
  q = cirq.NamedQubit('(0, 0)')
2043
2047
  q2 = cirq.NamedQubit('(0, 1)')
2044
2048
  q3 = cirq.NamedQubit('(0, 2)')
@@ -2079,7 +2083,7 @@ def test_circuit_diagram_on_gate_without_info(circuit_cls):
2079
2083
 
2080
2084
 
2081
2085
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2082
- def test_to_text_diagram_multi_qubit_gate(circuit_cls):
2086
+ def test_to_text_diagram_multi_qubit_gate(circuit_cls) -> None:
2083
2087
  q1 = cirq.NamedQubit('(0, 0)')
2084
2088
  q2 = cirq.NamedQubit('(0, 1)')
2085
2089
  q3 = cirq.NamedQubit('(0, 2)')
@@ -2118,9 +2122,9 @@ M('msg')─M──────M
2118
2122
 
2119
2123
 
2120
2124
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2121
- def test_to_text_diagram_many_qubits_gate_but_multiple_wire_symbols(circuit_cls):
2125
+ def test_to_text_diagram_many_qubits_gate_but_multiple_wire_symbols(circuit_cls) -> None:
2122
2126
  class BadGate(cirq.testing.ThreeQubitGate):
2123
- def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> Tuple[str, str]:
2127
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, str]:
2124
2128
  return 'a', 'a'
2125
2129
 
2126
2130
  q1 = cirq.NamedQubit('(0, 0)')
@@ -2132,7 +2136,7 @@ def test_to_text_diagram_many_qubits_gate_but_multiple_wire_symbols(circuit_cls)
2132
2136
 
2133
2137
 
2134
2138
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2135
- def test_to_text_diagram_parameterized_value(circuit_cls):
2139
+ def test_to_text_diagram_parameterized_value(circuit_cls) -> None:
2136
2140
  q = cirq.NamedQubit('cube')
2137
2141
 
2138
2142
  class PGate(cirq.testing.SingleQubitGate):
@@ -2154,7 +2158,7 @@ def test_to_text_diagram_parameterized_value(circuit_cls):
2154
2158
 
2155
2159
 
2156
2160
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2157
- def test_to_text_diagram_custom_order(circuit_cls):
2161
+ def test_to_text_diagram_custom_order(circuit_cls) -> None:
2158
2162
  qa = cirq.NamedQubit('2')
2159
2163
  qb = cirq.NamedQubit('3')
2160
2164
  qc = cirq.NamedQubit('4')
@@ -2175,7 +2179,7 @@ def test_to_text_diagram_custom_order(circuit_cls):
2175
2179
 
2176
2180
 
2177
2181
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2178
- def test_overly_precise_diagram(circuit_cls):
2182
+ def test_overly_precise_diagram(circuit_cls) -> None:
2179
2183
  # Test default precision of 3
2180
2184
  qa = cirq.NamedQubit('a')
2181
2185
  c = circuit_cls([cirq.Moment([cirq.X(qa) ** 0.12345678])])
@@ -2189,7 +2193,7 @@ a: ---X^0.123---
2189
2193
 
2190
2194
 
2191
2195
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2192
- def test_none_precision_diagram(circuit_cls):
2196
+ def test_none_precision_diagram(circuit_cls) -> None:
2193
2197
  # Test default precision of 3
2194
2198
  qa = cirq.NamedQubit('a')
2195
2199
  c = circuit_cls([cirq.Moment([cirq.X(qa) ** 0.4921875])])
@@ -2204,7 +2208,7 @@ a: ---X^0.4921875---
2204
2208
 
2205
2209
 
2206
2210
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2207
- def test_diagram_custom_precision(circuit_cls):
2211
+ def test_diagram_custom_precision(circuit_cls) -> None:
2208
2212
  qa = cirq.NamedQubit('a')
2209
2213
  c = circuit_cls([cirq.Moment([cirq.X(qa) ** 0.12341234])])
2210
2214
  cirq.testing.assert_has_diagram(
@@ -2218,7 +2222,7 @@ a: ---X^0.12341---
2218
2222
 
2219
2223
 
2220
2224
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2221
- def test_diagram_wgate(circuit_cls):
2225
+ def test_diagram_wgate(circuit_cls) -> None:
2222
2226
  qa = cirq.NamedQubit('a')
2223
2227
  test_wgate = cirq.PhasedXPowGate(exponent=0.12341234, phase_exponent=0.43214321)
2224
2228
  c = circuit_cls([cirq.Moment([test_wgate.on(qa)])])
@@ -2233,7 +2237,7 @@ a: ---PhX(0.43)^(1/8)---
2233
2237
 
2234
2238
 
2235
2239
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2236
- def test_diagram_wgate_none_precision(circuit_cls):
2240
+ def test_diagram_wgate_none_precision(circuit_cls) -> None:
2237
2241
  qa = cirq.NamedQubit('a')
2238
2242
  test_wgate = cirq.PhasedXPowGate(exponent=0.12341234, phase_exponent=0.43214321)
2239
2243
  c = circuit_cls([cirq.Moment([test_wgate.on(qa)])])
@@ -2248,7 +2252,7 @@ a: ---PhX(0.43214321)^0.12341234---
2248
2252
 
2249
2253
 
2250
2254
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2251
- def test_diagram_global_phase(circuit_cls):
2255
+ def test_diagram_global_phase(circuit_cls) -> None:
2252
2256
  qa = cirq.NamedQubit('a')
2253
2257
  global_phase = cirq.global_phase_operation(coefficient=1j)
2254
2258
  c = circuit_cls([global_phase])
@@ -2297,7 +2301,7 @@ global phase: 0.5π 0.5π
2297
2301
 
2298
2302
 
2299
2303
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2300
- def test_has_unitary(circuit_cls):
2304
+ def test_has_unitary(circuit_cls) -> None:
2301
2305
  class NonUnitary(cirq.testing.SingleQubitGate):
2302
2306
  pass
2303
2307
 
@@ -2320,7 +2324,7 @@ def test_has_unitary(circuit_cls):
2320
2324
 
2321
2325
 
2322
2326
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2323
- def test_text_diagram_jupyter(circuit_cls):
2327
+ def test_text_diagram_jupyter(circuit_cls) -> None:
2324
2328
  a = cirq.NamedQubit('a')
2325
2329
  b = cirq.NamedQubit('b')
2326
2330
  c = cirq.NamedQubit('c')
@@ -2351,7 +2355,7 @@ def test_text_diagram_jupyter(circuit_cls):
2351
2355
 
2352
2356
 
2353
2357
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2354
- def test_circuit_to_unitary_matrix(circuit_cls):
2358
+ def test_circuit_to_unitary_matrix(circuit_cls) -> None:
2355
2359
  a = cirq.NamedQubit('a')
2356
2360
  b = cirq.NamedQubit('b')
2357
2361
 
@@ -2475,7 +2479,7 @@ def test_circuit_to_unitary_matrix(circuit_cls):
2475
2479
 
2476
2480
 
2477
2481
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2478
- def test_circuit_unitary(circuit_cls):
2482
+ def test_circuit_unitary(circuit_cls) -> None:
2479
2483
  q = cirq.NamedQubit('q')
2480
2484
 
2481
2485
  with_inner_measure = circuit_cls(cirq.H(q), cirq.measure(q), cirq.H(q))
@@ -2483,14 +2487,14 @@ def test_circuit_unitary(circuit_cls):
2483
2487
  assert cirq.unitary(with_inner_measure, None) is None
2484
2488
 
2485
2489
  cirq.testing.assert_allclose_up_to_global_phase(
2486
- cirq.unitary(circuit_cls(cirq.X(q) ** 0.5), cirq.measure(q)),
2490
+ cirq.unitary(circuit_cls(cirq.X(q) ** 0.5, cirq.measure(q))),
2487
2491
  np.array([[1j, 1], [1, 1j]]) * np.sqrt(0.5),
2488
2492
  atol=1e-8,
2489
2493
  )
2490
2494
 
2491
2495
 
2492
2496
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2493
- def test_simple_circuits_to_unitary_matrix(circuit_cls):
2497
+ def test_simple_circuits_to_unitary_matrix(circuit_cls) -> None:
2494
2498
  a = cirq.NamedQubit('a')
2495
2499
  b = cirq.NamedQubit('b')
2496
2500
 
@@ -2526,7 +2530,7 @@ def test_simple_circuits_to_unitary_matrix(circuit_cls):
2526
2530
 
2527
2531
 
2528
2532
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2529
- def test_composite_gate_to_unitary_matrix(circuit_cls):
2533
+ def test_composite_gate_to_unitary_matrix(circuit_cls) -> None:
2530
2534
  class CnotComposite(cirq.testing.TwoQubitGate):
2531
2535
  def _decompose_(self, qubits):
2532
2536
  q0, q1 = qubits
@@ -2545,7 +2549,7 @@ def test_composite_gate_to_unitary_matrix(circuit_cls):
2545
2549
  cirq.testing.assert_allclose_up_to_global_phase(mat, mat_expected, atol=1e-8)
2546
2550
 
2547
2551
 
2548
- def test_circuit_superoperator_too_many_qubits():
2552
+ def test_circuit_superoperator_too_many_qubits() -> None:
2549
2553
  circuit = cirq.Circuit(cirq.IdentityGate(num_qubits=11).on(*cirq.LineQubit.range(11)))
2550
2554
  assert not circuit._has_superoperator_()
2551
2555
  with pytest.raises(ValueError, match="too many"):
@@ -2595,7 +2599,7 @@ def test_circuit_superoperator_too_many_qubits():
2595
2599
  ),
2596
2600
  ),
2597
2601
  )
2598
- def test_circuit_superoperator_fixed_values(circuit, expected_superoperator):
2602
+ def test_circuit_superoperator_fixed_values(circuit, expected_superoperator) -> None:
2599
2603
  """Tests Circuit._superoperator_() on a few simple circuits."""
2600
2604
  assert circuit._has_superoperator_()
2601
2605
  assert np.allclose(circuit._superoperator_(), expected_superoperator)
@@ -2613,7 +2617,7 @@ def test_circuit_superoperator_fixed_values(circuit, expected_superoperator):
2613
2617
  ([0.1, 0.2, 0.3], 3),
2614
2618
  ),
2615
2619
  )
2616
- def test_circuit_superoperator_depolarizing_channel_compositions(rs, n_qubits):
2620
+ def test_circuit_superoperator_depolarizing_channel_compositions(rs, n_qubits) -> None:
2617
2621
  """Tests Circuit._superoperator_() on compositions of depolarizing channels."""
2618
2622
 
2619
2623
  def pauli_error_probability(r: float, n_qubits: int) -> float:
@@ -2699,7 +2703,7 @@ def density_operator_basis(n_qubits: int) -> Iterator[np.ndarray]:
2699
2703
  ),
2700
2704
  ),
2701
2705
  )
2702
- def test_compare_circuits_superoperator_to_simulation(circuit, initial_state):
2706
+ def test_compare_circuits_superoperator_to_simulation(circuit, initial_state) -> None:
2703
2707
  """Compares action of circuit superoperator and circuit simulation."""
2704
2708
  assert circuit._has_superoperator_()
2705
2709
  superoperator = circuit._superoperator_()
@@ -2714,7 +2718,7 @@ def test_compare_circuits_superoperator_to_simulation(circuit, initial_state):
2714
2718
 
2715
2719
 
2716
2720
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2717
- def test_expanding_gate_symbols(circuit_cls):
2721
+ def test_expanding_gate_symbols(circuit_cls) -> None:
2718
2722
  class MultiTargetCZ(cirq.Gate):
2719
2723
  def __init__(self, num_qubits):
2720
2724
  self._num_qubits = num_qubits
@@ -2722,7 +2726,7 @@ def test_expanding_gate_symbols(circuit_cls):
2722
2726
  def num_qubits(self) -> int:
2723
2727
  return self._num_qubits
2724
2728
 
2725
- def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> Tuple[str, ...]:
2729
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, ...]:
2726
2730
  assert args.known_qubit_count is not None
2727
2731
  return ('@',) + ('Z',) * (args.known_qubit_count - 1)
2728
2732
 
@@ -2762,7 +2766,7 @@ c: ───@───
2762
2766
 
2763
2767
 
2764
2768
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2765
- def test_transposed_diagram_exponent_order(circuit_cls):
2769
+ def test_transposed_diagram_exponent_order(circuit_cls) -> None:
2766
2770
  a, b, c = cirq.LineQubit.range(3)
2767
2771
  circuit = circuit_cls(cirq.CZ(a, b) ** -0.5, cirq.CZ(a, c) ** 0.5, cirq.CZ(b, c) ** 0.125)
2768
2772
  cirq.testing.assert_has_diagram(
@@ -2782,7 +2786,7 @@ def test_transposed_diagram_exponent_order(circuit_cls):
2782
2786
 
2783
2787
 
2784
2788
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2785
- def test_transposed_diagram_can_depend_on_transpose(circuit_cls):
2789
+ def test_transposed_diagram_can_depend_on_transpose(circuit_cls) -> None:
2786
2790
  class TestGate(cirq.Gate):
2787
2791
  def num_qubits(self):
2788
2792
  return 1
@@ -2805,7 +2809,7 @@ t
2805
2809
  )
2806
2810
 
2807
2811
 
2808
- def test_insert_moments():
2812
+ def test_insert_moments() -> None:
2809
2813
  q = cirq.NamedQubit('q')
2810
2814
  c = cirq.Circuit()
2811
2815
 
@@ -2829,7 +2833,7 @@ def test_insert_moments():
2829
2833
 
2830
2834
 
2831
2835
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
2832
- def test_final_state_vector(circuit_cls):
2836
+ def test_final_state_vector(circuit_cls) -> None:
2833
2837
  a = cirq.NamedQubit('a')
2834
2838
  b = cirq.NamedQubit('b')
2835
2839
 
@@ -3001,7 +3005,7 @@ def test_final_state_vector(circuit_cls):
3001
3005
 
3002
3006
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3003
3007
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
3004
- def test_is_parameterized(circuit_cls, resolve_fn):
3008
+ def test_is_parameterized(circuit_cls, resolve_fn) -> None:
3005
3009
  a, b = cirq.LineQubit.range(2)
3006
3010
  circuit = circuit_cls(
3007
3011
  cirq.CZ(a, b) ** sympy.Symbol('u'),
@@ -3019,7 +3023,7 @@ def test_is_parameterized(circuit_cls, resolve_fn):
3019
3023
 
3020
3024
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3021
3025
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
3022
- def test_resolve_parameters(circuit_cls, resolve_fn):
3026
+ def test_resolve_parameters(circuit_cls, resolve_fn) -> None:
3023
3027
  a, b = cirq.LineQubit.range(2)
3024
3028
  circuit = circuit_cls(
3025
3029
  cirq.CZ(a, b) ** sympy.Symbol('u'),
@@ -3049,7 +3053,7 @@ def test_resolve_parameters(circuit_cls, resolve_fn):
3049
3053
 
3050
3054
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3051
3055
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
3052
- def test_resolve_parameters_no_change(circuit_cls, resolve_fn):
3056
+ def test_resolve_parameters_no_change(circuit_cls, resolve_fn) -> None:
3053
3057
  a, b = cirq.LineQubit.range(2)
3054
3058
  circuit = circuit_cls(cirq.CZ(a, b), cirq.X(a), cirq.Y(b))
3055
3059
  resolved_circuit = resolve_fn(circuit, cirq.ParamResolver({'u': 0.1, 'v': 0.3, 'w': 0.2}))
@@ -3066,7 +3070,7 @@ def test_resolve_parameters_no_change(circuit_cls, resolve_fn):
3066
3070
 
3067
3071
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3068
3072
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
3069
- def test_parameter_names(circuit_cls, resolve_fn):
3073
+ def test_parameter_names(circuit_cls, resolve_fn) -> None:
3070
3074
  a, b = cirq.LineQubit.range(2)
3071
3075
  circuit = circuit_cls(
3072
3076
  cirq.CZ(a, b) ** sympy.Symbol('u'),
@@ -3078,7 +3082,7 @@ def test_parameter_names(circuit_cls, resolve_fn):
3078
3082
  assert cirq.parameter_names(resolved_circuit) == set()
3079
3083
 
3080
3084
 
3081
- def test_items():
3085
+ def test_items() -> None:
3082
3086
  a = cirq.NamedQubit('a')
3083
3087
  b = cirq.NamedQubit('b')
3084
3088
  c = cirq.Circuit()
@@ -3106,12 +3110,12 @@ def test_items():
3106
3110
  cirq.testing.assert_same_circuits(c, cirq.Circuit([m1]))
3107
3111
 
3108
3112
  with pytest.raises(TypeError):
3109
- c[:] = [m1, 1]
3113
+ c[:] = [m1, 1] # type: ignore
3110
3114
  with pytest.raises(TypeError):
3111
- c[0] = 1
3115
+ c[0] = 1 # type: ignore[call-overload]
3112
3116
 
3113
3117
 
3114
- def test_copy():
3118
+ def test_copy() -> None:
3115
3119
  a = cirq.NamedQubit('a')
3116
3120
  b = cirq.NamedQubit('b')
3117
3121
  c = cirq.Circuit(cirq.X(a), cirq.CZ(a, b), cirq.Z(a), cirq.Z(b))
@@ -3122,7 +3126,7 @@ def test_copy():
3122
3126
  assert c2 != c
3123
3127
 
3124
3128
 
3125
- def test_batch_remove():
3129
+ def test_batch_remove() -> None:
3126
3130
  a = cirq.NamedQubit('a')
3127
3131
  b = cirq.NamedQubit('b')
3128
3132
  original = cirq.Circuit(
@@ -3201,7 +3205,7 @@ def test_batch_remove():
3201
3205
  assert after == original
3202
3206
 
3203
3207
 
3204
- def test_batch_replace():
3208
+ def test_batch_replace() -> None:
3205
3209
  a = cirq.NamedQubit('a')
3206
3210
  b = cirq.NamedQubit('b')
3207
3211
  original = cirq.Circuit(
@@ -3255,7 +3259,7 @@ def test_batch_replace():
3255
3259
  )
3256
3260
 
3257
3261
 
3258
- def test_batch_insert_into():
3262
+ def test_batch_insert_into() -> None:
3259
3263
  a = cirq.NamedQubit('a')
3260
3264
  b = cirq.NamedQubit('b')
3261
3265
  c = cirq.NamedQubit('c')
@@ -3358,7 +3362,7 @@ def test_batch_insert_into():
3358
3362
  assert after == original
3359
3363
 
3360
3364
 
3361
- def test_batch_insert():
3365
+ def test_batch_insert() -> None:
3362
3366
  a = cirq.NamedQubit('a')
3363
3367
  b = cirq.NamedQubit('b')
3364
3368
  original = cirq.Circuit(
@@ -3390,7 +3394,7 @@ def test_batch_insert():
3390
3394
  )
3391
3395
 
3392
3396
 
3393
- def test_batch_insert_multiple_same_index():
3397
+ def test_batch_insert_multiple_same_index() -> None:
3394
3398
  a, b = cirq.LineQubit.range(2)
3395
3399
  c = cirq.Circuit()
3396
3400
  c.batch_insert([(0, cirq.Z(a)), (0, cirq.Z(b)), (0, cirq.Z(a))])
@@ -3399,21 +3403,21 @@ def test_batch_insert_multiple_same_index():
3399
3403
  )
3400
3404
 
3401
3405
 
3402
- def test_batch_insert_reverses_order_for_same_index_inserts():
3406
+ def test_batch_insert_reverses_order_for_same_index_inserts() -> None:
3403
3407
  a, b = cirq.LineQubit.range(2)
3404
3408
  c = cirq.Circuit()
3405
3409
  c.batch_insert([(0, cirq.Z(a)), (0, cirq.CZ(a, b)), (0, cirq.Z(b))])
3406
3410
  assert c == cirq.Circuit(cirq.Z(b), cirq.CZ(a, b), cirq.Z(a))
3407
3411
 
3408
3412
 
3409
- def test_batch_insert_maintains_order_despite_multiple_previous_inserts():
3413
+ def test_batch_insert_maintains_order_despite_multiple_previous_inserts() -> None:
3410
3414
  a, b = cirq.LineQubit.range(2)
3411
3415
  c = cirq.Circuit(cirq.H(a))
3412
3416
  c.batch_insert([(0, cirq.Z(a)), (0, cirq.Z(a)), (0, cirq.Z(a)), (1, cirq.CZ(a, b))])
3413
3417
  assert c == cirq.Circuit([cirq.Z(a)] * 3, cirq.H(a), cirq.CZ(a, b))
3414
3418
 
3415
3419
 
3416
- def test_batch_insert_doesnt_overshift_due_to_previous_shifts():
3420
+ def test_batch_insert_doesnt_overshift_due_to_previous_shifts() -> None:
3417
3421
  a = cirq.NamedQubit('a')
3418
3422
  c = cirq.Circuit([cirq.H(a)] * 3)
3419
3423
  c.batch_insert([(0, cirq.Z(a)), (0, cirq.Z(a)), (1, cirq.X(a)), (2, cirq.Y(a))])
@@ -3422,7 +3426,7 @@ def test_batch_insert_doesnt_overshift_due_to_previous_shifts():
3422
3426
  )
3423
3427
 
3424
3428
 
3425
- def test_batch_insert_doesnt_overshift_due_to_inline_inserts():
3429
+ def test_batch_insert_doesnt_overshift_due_to_inline_inserts() -> None:
3426
3430
  a, b = cirq.LineQubit.range(2)
3427
3431
  c = cirq.Circuit(cirq.SWAP(a, b), cirq.SWAP(a, b), cirq.H(a), cirq.SWAP(a, b), cirq.SWAP(a, b))
3428
3432
  c.batch_insert([(0, cirq.X(a)), (3, cirq.X(b)), (4, cirq.Y(a))])
@@ -3439,7 +3443,7 @@ def test_batch_insert_doesnt_overshift_due_to_inline_inserts():
3439
3443
 
3440
3444
 
3441
3445
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3442
- def test_next_moments_operating_on(circuit_cls):
3446
+ def test_next_moments_operating_on(circuit_cls) -> None:
3443
3447
  for _ in range(20):
3444
3448
  n_moments = randint(1, 10)
3445
3449
  circuit = cirq.testing.random_circuit(randint(1, 20), n_moments, random())
@@ -3456,7 +3460,7 @@ def test_next_moments_operating_on(circuit_cls):
3456
3460
  assert (not p) or (p < start)
3457
3461
 
3458
3462
 
3459
- def test_pick_inserted_ops_moment_indices():
3463
+ def test_pick_inserted_ops_moment_indices() -> None:
3460
3464
  for _ in range(20):
3461
3465
  n_moments = randint(1, 10)
3462
3466
  n_qubits = randint(1, 20)
@@ -3482,7 +3486,7 @@ def test_pick_inserted_ops_moment_indices():
3482
3486
  assert actual_circuit == expected_circuit
3483
3487
 
3484
3488
 
3485
- def test_push_frontier_new_moments():
3489
+ def test_push_frontier_new_moments() -> None:
3486
3490
  operation = cirq.X(cirq.NamedQubit('q'))
3487
3491
  insertion_index = 3
3488
3492
  circuit = cirq.Circuit()
@@ -3492,7 +3496,7 @@ def test_push_frontier_new_moments():
3492
3496
  )
3493
3497
 
3494
3498
 
3495
- def test_push_frontier_random_circuit():
3499
+ def test_push_frontier_random_circuit() -> None:
3496
3500
  for _ in range(20):
3497
3501
  n_moments = randint(1, 10)
3498
3502
  circuit = cirq.testing.random_circuit(randint(1, 20), n_moments, random())
@@ -3527,7 +3531,7 @@ def test_push_frontier_random_circuit():
3527
3531
  @pytest.mark.parametrize(
3528
3532
  'circuit', [cirq.testing.random_circuit(cirq.LineQubit.range(10), 10, 0.5) for _ in range(20)]
3529
3533
  )
3530
- def test_insert_operations_random_circuits(circuit):
3534
+ def test_insert_operations_random_circuits(circuit) -> None:
3531
3535
  n_moments = len(circuit)
3532
3536
  operations, insert_indices = [], []
3533
3537
  for moment_index, moment in enumerate(circuit):
@@ -3539,7 +3543,7 @@ def test_insert_operations_random_circuits(circuit):
3539
3543
  assert circuit == other_circuit
3540
3544
 
3541
3545
 
3542
- def test_insert_zero_index():
3546
+ def test_insert_zero_index() -> None:
3543
3547
  # Should always go to moment[0], independent of qubit order or earliest/inline strategy.
3544
3548
  q0, q1 = cirq.LineQubit.range(2)
3545
3549
  c0 = cirq.Circuit(cirq.X(q0))
@@ -3557,7 +3561,7 @@ def test_insert_zero_index():
3557
3561
  assert c3 == expected
3558
3562
 
3559
3563
 
3560
- def test_insert_earliest_on_previous_moment():
3564
+ def test_insert_earliest_on_previous_moment() -> None:
3561
3565
  q = cirq.LineQubit(0)
3562
3566
  c = cirq.Circuit(cirq.Moment(cirq.X(q)), cirq.Moment(), cirq.Moment(), cirq.Moment(cirq.Z(q)))
3563
3567
  c.insert(3, cirq.Y(q), strategy=cirq.InsertStrategy.EARLIEST)
@@ -3567,7 +3571,7 @@ def test_insert_earliest_on_previous_moment():
3567
3571
  )
3568
3572
 
3569
3573
 
3570
- def test_insert_inline_end_of_circuit():
3574
+ def test_insert_inline_end_of_circuit() -> None:
3571
3575
  # If end index is specified, INLINE should place all ops there independent of qubit order.
3572
3576
  q0, q1 = cirq.LineQubit.range(2)
3573
3577
  c0 = cirq.Circuit(cirq.X(q0))
@@ -3585,7 +3589,7 @@ def test_insert_inline_end_of_circuit():
3585
3589
  assert c3 == expected
3586
3590
 
3587
3591
 
3588
- def test_insert_operations_errors():
3592
+ def test_insert_operations_errors() -> None:
3589
3593
  a, b, c = (cirq.NamedQubit(s) for s in 'abc')
3590
3594
  with pytest.raises(ValueError):
3591
3595
  circuit = cirq.Circuit([cirq.Moment([cirq.Z(c)])])
@@ -3607,7 +3611,7 @@ def test_insert_operations_errors():
3607
3611
 
3608
3612
 
3609
3613
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3610
- def test_to_qasm(circuit_cls):
3614
+ def test_to_qasm(circuit_cls) -> None:
3611
3615
  q0 = cirq.NamedQubit('q0')
3612
3616
  circuit = circuit_cls(cirq.X(q0), cirq.measure(q0, key='mmm'))
3613
3617
  assert circuit.to_qasm() == cirq.qasm(circuit)
@@ -3649,7 +3653,7 @@ m_mmm[0] = measure q[0];
3649
3653
 
3650
3654
 
3651
3655
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3652
- def test_save_qasm(tmpdir, circuit_cls):
3656
+ def test_save_qasm(tmpdir, circuit_cls) -> None:
3653
3657
  file_path = os.path.join(tmpdir, 'test.qasm')
3654
3658
  q0 = cirq.NamedQubit('q0')
3655
3659
  circuit = circuit_cls(cirq.X(q0))
@@ -3675,7 +3679,7 @@ x q[0];
3675
3679
 
3676
3680
 
3677
3681
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3678
- def test_findall_operations_between(circuit_cls):
3682
+ def test_findall_operations_between(circuit_cls) -> None:
3679
3683
  a, b, c, d = cirq.LineQubit.range(4)
3680
3684
 
3681
3685
  # 0: ───H───@───────────────────────────────────────@───H───
@@ -3755,7 +3759,7 @@ def test_findall_operations_between(circuit_cls):
3755
3759
 
3756
3760
 
3757
3761
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3758
- def test_reachable_frontier_from(circuit_cls):
3762
+ def test_reachable_frontier_from(circuit_cls) -> None:
3759
3763
  a, b, c, d = cirq.LineQubit.range(4)
3760
3764
 
3761
3765
  # 0: ───H───@───────────────────────────────────────@───H───
@@ -3825,7 +3829,7 @@ def test_reachable_frontier_from(circuit_cls):
3825
3829
 
3826
3830
 
3827
3831
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3828
- def test_submoments(circuit_cls):
3832
+ def test_submoments(circuit_cls) -> None:
3829
3833
  a, b, c, d, e, f = cirq.LineQubit.range(6)
3830
3834
  circuit = circuit_cls(
3831
3835
  cirq.H.on(a),
@@ -3925,7 +3929,7 @@ def test_submoments(circuit_cls):
3925
3929
 
3926
3930
 
3927
3931
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3928
- def test_decompose(circuit_cls):
3932
+ def test_decompose(circuit_cls) -> None:
3929
3933
  a, b = cirq.LineQubit.range(2)
3930
3934
  assert cirq.decompose(circuit_cls(cirq.X(a), cirq.Y(b), cirq.CZ(a, b))) == [
3931
3935
  cirq.X(a),
@@ -3935,7 +3939,7 @@ def test_decompose(circuit_cls):
3935
3939
 
3936
3940
 
3937
3941
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3938
- def test_measurement_key_mapping(circuit_cls):
3942
+ def test_measurement_key_mapping(circuit_cls) -> None:
3939
3943
  a, b = cirq.LineQubit.range(2)
3940
3944
  c = circuit_cls(cirq.X(a), cirq.measure(a, key='m1'), cirq.measure(b, key='m2'))
3941
3945
  assert c.all_measurement_key_names() == {'m1', 'm2'}
@@ -3964,7 +3968,7 @@ def test_measurement_key_mapping(circuit_cls):
3964
3968
 
3965
3969
 
3966
3970
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3967
- def test_measurement_key_mapping_preserves_moments(circuit_cls):
3971
+ def test_measurement_key_mapping_preserves_moments(circuit_cls) -> None:
3968
3972
  a, b = cirq.LineQubit.range(2)
3969
3973
  c = circuit_cls(
3970
3974
  cirq.Moment(cirq.X(a)),
@@ -3981,7 +3985,7 @@ def test_measurement_key_mapping_preserves_moments(circuit_cls):
3981
3985
 
3982
3986
 
3983
3987
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
3984
- def test_inverse(circuit_cls):
3988
+ def test_inverse(circuit_cls) -> None:
3985
3989
  a, b = cirq.LineQubit.range(2)
3986
3990
  forward = circuit_cls((cirq.X**0.5)(a), (cirq.Y**-0.2)(b), cirq.CZ(a, b))
3987
3991
  backward = circuit_cls((cirq.CZ ** (-1.0))(a, b), (cirq.X ** (-0.5))(a), (cirq.Y ** (0.2))(b))
@@ -4000,7 +4004,7 @@ def test_inverse(circuit_cls):
4000
4004
 
4001
4005
 
4002
4006
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4003
- def test_pow_valid_only_for_minus_1(circuit_cls):
4007
+ def test_pow_valid_only_for_minus_1(circuit_cls) -> None:
4004
4008
  a, b = cirq.LineQubit.range(2)
4005
4009
  forward = circuit_cls((cirq.X**0.5)(a), (cirq.Y**-0.2)(b), cirq.CZ(a, b))
4006
4010
 
@@ -4015,7 +4019,7 @@ def test_pow_valid_only_for_minus_1(circuit_cls):
4015
4019
 
4016
4020
 
4017
4021
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4018
- def test_moment_groups(circuit_cls):
4022
+ def test_moment_groups(circuit_cls) -> None:
4019
4023
  qubits = [cirq.GridQubit(x, y) for x in range(8) for y in range(8)]
4020
4024
  c0 = cirq.H(qubits[0])
4021
4025
  c7 = cirq.H(qubits[7])
@@ -4053,7 +4057,7 @@ def test_moment_groups(circuit_cls):
4053
4057
 
4054
4058
 
4055
4059
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4056
- def test_moments_property(circuit_cls):
4060
+ def test_moments_property(circuit_cls) -> None:
4057
4061
  q = cirq.NamedQubit('q')
4058
4062
  c = circuit_cls(cirq.X(q), cirq.Y(q))
4059
4063
  assert c.moments[0] == cirq.Moment([cirq.X(q)])
@@ -4061,16 +4065,17 @@ def test_moments_property(circuit_cls):
4061
4065
 
4062
4066
 
4063
4067
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4064
- def test_json_dict(circuit_cls):
4068
+ def test_json_dict(circuit_cls) -> None:
4065
4069
  q0, q1 = cirq.LineQubit.range(2)
4066
4070
  c = circuit_cls(cirq.CNOT(q0, q1))
4071
+ moments: Sequence[cirq.Moment]
4067
4072
  moments = [cirq.Moment([cirq.CNOT(q0, q1)])]
4068
4073
  if circuit_cls == cirq.FrozenCircuit:
4069
4074
  moments = tuple(moments)
4070
4075
  assert c._json_dict_() == {'moments': moments}
4071
4076
 
4072
4077
 
4073
- def test_with_noise():
4078
+ def test_with_noise() -> None:
4074
4079
  class Noise(cirq.NoiseModel):
4075
4080
  def noisy_operation(self, operation):
4076
4081
  yield operation
@@ -4105,7 +4110,7 @@ def test_with_noise():
4105
4110
 
4106
4111
 
4107
4112
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4108
- def test_init_contents(circuit_cls):
4113
+ def test_init_contents(circuit_cls) -> None:
4109
4114
  a, b = cirq.LineQubit.range(2)
4110
4115
 
4111
4116
  # Moments are not subject to insertion rules.
@@ -4127,7 +4132,7 @@ def test_init_contents(circuit_cls):
4127
4132
  circuit_cls()
4128
4133
 
4129
4134
 
4130
- def test_transform_qubits():
4135
+ def test_transform_qubits() -> None:
4131
4136
  a, b, c = cirq.LineQubit.range(3)
4132
4137
  original = cirq.Circuit(
4133
4138
  cirq.X(a), cirq.CNOT(a, b), cirq.Moment(), cirq.Moment([cirq.CNOT(b, c)])
@@ -4136,7 +4141,12 @@ def test_transform_qubits():
4136
4141
  desired = cirq.Circuit(
4137
4142
  cirq.X(x), cirq.CNOT(x, y), cirq.Moment(), cirq.Moment([cirq.CNOT(y, z)])
4138
4143
  )
4139
- assert original.transform_qubits(lambda q: cirq.GridQubit(10 + q.x, 20)) == desired
4144
+ assert (
4145
+ original.transform_qubits(
4146
+ lambda q: cirq.GridQubit(10 + q.x, 20) # type: ignore[attr-defined]
4147
+ )
4148
+ == desired
4149
+ )
4140
4150
  assert (
4141
4151
  original.transform_qubits(
4142
4152
  {
@@ -4148,11 +4158,11 @@ def test_transform_qubits():
4148
4158
  == desired
4149
4159
  )
4150
4160
  with pytest.raises(TypeError, match='must be a function or dict'):
4151
- _ = original.transform_qubits('bad arg')
4161
+ _ = original.transform_qubits('bad arg') # type: ignore[arg-type]
4152
4162
 
4153
4163
 
4154
4164
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4155
- def test_indexing_by_pair(circuit_cls):
4165
+ def test_indexing_by_pair(circuit_cls) -> None:
4156
4166
  # 0: ───H───@───X───@───
4157
4167
  # │ │
4158
4168
  # 1: ───────H───@───@───
@@ -4254,7 +4264,7 @@ def test_indexing_by_pair(circuit_cls):
4254
4264
 
4255
4265
 
4256
4266
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4257
- def test_indexing_by_numpy_integer(circuit_cls):
4267
+ def test_indexing_by_numpy_integer(circuit_cls) -> None:
4258
4268
  q = cirq.NamedQubit('q')
4259
4269
  c = circuit_cls(cirq.X(q), cirq.Y(q))
4260
4270
 
@@ -4263,7 +4273,7 @@ def test_indexing_by_numpy_integer(circuit_cls):
4263
4273
 
4264
4274
 
4265
4275
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4266
- def test_all_measurement_key_names(circuit_cls):
4276
+ def test_all_measurement_key_names(circuit_cls) -> None:
4267
4277
  class Unknown(cirq.testing.SingleQubitGate):
4268
4278
  def _measurement_key_name_(self):
4269
4279
  return 'test'
@@ -4296,7 +4306,7 @@ def test_all_measurement_key_names(circuit_cls):
4296
4306
  ).all_measurement_key_names() == {'x', 'y'}
4297
4307
 
4298
4308
 
4299
- def test_zip():
4309
+ def test_zip() -> None:
4300
4310
  a, b, c, d = cirq.LineQubit.range(4)
4301
4311
 
4302
4312
  circuit1 = cirq.Circuit(cirq.H(a), cirq.CNOT(a, b))
@@ -4338,7 +4348,7 @@ def test_zip():
4338
4348
 
4339
4349
 
4340
4350
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4341
- def test_zip_alignment(circuit_cls):
4351
+ def test_zip_alignment(circuit_cls) -> None:
4342
4352
  a, b, c = cirq.LineQubit.range(3)
4343
4353
 
4344
4354
  circuit1 = circuit_cls([cirq.H(a)] * 5)
@@ -4365,7 +4375,7 @@ def test_zip_alignment(circuit_cls):
4365
4375
 
4366
4376
 
4367
4377
  @pytest.mark.parametrize('circuit_cls', [cirq.Circuit, cirq.FrozenCircuit])
4368
- def test_repr_html_escaping(circuit_cls):
4378
+ def test_repr_html_escaping(circuit_cls) -> None:
4369
4379
  class TestGate(cirq.Gate):
4370
4380
  def num_qubits(self):
4371
4381
  return 2
@@ -4386,7 +4396,7 @@ def test_repr_html_escaping(circuit_cls):
4386
4396
  assert '|c&gt;' in circuit._repr_html_()
4387
4397
 
4388
4398
 
4389
- def test_concat_ragged():
4399
+ def test_concat_ragged() -> None:
4390
4400
  a, b = cirq.LineQubit.range(2)
4391
4401
  empty = cirq.Circuit()
4392
4402
 
@@ -4533,6 +4543,7 @@ def test_concat_ragged():
4533
4543
  )
4534
4544
 
4535
4545
  # Types.
4546
+ v: cirq.AbstractCircuit
4536
4547
  v = ha.freeze().concat_ragged(empty)
4537
4548
  assert type(v) is cirq.FrozenCircuit and v == ha.freeze()
4538
4549
  v = ha.concat_ragged(empty.freeze())
@@ -4545,7 +4556,7 @@ def test_concat_ragged():
4545
4556
  assert type(v) is cirq.FrozenCircuit and v == ha.freeze()
4546
4557
 
4547
4558
 
4548
- def test_concat_ragged_alignment():
4559
+ def test_concat_ragged_alignment() -> None:
4549
4560
  a, b = cirq.LineQubit.range(2)
4550
4561
 
4551
4562
  assert cirq.Circuit.concat_ragged(
@@ -4577,14 +4588,14 @@ def test_concat_ragged_alignment():
4577
4588
  )
4578
4589
 
4579
4590
 
4580
- def test_freeze_not_relocate_moments():
4591
+ def test_freeze_not_relocate_moments() -> None:
4581
4592
  q = cirq.q(0)
4582
4593
  c = cirq.Circuit(cirq.X(q), cirq.measure(q))
4583
4594
  f = c.freeze()
4584
4595
  assert [mc is fc for mc, fc in zip(c, f)] == [True, True]
4585
4596
 
4586
4597
 
4587
- def test_freeze_is_cached():
4598
+ def test_freeze_is_cached() -> None:
4588
4599
  q = cirq.q(0)
4589
4600
  c = cirq.Circuit(cirq.X(q), cirq.measure(q))
4590
4601
  f0 = c.freeze()
@@ -4643,7 +4654,7 @@ def test_freeze_is_cached():
4643
4654
  ),
4644
4655
  ],
4645
4656
  )
4646
- def test_mutation_clears_cached_attributes(circuit, mutate):
4657
+ def test_mutation_clears_cached_attributes(circuit, mutate) -> None:
4647
4658
  cached_attributes = [
4648
4659
  "_all_qubits",
4649
4660
  "_frozen",
@@ -4678,7 +4689,7 @@ def test_mutation_clears_cached_attributes(circuit, mutate):
4678
4689
  assert getattr(circuit, attr) is None, f"{attr=} is not None"
4679
4690
 
4680
4691
 
4681
- def test_factorize_one_factor():
4692
+ def test_factorize_one_factor() -> None:
4682
4693
  circuit = cirq.Circuit()
4683
4694
  q0, q1, q2 = cirq.LineQubit.range(3)
4684
4695
  circuit.append(
@@ -4697,7 +4708,7 @@ def test_factorize_one_factor():
4697
4708
  cirq.testing.assert_has_diagram(factors[0], desired)
4698
4709
 
4699
4710
 
4700
- def test_factorize_simple_circuit_two_factors():
4711
+ def test_factorize_simple_circuit_two_factors() -> None:
4701
4712
  circuit = cirq.Circuit()
4702
4713
  q0, q1, q2 = cirq.LineQubit.range(3)
4703
4714
  circuit.append([cirq.H(q1), cirq.CZ(q0, q1), cirq.H(q2), cirq.H(q0), cirq.H(q0)])
@@ -4717,7 +4728,7 @@ def test_factorize_simple_circuit_two_factors():
4717
4728
  cirq.testing.assert_has_diagram(f, d)
4718
4729
 
4719
4730
 
4720
- def test_factorize_large_circuit():
4731
+ def test_factorize_large_circuit() -> None:
4721
4732
  circuit = cirq.Circuit()
4722
4733
  qubits = cirq.GridQubit.rect(3, 3)
4723
4734
  circuit.append(cirq.Moment(cirq.X(q) for q in qubits))
@@ -4757,7 +4768,7 @@ def test_factorize_large_circuit():
4757
4768
  cirq.testing.assert_has_diagram(f, d)
4758
4769
 
4759
4770
 
4760
- def test_zero_target_operations_go_below_diagram():
4771
+ def test_zero_target_operations_go_below_diagram() -> None:
4761
4772
  class CustomOperationAnnotation(cirq.Operation):
4762
4773
  def __init__(self, text: str):
4763
4774
  self.text = text
@@ -4872,7 +4883,7 @@ global phase: 0.5π
4872
4883
  )
4873
4884
 
4874
4885
 
4875
- def test_create_speed():
4886
+ def test_create_speed() -> None:
4876
4887
  # Added in https://github.com/quantumlib/Cirq/pull/5332
4877
4888
  # Previously this took ~30s to run. Now it should take ~150ms. However the coverage test can
4878
4889
  # run this slowly, so allowing 4 sec to account for things like that. Feel free to increase the
@@ -4888,7 +4899,7 @@ def test_create_speed():
4888
4899
  assert duration < 4
4889
4900
 
4890
4901
 
4891
- def test_append_speed():
4902
+ def test_append_speed() -> None:
4892
4903
  # Previously this took ~17s to run. Now it should take ~150ms. However the coverage test can
4893
4904
  # run this slowly, so allowing 5 sec to account for things like that. Feel free to increase the
4894
4905
  # buffer time or delete the test entirely if it ends up causing flakes.
@@ -4908,3 +4919,52 @@ def test_append_speed():
4908
4919
  duration = time.perf_counter() - t
4909
4920
  assert len(c) == moments
4910
4921
  assert duration < 5
4922
+
4923
+
4924
+ def test_tagged_circuits() -> None:
4925
+ q = cirq.LineQubit(0)
4926
+ ops = [cirq.X(q), cirq.H(q)]
4927
+ tags = (sympy.Symbol("a"), "b")
4928
+ circuit = cirq.Circuit(ops)
4929
+ tagged_circuit = cirq.Circuit(ops, tags=tags)
4930
+ # Test equality
4931
+ assert tagged_circuit.tags == tags
4932
+ assert circuit != tagged_circuit
4933
+ assert not cirq.approx_eq(circuit, tagged_circuit)
4934
+ # Test _repr_ and _json_ round trips.
4935
+ cirq.testing.assert_equivalent_repr(tagged_circuit)
4936
+ cirq.testing.assert_json_roundtrip_works(tagged_circuit)
4937
+ # Test utility methods and constructors
4938
+ assert tagged_circuit.with_tags() is tagged_circuit
4939
+ assert circuit.with_tags(*tags) == tagged_circuit
4940
+ assert tagged_circuit.with_tags("c") == cirq.Circuit(ops, tags=[*tags, "c"])
4941
+ assert tagged_circuit.untagged == circuit
4942
+ assert circuit.untagged is circuit
4943
+ assert tagged_circuit.freeze().tags == tags
4944
+ assert tagged_circuit.unfreeze(copy=True).tags == tags
4945
+ assert tagged_circuit.unfreeze(copy=False).tags == tags
4946
+ # Test parameterized protocols
4947
+ assert cirq.is_parameterized(circuit) is False
4948
+ assert cirq.is_parameterized(tagged_circuit) is True
4949
+ assert cirq.parameter_names(tagged_circuit) == {"a"}
4950
+ assert cirq.resolve_parameters(tagged_circuit, {"a": 1}).tags == (1, "b")
4951
+ # Tags are not propagated to diagrams yet.
4952
+ assert str(circuit) == str(tagged_circuit)
4953
+ # Test tags are preserved through operations
4954
+ assert (tagged_circuit + circuit).tags == tags
4955
+ assert (circuit + tagged_circuit).tags == () # We only preserve the tags for the first one
4956
+ assert (2 * tagged_circuit).tags == tags
4957
+ assert (tagged_circuit * 2).tags == tags
4958
+ assert (tagged_circuit**-1).tags == tags
4959
+ assert tagged_circuit.with_noise(cirq.X).tags == tags
4960
+ for c in tagged_circuit.factorize():
4961
+ assert tagged_circuit.tags == tags
4962
+
4963
+ q2 = cirq.LineQubit(1)
4964
+ circuit2 = cirq.Circuit(cirq.X(q2), cirq.H(q2))
4965
+ assert tagged_circuit.zip(circuit2).tags == tags
4966
+ assert circuit2.zip(tagged_circuit).tags == () # We only preserve the tags for the first one
4967
+ assert tagged_circuit.concat_ragged(circuit2).tags == tags
4968
+ assert (
4969
+ circuit2.concat_ragged(tagged_circuit).tags == ()
4970
+ ) # We only preserve the tags for the first one