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,28 +12,27 @@
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 cmath
16
18
  import re
17
19
  from typing import (
18
20
  Any,
19
21
  Callable,
20
22
  cast,
21
- Dict,
22
23
  Iterable,
23
24
  Iterator,
24
- List,
25
25
  Mapping,
26
- Optional,
27
26
  SupportsFloat,
27
+ TypeAlias,
28
28
  TypeVar,
29
- Union,
30
29
  )
31
30
 
32
31
  import numpy as np
33
32
  import sympy
34
33
 
35
34
 
36
- def _merge_scientific_float_tokens(tokens: Iterable[str]) -> List[str]:
35
+ def _merge_scientific_float_tokens(tokens: Iterable[str]) -> list[str]:
37
36
  tokens = list(tokens)
38
37
  i = 0
39
38
  while 'e' in tokens[i + 1 :]:
@@ -54,8 +53,8 @@ def _merge_scientific_float_tokens(tokens: Iterable[str]) -> List[str]:
54
53
  T = TypeVar('T')
55
54
 
56
55
 
57
- def _segment_by(seq: Iterable[T], *, key: Callable[[T], Any]) -> Iterator[List[T]]:
58
- group: List[T] = []
56
+ def _segment_by(seq: Iterable[T], *, key: Callable[[T], Any]) -> Iterator[list[T]]:
57
+ group: list[T] = []
59
58
  last_key = None
60
59
  for item in seq:
61
60
  item_key = key(item)
@@ -68,8 +67,8 @@ def _segment_by(seq: Iterable[T], *, key: Callable[[T], Any]) -> Iterator[List[T
68
67
  yield group
69
68
 
70
69
 
71
- def _tokenize(text: str) -> List[str]:
72
- def classify(e: str) -> Union[str, float]:
70
+ def _tokenize(text: str) -> list[str]:
71
+ def classify(e: str) -> str | float:
73
72
  assert e.strip() != '' # Because _segment_by drops empty entries.
74
73
  if re.match(r'[.0-9]', e):
75
74
  return "#"
@@ -85,14 +84,14 @@ def _tokenize(text: str) -> List[str]:
85
84
  return _merge_scientific_float_tokens(g for g in result if g.strip())
86
85
 
87
86
 
88
- _ResolvedToken = Union[sympy.Expr, complex]
87
+ _ResolvedToken: TypeAlias = sympy.Expr | complex
89
88
 
90
89
 
91
90
  class _CustomQuirkOperationToken:
92
91
  def __init__(
93
92
  self,
94
- unary_action: Optional[Callable[[_ResolvedToken], _ResolvedToken]],
95
- binary_action: Optional[Callable[[_ResolvedToken, _ResolvedToken], _ResolvedToken]],
93
+ unary_action: Callable[[_ResolvedToken], _ResolvedToken] | None,
94
+ binary_action: Callable[[_ResolvedToken, _ResolvedToken], _ResolvedToken] | None,
96
95
  priority: float,
97
96
  ):
98
97
  self.unary_action = unary_action
@@ -108,7 +107,7 @@ class _HangingNode:
108
107
  self.weight = weight
109
108
 
110
109
 
111
- _HangingToken = Union[_ResolvedToken, str, _CustomQuirkOperationToken]
110
+ _HangingToken: TypeAlias = _ResolvedToken | str | _CustomQuirkOperationToken
112
111
 
113
112
 
114
113
  def _translate_token(token_id: str, token_map: Mapping[str, _HangingToken]) -> _HangingToken:
@@ -122,10 +121,10 @@ def _translate_token(token_id: str, token_map: Mapping[str, _HangingToken]) -> _
122
121
 
123
122
 
124
123
  def _parse_formula_using_token_map(
125
- text: str, token_map: Dict[str, _HangingToken]
124
+ text: str, token_map: dict[str, _HangingToken]
126
125
  ) -> _ResolvedToken:
127
126
  """Parses a value from an infix arithmetic expression."""
128
- tokens: List[_HangingToken] = [_translate_token(e, token_map) for e in _tokenize(text)]
127
+ tokens: list[_HangingToken] = [_translate_token(e, token_map) for e in _tokenize(text)]
129
128
 
130
129
  # Cut off trailing operation, so parse fails less often as users are typing.
131
130
  if (
@@ -135,8 +134,8 @@ def _parse_formula_using_token_map(
135
134
  ):
136
135
  tokens = tokens[:-1]
137
136
 
138
- ops: List[Union[str, _HangingNode]] = []
139
- vals: List[Optional[_HangingToken]] = []
137
+ ops: list[str | _HangingNode] = []
138
+ vals: list[_HangingToken | None] = []
140
139
 
141
140
  # Hack: use the 'priority' field as a signal of 'is an operation'
142
141
  def is_valid_end_token(tok: _HangingToken) -> bool:
@@ -145,7 +144,7 @@ def _parse_formula_using_token_map(
145
144
  def is_valid_end_state() -> bool:
146
145
  return len(vals) == 1 and len(ops) == 0
147
146
 
148
- def apply(op: Union[str, _HangingNode]) -> None:
147
+ def apply(op: str | _HangingNode) -> None:
149
148
  assert isinstance(op, _HangingNode)
150
149
  if len(vals) < 2:
151
150
  raise ValueError("Bad expression: operated on nothing.\ntext={text!r}")
@@ -237,7 +236,7 @@ UNICODE_FRACTIONS = {
237
236
  "⅒": 1 / 10,
238
237
  }
239
238
 
240
- PARSE_COMPLEX_TOKEN_MAP_ALL: Dict[str, _HangingToken] = {
239
+ PARSE_COMPLEX_TOKEN_MAP_ALL: dict[str, _HangingToken] = {
241
240
  **UNICODE_FRACTIONS,
242
241
  'i': 1j,
243
242
  'e': sympy.E,
@@ -265,7 +264,7 @@ PARSE_COMPLEX_TOKEN_MAP_ALL: Dict[str, _HangingToken] = {
265
264
  }
266
265
  PARSE_COMPLEX_TOKEN_MAP_ALL["√"] = PARSE_COMPLEX_TOKEN_MAP_ALL["sqrt"]
267
266
 
268
- PARSE_COMPLEX_TOKEN_MAP_DEG: Dict[str, _HangingToken] = {
267
+ PARSE_COMPLEX_TOKEN_MAP_DEG: dict[str, _HangingToken] = {
269
268
  **PARSE_COMPLEX_TOKEN_MAP_ALL,
270
269
  "cos": _CustomQuirkOperationToken(
271
270
  unary_action=lambda e: sympy.cos(e * sympy.pi / 180), binary_action=None, priority=4
@@ -283,7 +282,7 @@ PARSE_COMPLEX_TOKEN_MAP_DEG: Dict[str, _HangingToken] = {
283
282
  PARSE_COMPLEX_TOKEN_MAP_DEG["arccos"] = PARSE_COMPLEX_TOKEN_MAP_DEG["acos"]
284
283
  PARSE_COMPLEX_TOKEN_MAP_DEG["arcsin"] = PARSE_COMPLEX_TOKEN_MAP_DEG["asin"]
285
284
 
286
- PARSE_COMPLEX_TOKEN_MAP_RAD: Dict[str, _HangingToken] = {
285
+ PARSE_COMPLEX_TOKEN_MAP_RAD: dict[str, _HangingToken] = {
287
286
  **PARSE_COMPLEX_TOKEN_MAP_ALL,
288
287
  "cos": _CustomQuirkOperationToken(
289
288
  unary_action=lambda e: sympy.cos(e) if isinstance(e, sympy.Basic) else cmath.cos(e),
@@ -337,12 +336,12 @@ def parse_complex(text: str) -> complex:
337
336
  raise ValueError(f'Failed to parse complex from {text!r}') from ex
338
337
 
339
338
 
340
- def parse_formula(formula: str) -> Union[float, sympy.Expr]:
339
+ def parse_formula(formula: str) -> float | sympy.Expr:
341
340
  """Attempts to parse formula text in exactly the same way as Quirk."""
342
341
  if not isinstance(formula, str):
343
342
  raise TypeError('formula must be a string')
344
343
 
345
- token_map: Dict[str, _HangingToken] = {**PARSE_COMPLEX_TOKEN_MAP_RAD, 't': sympy.Symbol('t')}
344
+ token_map: dict[str, _HangingToken] = {**PARSE_COMPLEX_TOKEN_MAP_RAD, 't': sympy.Symbol('t')}
346
345
  result = _parse_formula_using_token_map(formula, token_map)
347
346
 
348
347
  if isinstance(result, sympy.Basic):
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
  import sympy
@@ -19,7 +21,7 @@ import sympy
19
21
  from cirq.interop.quirk.cells.parse import parse_complex, parse_formula, parse_matrix
20
22
 
21
23
 
22
- def test_parse_matrix():
24
+ def test_parse_matrix() -> None:
23
25
  s = np.sqrt(0.5)
24
26
  np.testing.assert_allclose(
25
27
  parse_matrix('{{√½,√½},{-√½,√½}}'), np.array([[s, s], [-s, s]]), atol=1e-8
@@ -32,7 +34,7 @@ def test_parse_matrix():
32
34
  )
33
35
 
34
36
 
35
- def test_parse_matrix_failures():
37
+ def test_parse_matrix_failures() -> None:
36
38
  with pytest.raises(ValueError, match='Not surrounded by {{}}'):
37
39
  _ = parse_matrix('1')
38
40
  with pytest.raises(ValueError, match='Not surrounded by {{}}'):
@@ -45,7 +47,7 @@ def test_parse_matrix_failures():
45
47
  _ = parse_matrix('{{x}}')
46
48
 
47
49
 
48
- def test_parse_real_formula():
50
+ def test_parse_real_formula() -> None:
49
51
  t = sympy.Symbol('t')
50
52
  assert parse_formula('1/2') == 0.5
51
53
  assert parse_formula('t*t + ln(t)') == t * t + sympy.ln(t)
@@ -58,12 +60,12 @@ def test_parse_real_formula():
58
60
  _ = parse_formula('i')
59
61
 
60
62
 
61
- def test_parse_formula_failures():
63
+ def test_parse_formula_failures() -> None:
62
64
  with pytest.raises(TypeError, match='formula must be a string'):
63
- _ = parse_formula(2)
65
+ _ = parse_formula(2) # type: ignore[arg-type]
64
66
 
65
67
  with pytest.raises(TypeError, match='formula must be a string'):
66
- _ = parse_formula([])
68
+ _ = parse_formula([]) # type: ignore[arg-type]
67
69
 
68
70
  with pytest.raises(ValueError, match='Unrecognized token'):
69
71
  _ = parse_formula('5*__**DSA **)SADD')
@@ -72,7 +74,7 @@ def test_parse_formula_failures():
72
74
  _ = parse_formula('5*x')
73
75
 
74
76
 
75
- def test_parse_complex():
77
+ def test_parse_complex() -> None:
76
78
  assert parse_complex('0') == 0
77
79
  assert parse_complex('1') == 1
78
80
  assert parse_complex('i') == 1j
@@ -84,7 +86,7 @@ def test_parse_complex():
84
86
  np.testing.assert_allclose(parse_complex('exp 2'), np.e**2, atol=1e-8)
85
87
 
86
88
 
87
- def test_parse_complex_raw_cases_from_quirk():
89
+ def test_parse_complex_raw_cases_from_quirk() -> None:
88
90
  assert parse_complex("0") == 0
89
91
  assert parse_complex("1") == 1
90
92
  assert parse_complex("-1") == -1
@@ -116,7 +118,7 @@ def test_parse_complex_raw_cases_from_quirk():
116
118
  np.testing.assert_allclose(parse_complex("2 pi"), 2 * np.pi)
117
119
 
118
120
 
119
- def test_parse_complex_expression_cases_from_quirk():
121
+ def test_parse_complex_expression_cases_from_quirk() -> None:
120
122
  np.testing.assert_allclose(parse_complex("1/3"), 1 / 3)
121
123
  np.testing.assert_allclose(parse_complex("2/3/5"), (2 / 3) / 5)
122
124
  np.testing.assert_allclose(parse_complex("2/3/5*7/13"), ((((2 / 3) / 5)) * 7) / 13)
@@ -152,7 +154,7 @@ def test_parse_complex_expression_cases_from_quirk():
152
154
  np.testing.assert_allclose(parse_complex("cos(acos(0.5))"), 0.5, atol=1e-8)
153
155
 
154
156
 
155
- def test_parse_complex_expression_failures():
157
+ def test_parse_complex_expression_failures() -> None:
156
158
  with pytest.raises(ValueError, match='Incomplete expression'):
157
159
  _ = parse_formula('(')
158
160
  with pytest.raises(ValueError, match=r"unmatched '\)'"):
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Callable, Iterator, Sequence, Tuple, TYPE_CHECKING
15
+ from __future__ import annotations
16
+
17
+ from typing import Callable, Iterator, Sequence, TYPE_CHECKING
16
18
 
17
19
  from cirq import ops, value
18
20
  from cirq.interop.quirk.cells.cell import CELL_SIZES, CellMaker
@@ -42,7 +44,7 @@ class QuirkQubitPermutationGate(ops.QubitPermutationGate):
42
44
  def _value_equality_values_(self):
43
45
  return self.identifier, self.name, self.permutation
44
46
 
45
- def _circuit_diagram_info_(self, args: 'cirq.CircuitDiagramInfoArgs') -> Tuple[str, ...]:
47
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, ...]:
46
48
  return tuple(
47
49
  f'{self.name}[{i}>{self.permutation[i]}]' for i in range(len(self.permutation))
48
50
  )
@@ -72,7 +74,7 @@ def _permutation_family(
72
74
  yield _permutation(identifier_prefix + str(n), name, permutation)
73
75
 
74
76
 
75
- def _permutation(identifier: str, name: str, permutation: Tuple[int, ...]) -> CellMaker:
77
+ def _permutation(identifier: str, name: str, permutation: tuple[int, ...]) -> CellMaker:
76
78
  return CellMaker(
77
79
  identifier,
78
80
  size=len(permutation),
@@ -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 cirq
16
18
  from cirq.interop.quirk.cells.qubit_permutation_cells import QuirkQubitPermutationGate
17
19
  from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
18
20
 
19
21
 
20
- def test_equality():
22
+ def test_equality() -> None:
21
23
  eq = cirq.testing.EqualsTester()
22
24
  eq.make_equality_group(lambda: QuirkQubitPermutationGate('a', 'b', [0, 1]))
23
25
  eq.add_equality_group(QuirkQubitPermutationGate('x', 'b', [0, 1]))
@@ -25,11 +27,11 @@ def test_equality():
25
27
  eq.add_equality_group(QuirkQubitPermutationGate('a', 'b', [1, 0]))
26
28
 
27
29
 
28
- def test_repr():
30
+ def test_repr() -> None:
29
31
  cirq.testing.assert_equivalent_repr(QuirkQubitPermutationGate('a', 'b', [0, 1]))
30
32
 
31
33
 
32
- def test_right_rotate():
34
+ def test_right_rotate() -> None:
33
35
  assert_url_to_circuit_returns(
34
36
  '{"cols":[["X",">>4",1,1,1,"X"]]}',
35
37
  diagram="""
@@ -57,7 +59,7 @@ def test_right_rotate():
57
59
  )
58
60
 
59
61
 
60
- def test_left_rotate():
62
+ def test_left_rotate() -> None:
61
63
  assert_url_to_circuit_returns(
62
64
  '{"cols":[["<<4"]]}',
63
65
  maps={
@@ -72,7 +74,7 @@ def test_left_rotate():
72
74
  )
73
75
 
74
76
 
75
- def test_reverse():
77
+ def test_reverse() -> None:
76
78
  assert_url_to_circuit_returns(
77
79
  '{"cols":[["rev4"]]}',
78
80
  maps={
@@ -98,7 +100,7 @@ def test_reverse():
98
100
  )
99
101
 
100
102
 
101
- def test_interleave():
103
+ def test_interleave() -> None:
102
104
  assert_url_to_circuit_returns(
103
105
  '{"cols":[["weave5"]]}',
104
106
  maps={
@@ -128,7 +130,7 @@ def test_interleave():
128
130
  )
129
131
 
130
132
 
131
- def test_deinterleave():
133
+ def test_deinterleave() -> None:
132
134
  assert_url_to_circuit_returns(
133
135
  '{"cols":[["split5"]]}',
134
136
  maps={
@@ -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
  from typing import Iterator, TYPE_CHECKING
15
18
 
16
19
  from cirq import ops
@@ -28,5 +31,5 @@ def generate_all_scalar_cell_makers() -> Iterator[CellMaker]:
28
31
  yield _scalar("√-i", ops.global_phase_operation((-1j) ** 0.5))
29
32
 
30
33
 
31
- def _scalar(identifier: str, operation: 'cirq.Operation') -> CellMaker:
34
+ def _scalar(identifier: str, operation: cirq.Operation) -> CellMaker:
32
35
  return CellMaker(identifier, size=1, maker=lambda _: operation)
@@ -12,11 +12,13 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import cirq
16
18
  from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
17
19
 
18
20
 
19
- def test_scalar_operations():
21
+ def test_scalar_operations() -> None:
20
22
  assert_url_to_circuit_returns('{"cols":[["…"]]}', cirq.Circuit())
21
23
 
22
24
  assert_url_to_circuit_returns(
@@ -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
  from typing import Callable, Iterator, TYPE_CHECKING
15
18
 
16
19
  import sympy
@@ -91,14 +94,14 @@ def generate_all_single_qubit_rotation_cell_makers() -> Iterator[CellMaker]:
91
94
  yield _formula_gate("Rzft", "pi*t*t", ops.rz)
92
95
 
93
96
 
94
- def _gate(identifier: str, gate: 'cirq.Gate') -> CellMaker:
97
+ def _gate(identifier: str, gate: cirq.Gate) -> CellMaker:
95
98
  return CellMaker(
96
99
  identifier=identifier, size=gate.num_qubits(), maker=lambda args: gate.on(*args.qubits)
97
100
  )
98
101
 
99
102
 
100
103
  def _formula_gate(
101
- identifier: str, default_formula: str, gate_func: Callable[['cirq.TParamVal'], 'cirq.Gate']
104
+ identifier: str, default_formula: str, gate_func: Callable[[cirq.TParamVal], cirq.Gate]
102
105
  ) -> CellMaker:
103
106
  return CellMaker(
104
107
  identifier=identifier,
@@ -12,13 +12,15 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import sympy
16
18
 
17
19
  import cirq
18
20
  from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
19
21
 
20
22
 
21
- def test_fixed_single_qubit_rotations():
23
+ def test_fixed_single_qubit_rotations() -> None:
22
24
  a, b, c, d = cirq.LineQubit.range(4)
23
25
 
24
26
  assert_url_to_circuit_returns(
@@ -89,7 +91,7 @@ def test_fixed_single_qubit_rotations():
89
91
  )
90
92
 
91
93
 
92
- def test_dynamic_single_qubit_rotations():
94
+ def test_dynamic_single_qubit_rotations() -> None:
93
95
  a, b, c = cirq.LineQubit.range(3)
94
96
  t = sympy.Symbol('t')
95
97
 
@@ -118,7 +120,7 @@ def test_dynamic_single_qubit_rotations():
118
120
  )
119
121
 
120
122
 
121
- def test_formulaic_gates():
123
+ def test_formulaic_gates() -> None:
122
124
  a, b = cirq.LineQubit.range(2)
123
125
  t = sympy.Symbol('t')
124
126
 
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Any, Iterable, Iterator, List, Optional, TYPE_CHECKING
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Iterable, Iterator, TYPE_CHECKING
16
18
 
17
19
  from cirq import ops, value
18
20
  from cirq.interop.quirk.cells.cell import Cell, CellMaker
@@ -23,20 +25,20 @@ if TYPE_CHECKING:
23
25
 
24
26
  @value.value_equality(unhashable=True)
25
27
  class SwapCell(Cell):
26
- def __init__(self, qubits: Iterable['cirq.Qid'], controls: Iterable['cirq.Qid']):
28
+ def __init__(self, qubits: Iterable[cirq.Qid], controls: Iterable[cirq.Qid]):
27
29
  self._qubits = list(qubits)
28
30
  self._controls = list(controls)
29
31
 
30
32
  def gate_count(self) -> int:
31
33
  return 1
32
34
 
33
- def with_line_qubits_mapped_to(self, qubits: List['cirq.Qid']) -> 'Cell':
35
+ def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
34
36
  return SwapCell(
35
37
  qubits=Cell._replace_qubits(self._qubits, qubits),
36
38
  controls=Cell._replace_qubits(self._controls, qubits),
37
39
  )
38
40
 
39
- def modify_column(self, column: List[Optional['Cell']]):
41
+ def modify_column(self, column: list[Cell | None]):
40
42
  # Swallow other swap cells.
41
43
  for i in range(len(column)):
42
44
  gate = column[i]
@@ -45,12 +47,12 @@ class SwapCell(Cell):
45
47
  self._qubits += gate._qubits
46
48
  column[i] = None
47
49
 
48
- def operations(self) -> 'cirq.OP_TREE':
50
+ def operations(self) -> cirq.OP_TREE:
49
51
  if len(self._qubits) != 2:
50
52
  raise ValueError('Wrong number of swap gates in a column.')
51
53
  return ops.SWAP(*self._qubits).controlled_by(*self._controls)
52
54
 
53
- def controlled_by(self, qubit: 'cirq.Qid'):
55
+ def controlled_by(self, qubit: cirq.Qid):
54
56
  return SwapCell(self._qubits, self._controls + [qubit])
55
57
 
56
58
  def _value_equality_values_(self) -> Any:
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import pytest
16
18
 
17
19
  import cirq
@@ -19,7 +21,7 @@ from cirq import quirk_url_to_circuit
19
21
  from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
20
22
 
21
23
 
22
- def test_swap():
24
+ def test_swap() -> None:
23
25
  a, b, c = cirq.LineQubit.range(3)
24
26
  assert_url_to_circuit_returns('{"cols":[["Swap","Swap"]]}', cirq.Circuit(cirq.SWAP(a, b)))
25
27
  assert_url_to_circuit_returns(
@@ -34,7 +36,7 @@ def test_swap():
34
36
  )
35
37
 
36
38
 
37
- def test_controlled_swap():
39
+ def test_controlled_swap() -> None:
38
40
  a, b, c, d = cirq.LineQubit.range(4)
39
41
  assert_url_to_circuit_returns(
40
42
  '{"cols":[["Swap","•","Swap"]]}', cirq.Circuit(cirq.SWAP(a, c).controlled_by(b))
@@ -44,7 +46,7 @@ def test_controlled_swap():
44
46
  )
45
47
 
46
48
 
47
- def test_with_line_qubits_mapped_to():
49
+ def test_with_line_qubits_mapped_to() -> None:
48
50
  a, b, c, d = cirq.LineQubit.range(4)
49
51
  a2, b2, c2, d2 = cirq.NamedQubit.range(4, prefix='q')
50
52
  cell = cirq.interop.quirk.cells.swap_cell.SwapCell(qubits=[a, b], controls=[c, d])
@@ -53,7 +55,7 @@ def test_with_line_qubits_mapped_to():
53
55
  assert cell.with_line_qubits_mapped_to([a2, b2, c2, d2]) == mapped_cell
54
56
 
55
57
 
56
- def test_repr():
58
+ def test_repr() -> None:
57
59
  a, b, c, d = cirq.LineQubit.range(4)
58
60
  cirq.testing.assert_equivalent_repr(
59
61
  cirq.interop.quirk.cells.swap_cell.SwapCell(qubits=[a, b], controls=[c, d])
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Dict, List, Optional
15
+ from __future__ import annotations
16
16
 
17
17
  import numpy as np
18
18
 
@@ -22,12 +22,12 @@ from cirq import quirk_url_to_circuit
22
22
 
23
23
  def assert_url_to_circuit_returns(
24
24
  json_text: str,
25
- circuit: Optional['cirq.Circuit'] = None,
25
+ circuit: cirq.Circuit | None = None,
26
26
  *,
27
- unitary: Optional[np.ndarray] = None,
28
- diagram: Optional[str] = None,
29
- output_amplitudes_from_quirk: Optional[List[Dict[str, float]]] = None,
30
- maps: Optional[Dict[int, int]] = None,
27
+ unitary: np.ndarray | None = None,
28
+ diagram: str | None = None,
29
+ output_amplitudes_from_quirk: list[dict[str, float]] | None = None,
30
+ maps: dict[int, int] | None = None,
31
31
  ):
32
32
  """Assert that `quirk_url_to_circuit` functions correctly.
33
33
 
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
 
@@ -19,7 +21,7 @@ import cirq
19
21
  from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
20
22
 
21
23
 
22
- def test_assert_url_to_circuit_returns_circuit():
24
+ def test_assert_url_to_circuit_returns_circuit() -> None:
23
25
  assert_url_to_circuit_returns(
24
26
  '{"cols":[["X"]]}', circuit=cirq.Circuit(cirq.X(cirq.LineQubit(0)))
25
27
  )
@@ -30,21 +32,21 @@ def test_assert_url_to_circuit_returns_circuit():
30
32
  )
31
33
 
32
34
 
33
- def test_assert_url_to_circuit_returns_unitary():
35
+ def test_assert_url_to_circuit_returns_unitary() -> None:
34
36
  assert_url_to_circuit_returns('{"cols":[["X"]]}', unitary=cirq.unitary(cirq.X))
35
37
 
36
38
  with pytest.raises(AssertionError, match='Not equal to tolerance'):
37
39
  assert_url_to_circuit_returns('{"cols":[["X"]]}', unitary=np.eye(2))
38
40
 
39
41
 
40
- def test_assert_url_to_circuit_returns_diagram():
42
+ def test_assert_url_to_circuit_returns_diagram() -> None:
41
43
  assert_url_to_circuit_returns('{"cols":[["X"]]}', diagram='0: ───X───')
42
44
 
43
45
  with pytest.raises(AssertionError, match='text diagram differs'):
44
46
  assert_url_to_circuit_returns('{"cols":[["X"]]}', diagram='not even close')
45
47
 
46
48
 
47
- def test_assert_url_to_circuit_returns_maps():
49
+ def test_assert_url_to_circuit_returns_maps() -> None:
48
50
  assert_url_to_circuit_returns('{"cols":[["X"]]}', maps={0: 1})
49
51
  assert_url_to_circuit_returns('{"cols":[["X"]]}', maps={0: 1, 1: 0})
50
52
 
@@ -55,7 +57,7 @@ def test_assert_url_to_circuit_returns_maps():
55
57
  assert_url_to_circuit_returns('{"cols":[["H"]]}', maps={0: 0})
56
58
 
57
59
 
58
- def test_assert_url_to_circuit_returns_output_amplitudes_from_quirk():
60
+ def test_assert_url_to_circuit_returns_output_amplitudes_from_quirk() -> None:
59
61
  assert_url_to_circuit_returns(
60
62
  '{"cols":[["X","Z"]]}',
61
63
  output_amplitudes_from_quirk=[
@@ -78,7 +80,7 @@ def test_assert_url_to_circuit_returns_output_amplitudes_from_quirk():
78
80
  )
79
81
 
80
82
 
81
- def test_assert_url_to_circuit_misc():
83
+ def test_assert_url_to_circuit_misc() -> None:
82
84
  a, b = cirq.LineQubit.range(2)
83
85
 
84
86
  assert_url_to_circuit_returns(
@@ -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
  from typing import Iterator
15
18
 
16
19
  from cirq.interop.quirk.cells.cell import CELL_SIZES, CellMaker
@@ -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 pytest
16
18
 
17
19
  from cirq import quirk_url_to_circuit
18
20
 
19
21
 
20
- def test_non_physical_operations():
22
+ def test_non_physical_operations() -> None:
21
23
  with pytest.raises(NotImplementedError, match="unphysical operation"):
22
24
  _ = quirk_url_to_circuit('https://algassert.com/quirk#circuit={"cols":[["__error__"]]}')
23
25
  with pytest.raises(NotImplementedError, match="unphysical operation"):
@@ -26,7 +28,7 @@ def test_non_physical_operations():
26
28
  )
27
29
 
28
30
 
29
- def test_not_implemented_gates():
31
+ def test_not_implemented_gates() -> None:
30
32
  # This test mostly exists to ensure the gates are tested if added.
31
33
 
32
34
  for k in ["X^⌈t⌉", "X^⌈t-¼⌉", "Counting4", "Uncounting4", ">>t3", "<<t3"]: