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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -1,11 +1,14 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import numpy as np
3
6
 
4
7
  import cirq
5
8
  import cirq.contrib.quimb as ccq
6
9
 
7
10
 
8
- def test_tensor_density_matrix_1():
11
+ def test_tensor_density_matrix_1() -> None:
9
12
  q = cirq.LineQubit.range(2)
10
13
  c = cirq.Circuit(cirq.YPowGate(exponent=0.25).on(q[0]))
11
14
 
@@ -14,7 +17,7 @@ def test_tensor_density_matrix_1():
14
17
  np.testing.assert_allclose(rho1, rho2, atol=1e-15)
15
18
 
16
19
 
17
- def test_tensor_density_matrix_optional_qubits():
20
+ def test_tensor_density_matrix_optional_qubits() -> None:
18
21
  q = cirq.LineQubit.range(2)
19
22
  c = cirq.Circuit(cirq.YPowGate(exponent=0.25).on(q[0]))
20
23
 
@@ -23,7 +26,7 @@ def test_tensor_density_matrix_optional_qubits():
23
26
  np.testing.assert_allclose(rho1, rho2, atol=1e-15)
24
27
 
25
28
 
26
- def test_tensor_density_matrix_noise_1():
29
+ def test_tensor_density_matrix_noise_1() -> None:
27
30
  q = cirq.LineQubit.range(2)
28
31
  c = cirq.Circuit(
29
32
  cirq.YPowGate(exponent=0.25).on(q[0]),
@@ -36,7 +39,7 @@ def test_tensor_density_matrix_noise_1():
36
39
  np.testing.assert_allclose(rho1, rho2, atol=1e-15)
37
40
 
38
41
 
39
- def test_tensor_density_matrix_2():
42
+ def test_tensor_density_matrix_2() -> None:
40
43
  q = cirq.LineQubit.range(2)
41
44
  rs = np.random.RandomState(52)
42
45
  for _ in range(10):
@@ -47,7 +50,7 @@ def test_tensor_density_matrix_2():
47
50
  np.testing.assert_allclose(rho1, rho2, atol=1e-8)
48
51
 
49
52
 
50
- def test_tensor_density_matrix_3():
53
+ def test_tensor_density_matrix_3() -> None:
51
54
  qubits = cirq.LineQubit.range(10)
52
55
  circuit = cirq.testing.random_circuit(qubits=qubits, n_moments=10, op_density=0.8)
53
56
  rho1 = cirq.final_density_matrix(circuit, dtype=np.complex128)
@@ -55,7 +58,7 @@ def test_tensor_density_matrix_3():
55
58
  np.testing.assert_allclose(rho1, rho2, atol=1e-8)
56
59
 
57
60
 
58
- def test_tensor_density_matrix_4():
61
+ def test_tensor_density_matrix_4() -> None:
59
62
  qubits = cirq.LineQubit.range(4)
60
63
  circuit = cirq.testing.random_circuit(qubits=qubits, n_moments=100, op_density=0.8)
61
64
  circuit = cirq.drop_empty_moments(circuit)
@@ -66,7 +69,7 @@ def test_tensor_density_matrix_4():
66
69
  np.testing.assert_allclose(rho1, rho2, atol=1e-8)
67
70
 
68
71
 
69
- def test_tensor_density_matrix_gridqubit():
72
+ def test_tensor_density_matrix_gridqubit() -> None:
70
73
  qubits = cirq.GridQubit.rect(2, 2)
71
74
  circuit = cirq.testing.random_circuit(qubits=qubits, n_moments=10, op_density=0.8)
72
75
  circuit = cirq.drop_empty_moments(circuit)
@@ -12,12 +12,15 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Iterator
15
+ from __future__ import annotations
16
16
 
17
- import networkx as nx
17
+ from typing import Iterator, TYPE_CHECKING
18
18
 
19
19
  import cirq
20
20
 
21
+ if TYPE_CHECKING:
22
+ import networkx as nx
23
+
21
24
 
22
25
  def get_grid_moments(
23
26
  problem_graph: nx.Graph, two_qubit_gate=cirq.ZZPowGate
@@ -1,4 +1,7 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import networkx as nx
3
6
  import numpy as np
4
7
  import pytest
@@ -21,7 +21,7 @@ from __future__ import annotations
21
21
 
22
22
  import dataclasses
23
23
  import math
24
- from typing import Any, Dict, List, Optional, Sequence, Set, Tuple, TYPE_CHECKING, Union
24
+ from typing import Any, Sequence, TYPE_CHECKING
25
25
 
26
26
  import numpy as np
27
27
  import quimb.tensor as qtn
@@ -43,7 +43,7 @@ class MPSOptions:
43
43
  # How to split the tensor. Refer to the Quimb documentation for the exact meaning.
44
44
  method: str = 'svds'
45
45
  # If integer, the maxmimum number of singular values to keep, regardless of ``cutoff``.
46
- max_bond: Optional[int] = None
46
+ max_bond: int | None = None
47
47
  # Method with which to apply the cutoff threshold. Refer to the Quimb documentation.
48
48
  cutoff_mode: str = 'rsum2'
49
49
  # The threshold below which to discard singular values. Refer to the Quimb documentation.
@@ -63,7 +63,7 @@ class MPSSimulator(
63
63
  noise: cirq.NOISE_MODEL_LIKE = None,
64
64
  seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
65
65
  simulation_options: MPSOptions = MPSOptions(),
66
- grouping: Optional[Dict[cirq.Qid, int]] = None,
66
+ grouping: dict[cirq.Qid, int] | None = None,
67
67
  ):
68
68
  """Creates instance of `MPSSimulator`.
69
69
 
@@ -86,7 +86,7 @@ class MPSSimulator(
86
86
 
87
87
  def _create_partial_simulation_state(
88
88
  self,
89
- initial_state: Union[int, MPSState],
89
+ initial_state: int | MPSState,
90
90
  qubits: Sequence[cirq.Qid],
91
91
  classical_data: cirq.ClassicalDataStore,
92
92
  ) -> MPSState:
@@ -122,7 +122,7 @@ class MPSSimulator(
122
122
  def _create_simulator_trial_result(
123
123
  self,
124
124
  params: cirq.ParamResolver,
125
- measurements: Dict[str, np.ndarray],
125
+ measurements: dict[str, np.ndarray],
126
126
  final_simulator_state: cirq.SimulationStateBase[MPSState],
127
127
  ) -> MPSTrialResult:
128
128
  """Creates a single trial results with the measurements.
@@ -147,7 +147,7 @@ class MPSTrialResult(simulator_base.SimulationTrialResultBase['MPSState']):
147
147
  def __init__(
148
148
  self,
149
149
  params: cirq.ParamResolver,
150
- measurements: Dict[str, np.ndarray],
150
+ measurements: dict[str, np.ndarray],
151
151
  final_simulator_state: cirq.SimulationStateBase[MPSState],
152
152
  ) -> None:
153
153
  super().__init__(
@@ -212,11 +212,11 @@ class _MPSHandler(qis.QuantumStateRepresentation):
212
212
 
213
213
  def __init__(
214
214
  self,
215
- qid_shape: Tuple[int, ...],
216
- grouping: Dict[int, int],
217
- M: List[qtn.Tensor],
215
+ qid_shape: tuple[int, ...],
216
+ grouping: dict[int, int],
217
+ M: list[qtn.Tensor],
218
218
  format_i: str,
219
- estimated_gate_error_list: List[float],
219
+ estimated_gate_error_list: list[float],
220
220
  simulation_options: MPSOptions = MPSOptions(),
221
221
  ):
222
222
  """Creates an MPSQuantumState
@@ -241,8 +241,8 @@ class _MPSHandler(qis.QuantumStateRepresentation):
241
241
  def create(
242
242
  cls,
243
243
  *,
244
- qid_shape: Tuple[int, ...],
245
- grouping: Dict[int, int],
244
+ qid_shape: tuple[int, ...],
245
+ grouping: dict[int, int],
246
246
  initial_state: int = 0,
247
247
  simulation_options: MPSOptions = MPSOptions(),
248
248
  ):
@@ -342,7 +342,7 @@ class _MPSHandler(qis.QuantumStateRepresentation):
342
342
  sorted_ind = tuple(sorted(state_vector.inds))
343
343
  return state_vector.fuse({'i': sorted_ind}).data
344
344
 
345
- def partial_trace(self, keep_axes: Set[int]) -> np.ndarray:
345
+ def partial_trace(self, keep_axes: set[int]) -> np.ndarray:
346
346
  """Traces out all qubits except keep_axes.
347
347
 
348
348
  Args:
@@ -484,8 +484,8 @@ class _MPSHandler(qis.QuantumStateRepresentation):
484
484
 
485
485
  def _measure(
486
486
  self, axes: Sequence[int], prng: np.random.RandomState, collapse_state_vector=True
487
- ) -> List[int]:
488
- results: List[int] = []
487
+ ) -> list[int]:
488
+ results: list[int] = []
489
489
 
490
490
  if collapse_state_vector:
491
491
  state = self
@@ -523,7 +523,7 @@ class _MPSHandler(qis.QuantumStateRepresentation):
523
523
 
524
524
  def measure(
525
525
  self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
526
- ) -> List[int]:
526
+ ) -> list[int]:
527
527
  """Measures the MPS.
528
528
 
529
529
  Args:
@@ -547,7 +547,7 @@ class _MPSHandler(qis.QuantumStateRepresentation):
547
547
  The samples in order.
548
548
  """
549
549
 
550
- measurements: List[List[int]] = []
550
+ measurements: list[list[int]] = []
551
551
  prng = value.parse_random_state(seed)
552
552
 
553
553
  for _ in range(repetitions):
@@ -566,9 +566,9 @@ class MPSState(SimulationState[_MPSHandler]):
566
566
  qubits: Sequence[cirq.Qid],
567
567
  prng: np.random.RandomState,
568
568
  simulation_options: MPSOptions = MPSOptions(),
569
- grouping: Optional[Dict[cirq.Qid, int]] = None,
569
+ grouping: dict[cirq.Qid, int] | None = None,
570
570
  initial_state: int = 0,
571
- classical_data: Optional[cirq.ClassicalDataStore] = None,
571
+ classical_data: cirq.ClassicalDataStore | None = None,
572
572
  ):
573
573
  """Creates and MPSState
574
574
 
@@ -622,7 +622,7 @@ class MPSState(SimulationState[_MPSHandler]):
622
622
  """
623
623
  return self._state.state_vector()
624
624
 
625
- def partial_trace(self, keep_qubits: Set[cirq.Qid]) -> np.ndarray:
625
+ def partial_trace(self, keep_qubits: set[cirq.Qid]) -> np.ndarray:
626
626
  """Traces out all qubits except keep_qubits.
627
627
 
628
628
  Args:
@@ -1,4 +1,7 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import itertools
3
6
  import math
4
7
 
@@ -1,13 +1,18 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import warnings
3
- from typing import cast, Dict, List, Optional, Sequence, Tuple, Union
6
+ from typing import cast, Sequence, TYPE_CHECKING
4
7
 
5
- import numpy as np
6
8
  import quimb
7
9
  import quimb.tensor as qtn
8
10
 
9
11
  import cirq
10
12
 
13
+ if TYPE_CHECKING:
14
+ import numpy as np
15
+
11
16
 
12
17
  def _get_quimb_version():
13
18
  """Returns the quimb version and parsed (major,minor) numbers if possible.
@@ -25,10 +30,8 @@ QUIMB_VERSION = _get_quimb_version()
25
30
 
26
31
 
27
32
  def circuit_to_tensors(
28
- circuit: cirq.Circuit,
29
- qubits: Optional[Sequence[cirq.Qid]] = None,
30
- initial_state: Union[int, None] = 0,
31
- ) -> Tuple[List[qtn.Tensor], Dict['cirq.Qid', int], None]:
33
+ circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None, initial_state: int | None = 0
34
+ ) -> tuple[list[qtn.Tensor], dict[cirq.Qid, int], None]:
32
35
  """Given a circuit, construct a tensor network representation.
33
36
 
34
37
  Indices are named "i{i}_q{x}" where i is a time index and x is a
@@ -62,7 +65,7 @@ def circuit_to_tensors(
62
65
 
63
66
  qubit_frontier = {q: 0 for q in qubits}
64
67
  positions = None
65
- tensors: List[qtn.Tensor] = []
68
+ tensors: list[qtn.Tensor] = []
66
69
 
67
70
  if initial_state == 0:
68
71
  for q in qubits:
@@ -89,7 +92,7 @@ def circuit_to_tensors(
89
92
 
90
93
 
91
94
  def tensor_state_vector(
92
- circuit: cirq.Circuit, qubits: Optional[Sequence[cirq.Qid]] = None
95
+ circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None
93
96
  ) -> np.ndarray:
94
97
  """Given a circuit contract a tensor network into a final state vector."""
95
98
  if qubits is None:
@@ -102,9 +105,7 @@ def tensor_state_vector(
102
105
  return tn.to_dense(f_inds)
103
106
 
104
107
 
105
- def tensor_unitary(
106
- circuit: cirq.Circuit, qubits: Optional[Sequence[cirq.Qid]] = None
107
- ) -> np.ndarray:
108
+ def tensor_unitary(circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None) -> np.ndarray:
108
109
  """Given a circuit contract a tensor network into a dense unitary
109
110
  of the circuit."""
110
111
  if qubits is None:
@@ -1,4 +1,7 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import functools
3
6
  import operator
4
7
 
@@ -12,9 +12,11 @@
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 json
16
18
  import urllib.parse
17
- from typing import Any, cast, Iterable, List, Tuple
19
+ from typing import Any, cast, Iterable
18
20
 
19
21
  from cirq import circuits, devices, ops, protocols
20
22
  from cirq.contrib.quirk.linearize_circuit import linearize_circuit_qubits
@@ -40,7 +42,7 @@ def _try_convert_to_quirk_gate(op: ops.Operation, prefer_unknown_gate_to_failure
40
42
 
41
43
  def _to_quirk_cols(
42
44
  op: ops.Operation, prefer_unknown_gate_to_failure: bool
43
- ) -> Iterable[Tuple[List[Any], bool]]:
45
+ ) -> Iterable[tuple[list[Any], bool]]:
44
46
  gate = _try_convert_to_quirk_gate(op, prefer_unknown_gate_to_failure)
45
47
  qubits = cast(Iterable[devices.LineQubit], op.qubits)
46
48
 
@@ -76,7 +78,7 @@ def circuit_to_quirk_url(
76
78
  circuit = circuit.copy()
77
79
  linearize_circuit_qubits(circuit)
78
80
 
79
- cols: List[List[Any]] = []
81
+ cols: list[list[Any]] = []
80
82
  for moment in circuit:
81
83
  can_merges = []
82
84
  for op in moment.operations:
@@ -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
  import sympy
17
19
 
@@ -19,7 +21,7 @@ import cirq
19
21
  from cirq.contrib.quirk.export_to_quirk import circuit_to_quirk_url
20
22
 
21
23
 
22
- def assert_links_to(circuit: cirq.Circuit, expected: str, **kwargs):
24
+ def assert_links_to(circuit: cirq.Circuit, expected: str, **kwargs) -> None:
23
25
  actual = circuit_to_quirk_url(circuit, **kwargs)
24
26
  actual = actual.replace('\n', '').replace(' ', '').strip()
25
27
  expected = expected.replace('],[', '],\n[').strip()
@@ -27,7 +29,7 @@ def assert_links_to(circuit: cirq.Circuit, expected: str, **kwargs):
27
29
  assert actual == expected
28
30
 
29
31
 
30
- def test_x_z_same_col():
32
+ def test_x_z_same_col() -> None:
31
33
  a = cirq.NamedQubit('a')
32
34
  b = cirq.NamedQubit('b')
33
35
  circuit = cirq.Circuit(cirq.X(a), cirq.Z(b))
@@ -44,7 +46,7 @@ def test_x_z_same_col():
44
46
  )
45
47
 
46
48
 
47
- def test_x_cnot_split_cols():
49
+ def test_x_cnot_split_cols() -> None:
48
50
  a = cirq.NamedQubit('a')
49
51
  b = cirq.NamedQubit('b')
50
52
  c = cirq.NamedQubit('c')
@@ -58,7 +60,7 @@ def test_x_cnot_split_cols():
58
60
  )
59
61
 
60
62
 
61
- def test_cz_cnot_split_cols():
63
+ def test_cz_cnot_split_cols() -> None:
62
64
  a = cirq.NamedQubit('a')
63
65
  b = cirq.NamedQubit('b')
64
66
  c = cirq.NamedQubit('c')
@@ -72,7 +74,7 @@ def test_cz_cnot_split_cols():
72
74
  )
73
75
 
74
76
 
75
- def test_various_known_gate_types():
77
+ def test_various_known_gate_types() -> None:
76
78
  a = cirq.NamedQubit('a')
77
79
  b = cirq.NamedQubit('b')
78
80
  circuit = cirq.Circuit(
@@ -116,7 +118,7 @@ def test_various_known_gate_types():
116
118
  )
117
119
 
118
120
 
119
- def test_parameterized_gates():
121
+ def test_parameterized_gates() -> None:
120
122
  a = cirq.LineQubit(0)
121
123
  s = sympy.Symbol('s')
122
124
  t = sympy.Symbol('t')
@@ -182,7 +184,7 @@ class MysteryGate(cirq.testing.SingleQubitGate):
182
184
  return True
183
185
 
184
186
 
185
- def test_various_unknown_gate_types():
187
+ def test_various_unknown_gate_types() -> None:
186
188
  a = cirq.NamedQubit('a')
187
189
  b = cirq.NamedQubit('b')
188
190
  circuit = cirq.Circuit(
@@ -225,7 +227,7 @@ def test_various_unknown_gate_types():
225
227
  )
226
228
 
227
229
 
228
- def test_formulaic_exponent_export():
230
+ def test_formulaic_exponent_export() -> None:
229
231
  a = cirq.LineQubit(0)
230
232
  t = sympy.Symbol('t')
231
233
  assert_links_to(
@@ -241,7 +243,7 @@ def test_formulaic_exponent_export():
241
243
  )
242
244
 
243
245
 
244
- def test_formulaic_rotation_xyz_export():
246
+ def test_formulaic_rotation_xyz_export() -> None:
245
247
  a = cirq.LineQubit(0)
246
248
  t = sympy.Symbol('t')
247
249
  assert_links_to(
@@ -262,9 +264,9 @@ def test_formulaic_rotation_xyz_export():
262
264
  _ = circuit_to_quirk_url(cirq.Circuit(cirq.rx(sympy.FallingFactorial(t, t)).on(a)))
263
265
 
264
266
 
265
- def test_unrecognized_single_qubit_gate_with_matrix():
267
+ def test_unrecognized_single_qubit_gate_with_matrix() -> None:
266
268
  a = cirq.NamedQubit('a')
267
- circuit = cirq.Circuit(cirq.PhasedXPowGate(phase_exponent=0).on(a) ** 0.2731)
269
+ circuit = cirq.Circuit(cirq.PhasedXPowGate(exponent=0.2731, phase_exponent=0).on(a))
268
270
  assert_links_to(
269
271
  circuit,
270
272
  """
@@ -279,7 +281,7 @@ def test_unrecognized_single_qubit_gate_with_matrix():
279
281
  )
280
282
 
281
283
 
282
- def test_unknown_gate():
284
+ def test_unknown_gate() -> None:
283
285
  class UnknownGate(cirq.testing.SingleQubitGate):
284
286
  pass
285
287
 
@@ -299,7 +301,7 @@ def test_unknown_gate():
299
301
  )
300
302
 
301
303
 
302
- def test_controlled_gate():
304
+ def test_controlled_gate() -> None:
303
305
  a, b, c, d = cirq.LineQubit.range(4)
304
306
  circuit = cirq.Circuit(cirq.ControlledGate(cirq.ControlledGate(cirq.CZ)).on(a, d, c, b))
305
307
  assert_links_to(
@@ -334,7 +336,7 @@ def test_controlled_gate():
334
336
  )
335
337
 
336
338
 
337
- def test_toffoli():
339
+ def test_toffoli() -> None:
338
340
  a, b, c, d = cirq.LineQubit.range(4)
339
341
 
340
342
  # Raw.
@@ -372,7 +374,7 @@ def test_toffoli():
372
374
  )
373
375
 
374
376
 
375
- def test_fredkin():
377
+ def test_fredkin() -> None:
376
378
  a, b, c = cirq.LineQubit.range(3)
377
379
  circuit = cirq.Circuit(cirq.FREDKIN(a, b, c))
378
380
  assert_links_to(
@@ -398,7 +400,7 @@ def test_fredkin():
398
400
  )
399
401
 
400
402
 
401
- def test_ccz():
403
+ def test_ccz() -> None:
402
404
  a, b, c, d = cirq.LineQubit.range(4)
403
405
 
404
406
  # Raw.
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from typing import Callable
16
18
 
17
19
  from cirq import circuits, devices, ops
@@ -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, Callable, cast, Dict, Optional, Union
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Callable, cast
16
18
 
17
19
  import numpy as np
18
20
  import sympy
@@ -46,7 +48,7 @@ class QuirkOp:
46
48
  self.keys = keys
47
49
  self.can_merge = can_merge
48
50
 
49
- def controlled(self, control_count: int = 1) -> 'QuirkOp':
51
+ def controlled(self, control_count: int = 1) -> QuirkOp:
50
52
  return QuirkOp(*['•'] * control_count, *self.keys, can_merge=False)
51
53
 
52
54
 
@@ -68,7 +70,7 @@ def _is_supported_formula(formula: sympy.Basic) -> bool:
68
70
  return False
69
71
 
70
72
 
71
- def _val_to_quirk_formula(t: Union[float, sympy.Basic]) -> str:
73
+ def _val_to_quirk_formula(t: float | sympy.Basic) -> str:
72
74
  if isinstance(t, sympy.Basic):
73
75
  if not set(t.free_symbols) <= {sympy.Symbol('t')}:
74
76
  raise ValueError(f'Symbol other than "t": {t!r}.')
@@ -79,7 +81,7 @@ def _val_to_quirk_formula(t: Union[float, sympy.Basic]) -> str:
79
81
  return f'{float(t):.4f}'
80
82
 
81
83
 
82
- def angle_to_exponent_key(t: Union[float, sympy.Basic]) -> Optional[str]:
84
+ def angle_to_exponent_key(t: float | sympy.Basic) -> str | None:
83
85
  if isinstance(t, sympy.Basic):
84
86
  if t == sympy.Symbol('t'):
85
87
  return '^t'
@@ -107,11 +109,10 @@ def angle_to_exponent_key(t: Union[float, sympy.Basic]) -> Optional[str]:
107
109
  return None
108
110
 
109
111
 
110
- def single_qubit_matrix_gate(matrix: Optional[np.ndarray]) -> Optional[QuirkOp]:
112
+ def single_qubit_matrix_gate(matrix: np.ndarray | None) -> QuirkOp | None:
111
113
  if matrix is None or matrix.shape[0] != 2:
112
114
  return None
113
115
 
114
- # pylint: disable=consider-using-f-string
115
116
  matrix = matrix.round(6)
116
117
  matrix_repr = '{{%s+%si,%s+%si},{%s+%si,%s+%si}}' % (
117
118
  np.real(matrix[0, 0]),
@@ -135,7 +136,7 @@ def single_qubit_matrix_gate(matrix: Optional[np.ndarray]) -> Optional[QuirkOp]:
135
136
  return QuirkOp({'id': '?', 'matrix': matrix_repr})
136
137
 
137
138
 
138
- def known_quirk_op_for_operation(op: ops.Operation) -> Optional[QuirkOp]:
139
+ def known_quirk_op_for_operation(op: ops.Operation) -> QuirkOp | None:
139
140
  if isinstance(op, ops.GateOperation):
140
141
  return _gate_to_quirk_op(op.gate)
141
142
  if isinstance(op, ops.ControlledOperation):
@@ -143,7 +144,7 @@ def known_quirk_op_for_operation(op: ops.Operation) -> Optional[QuirkOp]:
143
144
  return None
144
145
 
145
146
 
146
- def _gate_to_quirk_op(gate: ops.Gate) -> Optional[QuirkOp]:
147
+ def _gate_to_quirk_op(gate: ops.Gate) -> QuirkOp | None:
147
148
  for gate_type, func in _known_gate_conversions.items():
148
149
  if isinstance(gate, gate_type):
149
150
  return func(gate)
@@ -176,45 +177,45 @@ def z_to_quirk_op(gate: ops.ZPowGate) -> QuirkOp:
176
177
  return xyz_to_quirk_op('z', gate)
177
178
 
178
179
 
179
- def cz_to_quirk_op(gate: ops.CZPowGate) -> Optional[QuirkOp]:
180
+ def cz_to_quirk_op(gate: ops.CZPowGate) -> QuirkOp | None:
180
181
  return z_to_quirk_op(ops.Z**gate.exponent).controlled()
181
182
 
182
183
 
183
- def cnot_to_quirk_op(gate: ops.CXPowGate) -> Optional[QuirkOp]:
184
+ def cnot_to_quirk_op(gate: ops.CXPowGate) -> QuirkOp | None:
184
185
  return x_to_quirk_op(ops.X**gate.exponent).controlled()
185
186
 
186
187
 
187
- def h_to_quirk_op(gate: ops.HPowGate) -> Optional[QuirkOp]:
188
+ def h_to_quirk_op(gate: ops.HPowGate) -> QuirkOp | None:
188
189
  if gate.exponent == 1:
189
190
  return QuirkOp('H')
190
191
  return None
191
192
 
192
193
 
193
- def swap_to_quirk_op(gate: ops.SwapPowGate) -> Optional[QuirkOp]:
194
+ def swap_to_quirk_op(gate: ops.SwapPowGate) -> QuirkOp | None:
194
195
  if gate.exponent == 1:
195
196
  return QuirkOp('Swap', 'Swap', can_merge=False)
196
197
  return None
197
198
 
198
199
 
199
- def cswap_to_quirk_op(gate: ops.CSwapGate) -> Optional[QuirkOp]:
200
+ def cswap_to_quirk_op(gate: ops.CSwapGate) -> QuirkOp | None:
200
201
  return QuirkOp('•', 'Swap', 'Swap', can_merge=False)
201
202
 
202
203
 
203
- def ccx_to_quirk_op(gate: ops.CCXPowGate) -> Optional[QuirkOp]:
204
+ def ccx_to_quirk_op(gate: ops.CCXPowGate) -> QuirkOp | None:
204
205
  e = angle_to_exponent_key(gate.exponent)
205
206
  if e is None:
206
207
  return None
207
208
  return QuirkOp('•', '•', 'X' + e, can_merge=False)
208
209
 
209
210
 
210
- def ccz_to_quirk_op(gate: ops.CCZPowGate) -> Optional[QuirkOp]:
211
+ def ccz_to_quirk_op(gate: ops.CCZPowGate) -> QuirkOp | None:
211
212
  e = angle_to_exponent_key(gate.exponent)
212
213
  if e is None:
213
214
  return None
214
215
  return QuirkOp('•', '•', 'Z' + e, can_merge=False)
215
216
 
216
217
 
217
- def controlled_unwrap(op: ops.ControlledOperation) -> Optional[QuirkOp]:
218
+ def controlled_unwrap(op: ops.ControlledOperation) -> QuirkOp | None:
218
219
  sub = known_quirk_op_for_operation(op.sub_operation)
219
220
  if sub is None:
220
221
  return None
@@ -222,7 +223,7 @@ def controlled_unwrap(op: ops.ControlledOperation) -> Optional[QuirkOp]:
222
223
 
223
224
 
224
225
  _known_gate_conversions = cast(
225
- Dict[type, Callable[[ops.Gate], Optional[QuirkOp]]],
226
+ dict[type, Callable[[ops.Gate], QuirkOp | None]],
226
227
  {
227
228
  ops.CCXPowGate: ccx_to_quirk_op,
228
229
  ops.CCZPowGate: ccz_to_quirk_op,
@@ -12,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import itertools
16
- from typing import Dict, Iterable, Tuple
18
+ from typing import Iterable
17
19
 
18
20
  import networkx as nx
19
21
 
@@ -45,7 +47,7 @@ def _manhattan_distance(qubit1: cirq.GridQubit, qubit2: cirq.GridQubit) -> int:
45
47
  return abs(qubit1.row - qubit2.row) + abs(qubit1.col - qubit2.col)
46
48
 
47
49
 
48
- def nx_qubit_layout(graph: nx.Graph) -> Dict[cirq.Qid, Tuple[float, float]]:
50
+ def nx_qubit_layout(graph: nx.Graph) -> dict[cirq.Qid, tuple[float, float]]:
49
51
  """Return a layout for a graph for nodes which are qubits.
50
52
 
51
53
  This can be used in place of nx.spring_layout or other networkx layouts.
@@ -62,7 +64,7 @@ def nx_qubit_layout(graph: nx.Graph) -> Dict[cirq.Qid, Tuple[float, float]]:
62
64
  >>> nx.draw_networkx(g, pos=pos)
63
65
 
64
66
  """
65
- pos: Dict[cirq.Qid, Tuple[float, float]] = {}
67
+ pos: dict[cirq.Qid, tuple[float, float]] = {}
66
68
 
67
69
  _node_to_i_cache = None
68
70
  for node in graph.nodes:
@@ -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 networkx as nx
16
18
  import pytest
17
19