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
@@ -17,7 +17,7 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  import re
20
- from typing import Callable, Dict, Iterator, Optional, Sequence, Tuple, TYPE_CHECKING, Union
20
+ from typing import Callable, Iterator, Sequence, TYPE_CHECKING
21
21
 
22
22
  import numpy as np
23
23
 
@@ -55,7 +55,7 @@ class QasmUGate(ops.Gate):
55
55
  def _has_unitary_(self):
56
56
  return True
57
57
 
58
- def _qasm_(self, qubits: Tuple[cirq.Qid, ...], args: cirq.QasmArgs) -> str:
58
+ def _qasm_(self, qubits: tuple[cirq.Qid, ...], args: cirq.QasmArgs) -> str:
59
59
  args.validate_version('2.0', '3.0')
60
60
  return args.format(
61
61
  'u3({0:half_turns},{1:half_turns},{2:half_turns}) {3};\n',
@@ -84,7 +84,7 @@ class QasmUGate(ops.Gate):
84
84
  def _value_equality_values_(self):
85
85
  return self.lmda, self.theta, self.phi
86
86
 
87
- def _json_dict_(self) -> Dict[str, float]:
87
+ def _json_dict_(self) -> dict[str, float]:
88
88
  return {'theta': self.theta, 'phi': self.phi, 'lmda': self.lmda}
89
89
 
90
90
  @classmethod
@@ -173,7 +173,7 @@ class QasmOutput:
173
173
  def __init__(
174
174
  self,
175
175
  operations: cirq.OP_TREE,
176
- qubits: Tuple[cirq.Qid, ...],
176
+ qubits: tuple[cirq.Qid, ...],
177
177
  header: str = '',
178
178
  precision: int = 10,
179
179
  version: str = '2.0',
@@ -208,10 +208,10 @@ class QasmOutput:
208
208
  meas_key_bitcount={k: v[0] for k, v in self.cregs.items()},
209
209
  )
210
210
 
211
- def _generate_measurement_ids(self) -> Tuple[Dict[str, str], Dict[str, Optional[str]]]:
211
+ def _generate_measurement_ids(self) -> tuple[dict[str, str], dict[str, str | None]]:
212
212
  # Pick an id for the creg that will store each measurement
213
- meas_key_id_map: Dict[str, str] = {}
214
- meas_comments: Dict[str, Optional[str]] = {}
213
+ meas_key_id_map: dict[str, str] = {}
214
+ meas_comments: dict[str, str | None] = {}
215
215
  meas_i = 0
216
216
  for meas in self.measurements:
217
217
  key = protocols.measurement_key_name(meas)
@@ -227,10 +227,10 @@ class QasmOutput:
227
227
  meas_key_id_map[key] = meas_id
228
228
  return meas_key_id_map, meas_comments
229
229
 
230
- def _generate_qubit_ids(self) -> Dict[cirq.Qid, str]:
230
+ def _generate_qubit_ids(self) -> dict[cirq.Qid, str]:
231
231
  return {qubit: f'q[{i}]' for i, qubit in enumerate(self.qubits)}
232
232
 
233
- def _generate_cregs(self, meas_key_id_map: Dict[str, str]) -> Dict[str, tuple[int, str]]:
233
+ def _generate_cregs(self, meas_key_id_map: dict[str, str]) -> dict[str, tuple[int, str]]:
234
234
  """Pick an id for the creg that will store each measurement
235
235
 
236
236
  This function finds the largest measurement using each key.
@@ -239,7 +239,7 @@ class QasmOutput:
239
239
 
240
240
  Returns: dictionary with key of measurement id and value of (#qubits, comment).
241
241
  """
242
- cregs: Dict[str, tuple[int, str]] = {}
242
+ cregs: dict[str, tuple[int, str]] = {}
243
243
  for meas in self.measurements:
244
244
  key = protocols.measurement_key_name(meas)
245
245
  meas_id = meas_key_id_map[key]
@@ -258,7 +258,7 @@ class QasmOutput:
258
258
  """Test if id_str is a valid id in QASM grammar."""
259
259
  return self.valid_id_re.match(id_str) is not None
260
260
 
261
- def save(self, path: Union[str, bytes, int]) -> None:
261
+ def save(self, path: str | bytes | int) -> None:
262
262
  """Write QASM output to a file specified by path."""
263
263
  with open(path, 'w') as f:
264
264
 
@@ -11,6 +11,9 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import os
15
18
  import re
16
19
 
@@ -26,12 +29,12 @@ def _make_qubits(n):
26
29
  return [cirq.NamedQubit(f'q{i}') for i in range(n)]
27
30
 
28
31
 
29
- def test_u_gate_repr():
32
+ def test_u_gate_repr() -> None:
30
33
  gate = QasmUGate(0.1, 0.2, 0.3)
31
34
  assert repr(gate) == 'cirq.circuits.qasm_output.QasmUGate(theta=0.1, phi=0.2, lmda=0.3)'
32
35
 
33
36
 
34
- def test_u_gate_eq():
37
+ def test_u_gate_eq() -> None:
35
38
  gate = QasmUGate(0.1, 0.2, 0.3)
36
39
  gate2 = QasmUGate(0.1, 0.2, 0.3)
37
40
  cirq.approx_eq(gate, gate2, atol=1e-16)
@@ -40,13 +43,13 @@ def test_u_gate_eq():
40
43
  cirq.approx_eq(gate4, gate3, atol=1e-16)
41
44
 
42
45
 
43
- def test_qasm_two_qubit_gate_repr():
46
+ def test_qasm_two_qubit_gate_repr() -> None:
44
47
  cirq.testing.assert_equivalent_repr(
45
48
  QasmTwoQubitGate.from_matrix(cirq.testing.random_unitary(4))
46
49
  )
47
50
 
48
51
 
49
- def test_qasm_u_qubit_gate_unitary():
52
+ def test_qasm_u_qubit_gate_unitary() -> None:
50
53
  u = cirq.testing.random_unitary(2)
51
54
  g = QasmUGate.from_matrix(u)
52
55
  cirq.testing.assert_allclose_up_to_global_phase(cirq.unitary(g), u, atol=1e-7)
@@ -59,13 +62,13 @@ def test_qasm_u_qubit_gate_unitary():
59
62
  cirq.testing.assert_implements_consistent_protocols(g)
60
63
 
61
64
 
62
- def test_qasm_two_qubit_gate_unitary():
65
+ def test_qasm_two_qubit_gate_unitary() -> None:
63
66
  u = cirq.testing.random_unitary(4)
64
67
  g = QasmTwoQubitGate.from_matrix(u)
65
68
  np.testing.assert_allclose(cirq.unitary(g), u)
66
69
 
67
70
 
68
- def test_empty_circuit_one_qubit():
71
+ def test_empty_circuit_one_qubit() -> None:
69
72
  (q0,) = _make_qubits(1)
70
73
  output = cirq.QasmOutput((), (q0,))
71
74
  assert (
@@ -80,7 +83,7 @@ qreg q[1];
80
83
  )
81
84
 
82
85
 
83
- def test_empty_circuit_no_qubits():
86
+ def test_empty_circuit_no_qubits() -> None:
84
87
  output = cirq.QasmOutput((), ())
85
88
  assert (
86
89
  str(output)
@@ -93,7 +96,7 @@ include "qelib1.inc";
93
96
  )
94
97
 
95
98
 
96
- def test_header():
99
+ def test_header() -> None:
97
100
  (q0,) = _make_qubits(1)
98
101
  output = cirq.QasmOutput(
99
102
  (),
@@ -140,7 +143,7 @@ qreg q[1];
140
143
  )
141
144
 
142
145
 
143
- def test_single_gate_no_parameter():
146
+ def test_single_gate_no_parameter() -> None:
144
147
  (q0,) = _make_qubits(1)
145
148
  output = cirq.QasmOutput((cirq.X(q0),), (q0,))
146
149
  assert (
@@ -158,7 +161,7 @@ x q[0];
158
161
  )
159
162
 
160
163
 
161
- def test_single_gate_with_parameter():
164
+ def test_single_gate_with_parameter() -> None:
162
165
  (q0,) = _make_qubits(1)
163
166
  output = cirq.QasmOutput((cirq.X(q0) ** 0.25,), (q0,))
164
167
  assert (
@@ -176,7 +179,7 @@ rx(pi*0.25) q[0];
176
179
  )
177
180
 
178
181
 
179
- def test_h_gate_with_parameter():
182
+ def test_h_gate_with_parameter() -> None:
180
183
  (q0,) = _make_qubits(1)
181
184
  output = cirq.QasmOutput((cirq.H(q0) ** 0.25,), (q0,))
182
185
  assert (
@@ -197,7 +200,7 @@ ry(pi*-0.25) q[0];
197
200
  )
198
201
 
199
202
 
200
- def test_qasm_global_pahse():
203
+ def test_qasm_global_pahse() -> None:
201
204
  output = cirq.QasmOutput((cirq.global_phase_operation(np.exp(1j * 5))), ())
202
205
  assert (
203
206
  str(output)
@@ -210,7 +213,7 @@ include "qelib1.inc";
210
213
  )
211
214
 
212
215
 
213
- def test_precision():
216
+ def test_precision() -> None:
214
217
  (q0,) = _make_qubits(1)
215
218
  output = cirq.QasmOutput((cirq.X(q0) ** 0.1234567,), (q0,), precision=3)
216
219
  assert (
@@ -228,14 +231,14 @@ rx(pi*0.123) q[0];
228
231
  )
229
232
 
230
233
 
231
- def test_version():
234
+ def test_version() -> None:
232
235
  (q0,) = _make_qubits(1)
233
236
  with pytest.raises(ValueError):
234
237
  output = cirq.QasmOutput((), (q0,), version='4.0')
235
238
  _ = str(output)
236
239
 
237
240
 
238
- def test_save_to_file(tmpdir):
241
+ def test_save_to_file(tmpdir) -> None:
239
242
  file_path = os.path.join(tmpdir, 'test.qasm')
240
243
  (q0,) = _make_qubits(1)
241
244
  output = cirq.QasmOutput((), (q0,))
@@ -254,7 +257,7 @@ qreg q[1];
254
257
  )
255
258
 
256
259
 
257
- def test_unsupported_operation():
260
+ def test_unsupported_operation() -> None:
258
261
  (q0,) = _make_qubits(1)
259
262
 
260
263
  class UnsupportedOperation(cirq.Operation):
@@ -266,7 +269,7 @@ def test_unsupported_operation():
266
269
  _ = str(output)
267
270
 
268
271
 
269
- def _all_operations(q0, q1, q2, q3, q4, include_measurements=True):
272
+ def _all_operations(q0, q1, q2, q3, q4, *, include_measurements=True):
270
273
  class ExampleOperation(cirq.Operation):
271
274
  qubits = (q0,)
272
275
  with_qubits = NotImplemented
@@ -354,7 +357,7 @@ def _all_operations(q0, q1, q2, q3, q4, include_measurements=True):
354
357
  )
355
358
 
356
359
 
357
- def test_output_unitary_same_as_qiskit():
360
+ def test_output_unitary_same_as_qiskit() -> None:
358
361
  qubits = tuple(_make_qubits(5))
359
362
  operations = _all_operations(*qubits, include_measurements=False)
360
363
  output = cirq.QasmOutput(operations, qubits, header='Generated from Cirq', precision=10)
@@ -365,7 +368,7 @@ def test_output_unitary_same_as_qiskit():
365
368
  cq.assert_qiskit_parsed_qasm_consistent_with_unitary(text, cirq_unitary)
366
369
 
367
370
 
368
- def test_fails_on_big_unknowns():
371
+ def test_fails_on_big_unknowns() -> None:
369
372
  class UnrecognizedGate(cirq.testing.ThreeQubitGate):
370
373
  pass
371
374
 
@@ -374,7 +377,7 @@ def test_fails_on_big_unknowns():
374
377
  _ = c.to_qasm()
375
378
 
376
379
 
377
- def test_output_format():
380
+ def test_output_format() -> None:
378
381
  def filter_unpredictable_numbers(text):
379
382
  return re.sub(r'u3\(.+\)', r'u3(<not-repeatable>)', text)
380
383
 
@@ -568,7 +571,7 @@ x q[0];
568
571
  )
569
572
 
570
573
 
571
- def test_reset():
574
+ def test_reset() -> None:
572
575
  a, b = cirq.LineQubit.range(2)
573
576
  c = cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.reset(a), cirq.reset(b))
574
577
  output = cirq.QasmOutput(
@@ -598,7 +601,7 @@ reset q[1];
598
601
  )
599
602
 
600
603
 
601
- def test_different_sized_registers():
604
+ def test_different_sized_registers() -> None:
602
605
  qubits = cirq.LineQubit.range(2)
603
606
  c = cirq.Circuit(cirq.measure(qubits[0], key='c'), cirq.measure(qubits, key='c'))
604
607
  output = cirq.QasmOutput(
@@ -14,20 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import (
18
- Any,
19
- Callable,
20
- cast,
21
- Dict,
22
- Iterable,
23
- List,
24
- Mapping,
25
- NamedTuple,
26
- Optional,
27
- Sequence,
28
- Tuple,
29
- TYPE_CHECKING,
30
- )
17
+ from typing import Any, Callable, cast, Iterable, Mapping, NamedTuple, Self, Sequence, TYPE_CHECKING
31
18
 
32
19
  import numpy as np
33
20
 
@@ -73,25 +60,25 @@ class TextDiagramDrawer:
73
60
 
74
61
  def __init__(
75
62
  self,
76
- entries: Optional[Mapping[Tuple[int, int], _DiagramText]] = None,
77
- horizontal_lines: Optional[Iterable[_HorizontalLine]] = None,
78
- vertical_lines: Optional[Iterable[_VerticalLine]] = None,
79
- horizontal_padding: Optional[Mapping[int, int]] = None,
80
- vertical_padding: Optional[Mapping[int, int]] = None,
63
+ entries: Mapping[tuple[int, int], _DiagramText] | None = None,
64
+ horizontal_lines: Iterable[_HorizontalLine] | None = None,
65
+ vertical_lines: Iterable[_VerticalLine] | None = None,
66
+ horizontal_padding: Mapping[int, float] | None = None,
67
+ vertical_padding: Mapping[int, float] | None = None,
81
68
  ) -> None:
82
- self.entries: Dict[Tuple[int, int], _DiagramText] = (
69
+ self.entries: dict[tuple[int, int], _DiagramText] = (
83
70
  dict() if entries is None else dict(entries)
84
71
  )
85
- self.horizontal_lines: List[_HorizontalLine] = (
72
+ self.horizontal_lines: list[_HorizontalLine] = (
86
73
  [] if horizontal_lines is None else list(horizontal_lines)
87
74
  )
88
- self.vertical_lines: List[_VerticalLine] = (
75
+ self.vertical_lines: list[_VerticalLine] = (
89
76
  [] if vertical_lines is None else list(vertical_lines)
90
77
  )
91
- self.horizontal_padding: Dict[int, float] = (
78
+ self.horizontal_padding: dict[int, float] = (
92
79
  dict() if horizontal_padding is None else dict(horizontal_padding)
93
80
  )
94
- self.vertical_padding: Dict[int, float] = (
81
+ self.vertical_padding: dict[int, float] = (
95
82
  dict() if vertical_padding is None else dict(vertical_padding)
96
83
  )
97
84
 
@@ -108,7 +95,7 @@ class TextDiagramDrawer:
108
95
  def __bool__(self):
109
96
  return any(self._value_equality_values_())
110
97
 
111
- def write(self, x: int, y: int, text: str, transposed_text: Optional[str] = None):
98
+ def write(self, x: int, y: int, text: str, transposed_text: str | None = None) -> None:
112
99
  """Adds text to the given location.
113
100
 
114
101
  Args:
@@ -143,7 +130,7 @@ class TextDiagramDrawer:
143
130
 
144
131
  def grid_line(
145
132
  self, x1: int, y1: int, x2: int, y2: int, emphasize: bool = False, doubled: bool = False
146
- ):
133
+ ) -> None:
147
134
  """Adds a vertical or horizontal line from (x1, y1) to (x2, y2).
148
135
 
149
136
  Horizontal line is selected on equality in the second coordinate and
@@ -215,7 +202,7 @@ class TextDiagramDrawer:
215
202
  """Change the padding after the given row."""
216
203
  self.vertical_padding[index] = padding
217
204
 
218
- def _transform_coordinates(self, func: Callable[[float, float], Tuple[float, float]]) -> None:
205
+ def _transform_coordinates(self, func: Callable[[float, float], tuple[float, float]]) -> None:
219
206
  """Helper method to transformer either row or column coordinates."""
220
207
 
221
208
  def func_x(x: float) -> float:
@@ -225,7 +212,7 @@ class TextDiagramDrawer:
225
212
  return func(0, y)[1]
226
213
 
227
214
  self.entries = {
228
- cast(Tuple[int, int], func(int(x), int(y))): v for (x, y), v in self.entries.items()
215
+ cast(tuple[int, int], func(int(x), int(y))): v for (x, y), v in self.entries.items()
229
216
  }
230
217
  self.vertical_lines = [
231
218
  _VerticalLine(func_x(x), func_y(y1), func_y(y2), emph, doubled)
@@ -245,7 +232,7 @@ class TextDiagramDrawer:
245
232
  def insert_empty_columns(self, x: int, amount: int = 1) -> None:
246
233
  """Insert a number of columns after the given column."""
247
234
 
248
- def transform_columns(column: float, row: float) -> Tuple[float, float]:
235
+ def transform_columns(column: float, row: float) -> tuple[float, float]:
249
236
  return column + (amount if column >= x else 0), row
250
237
 
251
238
  self._transform_coordinates(transform_columns)
@@ -253,7 +240,7 @@ class TextDiagramDrawer:
253
240
  def insert_empty_rows(self, y: int, amount: int = 1) -> None:
254
241
  """Insert a number of rows after the given row."""
255
242
 
256
- def transform_rows(column: float, row: float) -> Tuple[float, float]:
243
+ def transform_rows(column: float, row: float) -> tuple[float, float]:
257
244
  return column, row + (amount if row >= y else 0)
258
245
 
259
246
  self._transform_coordinates(transform_rows)
@@ -262,7 +249,7 @@ class TextDiagramDrawer:
262
249
  self,
263
250
  horizontal_spacing: int = 1,
264
251
  vertical_spacing: int = 1,
265
- crossing_char: Optional[str] = None,
252
+ crossing_char: str | None = None,
266
253
  use_unicode_characters: bool = True,
267
254
  ) -> str:
268
255
  """Outputs text containing the diagram."""
@@ -326,7 +313,7 @@ class TextDiagramDrawer:
326
313
 
327
314
  return block_diagram.render()
328
315
 
329
- def copy(self):
316
+ def copy(self) -> Self:
330
317
  return self.__class__(
331
318
  entries=self.entries,
332
319
  vertical_lines=self.vertical_lines,
@@ -357,7 +344,7 @@ class TextDiagramDrawer:
357
344
  def vstack(
358
345
  cls,
359
346
  diagrams: Sequence[cirq.TextDiagramDrawer],
360
- padding_resolver: Optional[Callable[[Sequence[Optional[int]]], int]] = None,
347
+ padding_resolver: Callable[[Sequence[int | None]], int] | None = None,
361
348
  ):
362
349
  """Vertically stack text diagrams.
363
350
 
@@ -386,9 +373,7 @@ class TextDiagramDrawer:
386
373
  dy += diagram.height()
387
374
  for x in stacked.horizontal_padding:
388
375
  resolved_padding = padding_resolver(
389
- tuple(
390
- cast(Optional[int], diagram.horizontal_padding.get(x)) for diagram in diagrams
391
- )
376
+ tuple(cast(int | None, diagram.horizontal_padding.get(x)) for diagram in diagrams)
392
377
  )
393
378
  if resolved_padding is not None:
394
379
  stacked.horizontal_padding[x] = resolved_padding
@@ -398,7 +383,7 @@ class TextDiagramDrawer:
398
383
  def hstack(
399
384
  cls,
400
385
  diagrams: Sequence[cirq.TextDiagramDrawer],
401
- padding_resolver: Optional[Callable[[Sequence[Optional[int]]], int]] = None,
386
+ padding_resolver: Callable[[Sequence[int | None]], int] | None = None,
402
387
  ):
403
388
  """Horizontally stack text diagrams.
404
389
 
@@ -427,7 +412,7 @@ class TextDiagramDrawer:
427
412
  dx += diagram.width()
428
413
  for y in stacked.vertical_padding:
429
414
  resolved_padding = padding_resolver(
430
- tuple(cast(Optional[int], diagram.vertical_padding.get(y)) for diagram in diagrams)
415
+ tuple(cast(int | None, diagram.vertical_padding.get(y)) for diagram in diagrams)
431
416
  )
432
417
  if resolved_padding is not None:
433
418
  stacked.vertical_padding[y] = resolved_padding
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from unittest import mock
16
18
 
17
19
  import pytest
@@ -57,7 +59,7 @@ def assert_has_rendering(actual: TextDiagramDrawer, desired: str, **kwargs) -> N
57
59
  )
58
60
 
59
61
 
60
- def test_draw_entries_and_lines_with_options():
62
+ def test_draw_entries_and_lines_with_options() -> None:
61
63
  d = TextDiagramDrawer()
62
64
  d.write(0, 0, '!')
63
65
  d.write(6, 2, 'span')
@@ -130,7 +132,7 @@ def test_draw_entries_and_lines_with_options():
130
132
  )
131
133
 
132
134
 
133
- def test_draw_entries_and_lines_with_emphasize():
135
+ def test_draw_entries_and_lines_with_emphasize() -> None:
134
136
  d = TextDiagramDrawer()
135
137
  d.write(0, 0, '!')
136
138
  d.write(6, 2, 'span')
@@ -159,27 +161,27 @@ def test_draw_entries_and_lines_with_emphasize():
159
161
  )
160
162
 
161
163
 
162
- def test_line_detects_horizontal():
164
+ def test_line_detects_horizontal() -> None:
163
165
  d = TextDiagramDrawer()
164
166
  with mock.patch.object(d, 'vertical_line') as vertical_line:
165
167
  d.grid_line(1, 2, 1, 5, True)
166
168
  vertical_line.assert_called_once_with(1, 2, 5, True, False)
167
169
 
168
170
 
169
- def test_line_detects_vertical():
171
+ def test_line_detects_vertical() -> None:
170
172
  d = TextDiagramDrawer()
171
173
  with mock.patch.object(d, 'horizontal_line') as horizontal_line:
172
174
  d.grid_line(2, 1, 5, 1, True)
173
175
  horizontal_line.assert_called_once_with(1, 2, 5, True, False)
174
176
 
175
177
 
176
- def test_line_fails_when_not_aligned():
178
+ def test_line_fails_when_not_aligned() -> None:
177
179
  d = TextDiagramDrawer()
178
180
  with pytest.raises(ValueError):
179
181
  d.grid_line(1, 2, 3, 4)
180
182
 
181
183
 
182
- def test_multiline_entries():
184
+ def test_multiline_entries() -> None:
183
185
  d = TextDiagramDrawer()
184
186
  d.write(0, 0, 'hello\nthere')
185
187
  d.write(0, 1, 'next')
@@ -223,7 +225,7 @@ short │ │ │
223
225
  )
224
226
 
225
227
 
226
- def test_drawer_copy():
228
+ def test_drawer_copy() -> None:
227
229
  orig_entries = {(0, 0): _DiagramText('entry', '')}
228
230
  orig_vertical_lines = [_VerticalLine(1, 1, 3, True, False)]
229
231
  orig_horizontal_lines = [_HorizontalLine(0, 0, 3, False, False)]
@@ -236,9 +238,9 @@ def test_drawer_copy():
236
238
  'vertical_padding': orig_vertical_padding,
237
239
  'horizontal_padding': orig_horizontal_padding,
238
240
  }
239
- orig_drawer = TextDiagramDrawer(**kwargs)
241
+ orig_drawer = TextDiagramDrawer(**kwargs) # type: ignore[arg-type]
240
242
 
241
- same_drawer = TextDiagramDrawer(**kwargs)
243
+ same_drawer = TextDiagramDrawer(**kwargs) # type: ignore[arg-type]
242
244
  assert orig_drawer == same_drawer
243
245
 
244
246
  copy_drawer = orig_drawer.copy()
@@ -264,7 +266,7 @@ def test_drawer_copy():
264
266
  assert copy_drawer != orig_drawer
265
267
 
266
268
 
267
- def test_drawer_stack():
269
+ def test_drawer_stack() -> None:
268
270
  d = TextDiagramDrawer()
269
271
  d.write(0, 0, 'A')
270
272
  d.write(1, 0, 'B')
@@ -334,7 +336,7 @@ AB D
334
336
  with pytest.raises(ValueError):
335
337
  TextDiagramDrawer.vstack((d, dd))
336
338
 
337
- vstacked = TextDiagramDrawer.vstack((dd, d), padding_resolver=max)
339
+ vstacked = TextDiagramDrawer.vstack((dd, d), padding_resolver=max) # type: ignore[arg-type]
338
340
  expected = """
339
341
  D
340
342
 
@@ -348,7 +350,7 @@ A B
348
350
  """.strip()
349
351
  assert_has_rendering(vstacked, expected)
350
352
 
351
- hstacked = TextDiagramDrawer.hstack((d, dd), padding_resolver=max)
353
+ hstacked = TextDiagramDrawer.hstack((d, dd), padding_resolver=max) # type: ignore[arg-type]
352
354
  expected = """
353
355
  AB D
354
356
 
@@ -358,7 +360,7 @@ AB D
358
360
  """.strip()
359
361
  assert_has_rendering(hstacked, expected)
360
362
 
361
- vstacked_min = TextDiagramDrawer.vstack((dd, d), padding_resolver=min)
363
+ vstacked_min = TextDiagramDrawer.vstack((dd, d), padding_resolver=min) # type: ignore[arg-type]
362
364
  expected = """
363
365
  D
364
366
 
@@ -372,7 +374,7 @@ AB
372
374
  """.strip()
373
375
  assert_has_rendering(vstacked_min, expected)
374
376
 
375
- hstacked_min = TextDiagramDrawer.hstack((d, dd), padding_resolver=min)
377
+ hstacked_min = TextDiagramDrawer.hstack((d, dd), padding_resolver=min) # type: ignore[arg-type]
376
378
  expected = """
377
379
  AB D
378
380
 
@@ -381,7 +383,7 @@ AB D
381
383
  assert_has_rendering(hstacked_min, expected)
382
384
 
383
385
 
384
- def test_drawer_eq():
386
+ def test_drawer_eq() -> None:
385
387
  assert TextDiagramDrawer().__eq__(23) == NotImplemented
386
388
 
387
389
  eq = ct.EqualsTester()
@@ -405,7 +407,7 @@ def test_drawer_eq():
405
407
  eq.add_equality_group(dd)
406
408
 
407
409
 
408
- def test_drawer_superimposed():
410
+ def test_drawer_superimposed() -> None:
409
411
  empty_drawer = TextDiagramDrawer()
410
412
  assert not empty_drawer
411
413
  drawer_with_something = TextDiagramDrawer()
@@ -416,7 +418,7 @@ def test_drawer_superimposed():
416
418
  assert not empty_drawer
417
419
 
418
420
 
419
- def test_pick_charset():
421
+ def test_pick_charset() -> None:
420
422
  assert pick_charset(use_unicode=False, emphasize=False, doubled=False) == ASCII_BOX_CHARS
421
423
  assert pick_charset(use_unicode=False, emphasize=False, doubled=True) == ASCII_BOX_CHARS
422
424
  assert pick_charset(use_unicode=False, emphasize=True, doubled=False) == ASCII_BOX_CHARS
cirq/conftest.py CHANGED
@@ -14,18 +14,19 @@
14
14
 
15
15
  import inspect
16
16
  import os
17
+ from collections.abc import Iterator
17
18
 
18
19
  import matplotlib.pyplot as plt
19
20
  import pytest
20
21
 
21
22
 
22
- def pytest_configure(config):
23
+ def pytest_configure(config) -> None:
23
24
  # Use matplotlib agg backend which does not require a display.
24
25
  plt.switch_backend('agg')
25
26
  os.environ['CIRQ_TESTING'] = "true"
26
27
 
27
28
 
28
- def pytest_pyfunc_call(pyfuncitem):
29
+ def pytest_pyfunc_call(pyfuncitem) -> None:
29
30
  if inspect.iscoroutinefunction(pyfuncitem._obj):
30
31
  raise ValueError( # pragma: no cover
31
32
  f'{pyfuncitem._obj.__name__} is a bare async function. '
@@ -34,6 +35,6 @@ def pytest_pyfunc_call(pyfuncitem):
34
35
 
35
36
 
36
37
  @pytest.fixture
37
- def closefigures():
38
+ def closefigures() -> Iterator[None]:
38
39
  yield
39
40
  plt.close('all')
cirq/contrib/__init__.py CHANGED
@@ -18,9 +18,9 @@ Any contributions not ready for full production can be put in a subdirectory in
18
18
  this package.
19
19
  """
20
20
 
21
- from cirq.contrib import acquaintance
22
- from cirq.contrib import graph_device
23
- from cirq.contrib import quirk
21
+ from cirq.contrib import acquaintance # noqa: F401
22
+ from cirq.contrib import graph_device # noqa: F401
23
+ from cirq.contrib import quirk # noqa: F401
24
24
  from cirq.contrib.qcircuit import circuit_to_latex_using_qcircuit as circuit_to_latex_using_qcircuit
25
- from cirq.contrib import json
25
+ from cirq.contrib import json # noqa: F401
26
26
  from cirq.contrib.circuitdag import CircuitDag as CircuitDag, Unique as Unique
@@ -79,4 +79,4 @@ from cirq.contrib.acquaintance.topological_sort import (
79
79
  random_topological_sort as random_topological_sort,
80
80
  )
81
81
 
82
- from cirq.contrib.acquaintance import testing
82
+ from cirq.contrib.acquaintance import testing # noqa: F401
@@ -16,7 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import enum
18
18
  import itertools
19
- from typing import Dict, Iterator, Sequence, Tuple, TYPE_CHECKING, Union
19
+ from typing import Iterator, Sequence, TYPE_CHECKING
20
20
 
21
21
  from cirq import ops
22
22
  from cirq.contrib.acquaintance.gates import acquaint
@@ -61,10 +61,7 @@ class BipartiteSwapNetworkGate(PermutationGate):
61
61
  """
62
62
 
63
63
  def __init__(
64
- self,
65
- subgraph: Union[str, BipartiteGraphType],
66
- part_size: int,
67
- swap_gate: cirq.Gate = ops.SWAP,
64
+ self, subgraph: str | BipartiteGraphType, part_size: int, swap_gate: cirq.Gate = ops.SWAP
68
65
  ) -> None:
69
66
  super().__init__(2 * part_size, swap_gate)
70
67
  self.part_size = part_size
@@ -106,7 +103,7 @@ class BipartiteSwapNetworkGate(PermutationGate):
106
103
  return self.decompose_matching(qubits)
107
104
  raise NotImplementedError('No decomposition implemented for ' + str(self.subgraph))
108
105
 
109
- def permutation(self) -> Dict[int, int]:
106
+ def permutation(self) -> dict[int, int]:
110
107
  if self.num_qubits() != 2 * self.part_size:
111
108
  raise ValueError('qubit_count != 2 * self.part_size')
112
109
  if self.subgraph == BipartiteGraphType.MATCHING:
@@ -124,7 +121,7 @@ class BipartiteSwapNetworkGate(PermutationGate):
124
121
  return dict(enumerate(range(2 * self.part_size)))
125
122
  raise NotImplementedError(str(self.subgraph) + 'not implemented')
126
123
 
127
- def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> Tuple[str, ...]:
124
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, ...]:
128
125
  qubit_count = 2 * self.part_size
129
126
  if args.known_qubit_count not in (None, qubit_count):
130
127
  raise ValueError('args.known_qubit_count not in (None, 2 * self.part_size)')
@@ -149,7 +146,7 @@ class BipartiteSwapNetworkGate(PermutationGate):
149
146
  return wire_symbols
150
147
 
151
148
  def __repr__(self) -> str:
152
- args: Tuple[str, ...] = (repr(self.subgraph), repr(self.part_size))
149
+ args: tuple[str, ...] = (repr(self.subgraph), repr(self.part_size))
153
150
  if self.swap_gate != ops.SWAP:
154
151
  args += (repr(self.swap_gate),)
155
152
  args_str = ', '.join(args)