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,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
 
16
18
  class QasmException(Exception):
17
19
  def __init__(self, message: str) -> None:
@@ -12,11 +12,17 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from cirq import circuits
15
+ from __future__ import annotations
16
+
17
+ from typing import TYPE_CHECKING
18
+
16
19
  from cirq.contrib.qasm_import._parser import QasmParser
17
20
 
21
+ if TYPE_CHECKING:
22
+ import cirq
23
+
18
24
 
19
- def circuit_from_qasm(qasm: str) -> circuits.Circuit:
25
+ def circuit_from_qasm(qasm: str) -> cirq.Circuit:
20
26
  """Parses an OpenQASM string to `cirq.Circuit`.
21
27
 
22
28
  Args:
@@ -11,6 +11,9 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import numpy as np
15
18
 
16
19
  import cirq
@@ -19,7 +22,7 @@ from cirq.contrib.qasm_import import circuit_from_qasm
19
22
  from cirq.testing import consistent_qasm as cq
20
23
 
21
24
 
22
- def test_consistency_with_qasm_output_and_qiskit():
25
+ def test_consistency_with_qasm_output_and_qiskit() -> None:
23
26
  qubits = [cirq.NamedQubit(f'q_{i}') for i in range(4)]
24
27
  a, b, c, d = qubits
25
28
  circuit1 = cirq.Circuit(
@@ -32,9 +35,9 @@ def test_consistency_with_qasm_output_and_qiskit():
32
35
  cirq.H.on(d),
33
36
  cirq.S.on(a),
34
37
  cirq.T.on(b),
35
- cirq.S.on(c) ** -1,
36
- cirq.T.on(d) ** -1,
37
- cirq.X.on(d) ** 0.125,
38
+ (cirq.S**-1).on(c),
39
+ (cirq.T**-1).on(d),
40
+ (cirq.X**0.125).on(d),
38
41
  cirq.TOFFOLI.on(a, b, c),
39
42
  cirq.CSWAP.on(d, a, b),
40
43
  cirq.SWAP.on(c, d),
@@ -12,12 +12,12 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Optional, Tuple
15
+ from __future__ import annotations
16
16
 
17
17
  from cirq import ops, protocols
18
18
 
19
19
 
20
- def escape_text_for_latex(text):
20
+ def escape_text_for_latex(text: str) -> str:
21
21
  escaped = (
22
22
  text.replace('\\', r'\textbackslash{}')
23
23
  .replace('{', r'\{')
@@ -33,7 +33,7 @@ def escape_text_for_latex(text):
33
33
  return r'\text{' + escaped + '}'
34
34
 
35
35
 
36
- def get_multigate_parameters(args: protocols.CircuitDiagramInfoArgs) -> Optional[Tuple[int, int]]:
36
+ def get_multigate_parameters(args: protocols.CircuitDiagramInfoArgs) -> tuple[int, int] | None:
37
37
  if (args.label_map is None) or (args.known_qubits is None):
38
38
  return None
39
39
 
@@ -45,7 +45,7 @@ def get_multigate_parameters(args: protocols.CircuitDiagramInfoArgs) -> Optional
45
45
  return min_index, n_qubits
46
46
 
47
47
 
48
- def hardcoded_qcircuit_diagram_info(op: ops.Operation) -> Optional[protocols.CircuitDiagramInfo]:
48
+ def hardcoded_qcircuit_diagram_info(op: ops.Operation) -> protocols.CircuitDiagramInfo | None:
49
49
  if not isinstance(op, ops.GateOperation):
50
50
  return None
51
51
  symbols = (
@@ -76,7 +76,7 @@ def convert_text_diagram_info_to_qcircuit_diagram_info(
76
76
 
77
77
  def multigate_qcircuit_diagram_info(
78
78
  op: ops.Operation, args: protocols.CircuitDiagramInfoArgs
79
- ) -> Optional[protocols.CircuitDiagramInfo]:
79
+ ) -> protocols.CircuitDiagramInfo | None:
80
80
  if not (
81
81
  isinstance(op, ops.GateOperation) and isinstance(op.gate, ops.InterchangeableQubitsGate)
82
82
  ):
@@ -12,11 +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
  import cirq.contrib.qcircuit as ccq
17
19
 
18
20
 
19
- def test_get_qcircuit_diagram_info():
21
+ def test_get_qcircuit_diagram_info() -> None:
22
+ qubit_map: dict[cirq.LabelEntity, int]
20
23
  qubits = cirq.NamedQubit('x'), cirq.NamedQubit('y')
21
24
 
22
25
  gate = cirq.SwapPowGate(exponent=0.5)
@@ -12,24 +12,28 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
15
16
 
16
17
  import errno
17
18
  import os
19
+ from typing import TYPE_CHECKING
18
20
 
19
21
  from pylatex import Document, NoEscape, Package
20
22
 
21
- from cirq import circuits
22
23
  from cirq.contrib.qcircuit.qcircuit_diagram import circuit_to_latex_using_qcircuit
23
24
 
25
+ if TYPE_CHECKING:
26
+ import cirq
27
+
24
28
 
25
29
  def circuit_to_pdf_using_qcircuit_via_tex(
26
- circuit: circuits.Circuit,
30
+ circuit: cirq.Circuit,
27
31
  filepath: str,
28
32
  pdf_kwargs=None,
29
33
  qcircuit_kwargs=None,
30
34
  clean_ext=('dvi', 'ps'),
31
35
  documentclass='article',
32
- ):
36
+ ) -> None:
33
37
  """Compiles the QCircuit-based latex diagram of the given circuit.
34
38
 
35
39
  Args:
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from unittest import mock
16
18
 
17
19
  import pylatex
@@ -21,7 +23,7 @@ import cirq.contrib.qcircuit.qcircuit_pdf as qcircuit_pdf
21
23
 
22
24
 
23
25
  @mock.patch.object(pylatex.Document, "generate_pdf")
24
- def test_qcircuit_pdf(mock_generate_pdf):
26
+ def test_qcircuit_pdf(mock_generate_pdf) -> None:
25
27
  circuit = cirq.Circuit(cirq.X(cirq.q(0)), cirq.CZ(cirq.q(0), cirq.q(1)))
26
28
  qcircuit_pdf.circuit_to_pdf_using_qcircuit_via_tex(circuit, "/tmp/test_file")
27
29
  mock_generate_pdf.assert_called_once_with(
@@ -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 cirq
16
18
  import cirq.contrib.qcircuit as ccq
17
19
  import cirq.testing as ct
@@ -43,7 +45,7 @@ def assert_has_qcircuit_diagram(actual: cirq.Circuit, desired: str, **kwargs) ->
43
45
  )
44
46
 
45
47
 
46
- def test_fallback_diagram():
48
+ def test_fallback_diagram() -> None:
47
49
  class MagicGate(cirq.testing.ThreeQubitGate):
48
50
  def __str__(self):
49
51
  return 'MagicGate'
@@ -77,7 +79,7 @@ def test_fallback_diagram():
77
79
  assert_has_qcircuit_diagram(circuit, expected_diagram)
78
80
 
79
81
 
80
- def test_teleportation_diagram():
82
+ def test_teleportation_diagram() -> None:
81
83
  ali = cirq.NamedQubit('alice')
82
84
  car = cirq.NamedQubit('carrier')
83
85
  bob = cirq.NamedQubit('bob')
@@ -100,13 +102,13 @@ def test_teleportation_diagram():
100
102
  &\lstick{\text{carrier}}& \qw&\gate{\text{H}} \qw&\control \qw &\targ \qw\qwx&\meter \qw&\control \qw & \qw\qwx&\qw\\
101
103
  &\lstick{\text{bob}}& \qw& \qw&\targ \qw\qwx& \qw & \qw&\targ \qw\qwx&\control \qw\qwx&\qw\\
102
104
  \\
103
- }""".strip()
105
+ }""".strip() # noqa: E501
104
106
  assert_has_qcircuit_diagram(
105
107
  circuit, expected_diagram, qubit_order=cirq.QubitOrder.explicit([ali, car, bob])
106
108
  )
107
109
 
108
110
 
109
- def test_other_diagram():
111
+ def test_other_diagram() -> None:
110
112
  a, b, c = cirq.LineQubit.range(3)
111
113
 
112
114
  circuit = cirq.Circuit(cirq.X(a), cirq.Y(b), cirq.Z(c))
@@ -122,7 +124,7 @@ def test_other_diagram():
122
124
  assert_has_qcircuit_diagram(circuit, expected_diagram)
123
125
 
124
126
 
125
- def test_qcircuit_qubit_namer():
127
+ def test_qcircuit_qubit_namer() -> None:
126
128
  from cirq.contrib.qcircuit import qcircuit_diagram
127
129
 
128
130
  assert qcircuit_diagram.qcircuit_qubit_namer(cirq.NamedQubit('q')) == r'\lstick{\text{q}}&'
@@ -137,7 +139,7 @@ def test_qcircuit_qubit_namer():
137
139
  )
138
140
 
139
141
 
140
- def test_two_cx_diagram():
142
+ def test_two_cx_diagram() -> None:
141
143
  # test for no moment indication
142
144
  q0, q1, q2, q3 = cirq.LineQubit.range(4)
143
145
  circuit = cirq.Circuit(cirq.CX(q0, q2), cirq.CX(q1, q3), cirq.CX(q0, q2), cirq.CX(q1, q3))
@@ -149,11 +151,11 @@ def test_two_cx_diagram():
149
151
  &\lstick{\text{q(2)}}& \qw&\targ \qw\qwx& \qw\qwx&\targ \qw\qwx& \qw\qwx&\qw\\
150
152
  &\lstick{\text{q(3)}}& \qw& \qw &\targ \qw\qwx& \qw &\targ \qw\qwx&\qw\\
151
153
  \\
152
- }""".strip()
154
+ }""".strip() # noqa: E501
153
155
  assert_has_qcircuit_diagram(circuit, expected_diagram)
154
156
 
155
157
 
156
- def test_sqrt_iswap_diagram():
158
+ def test_sqrt_iswap_diagram() -> None:
157
159
  # test for proper rendering of ISWAP^{0.5}
158
160
  q0, q1 = cirq.LineQubit.range(2)
159
161
  circuit = cirq.Circuit(cirq.ISWAP(q0, q1) ** 0.5)
@@ -3,16 +3,20 @@
3
3
  https://arxiv.org/abs/1811.12926.
4
4
  """
5
5
 
6
+ from __future__ import annotations
7
+
6
8
  from dataclasses import dataclass
7
- from typing import Callable, Dict, List, Optional, Set, Tuple
9
+ from typing import Callable, TYPE_CHECKING
8
10
 
9
- import networkx as nx
10
11
  import numpy as np
11
- import pandas as pd
12
12
 
13
13
  import cirq
14
14
  import cirq.contrib.routing as ccr
15
15
 
16
+ if TYPE_CHECKING:
17
+ import networkx as nx
18
+ import pandas as pd
19
+
16
20
 
17
21
  def generate_model_circuit(
18
22
  num_qubits: int, depth: int, *, random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None
@@ -60,7 +64,7 @@ def generate_model_circuit(
60
64
  return circuit
61
65
 
62
66
 
63
- def compute_heavy_set(circuit: cirq.Circuit) -> List[int]:
67
+ def compute_heavy_set(circuit: cirq.Circuit) -> list[int]:
64
68
  """Classically compute the heavy set of the given circuit.
65
69
 
66
70
  The heavy set is defined as the output bit-strings that have a greater than
@@ -92,13 +96,13 @@ def compute_heavy_set(circuit: cirq.Circuit) -> List[int]:
92
96
  @dataclass
93
97
  class CompilationResult:
94
98
  circuit: cirq.Circuit
95
- mapping: Dict[cirq.Qid, cirq.Qid]
96
- parity_map: Dict[cirq.Qid, cirq.Qid]
99
+ mapping: dict[cirq.Qid, cirq.Qid]
100
+ parity_map: dict[cirq.Qid, cirq.Qid]
97
101
 
98
102
 
99
103
  def sample_heavy_set(
100
104
  compilation_result: CompilationResult,
101
- heavy_set: List[int],
105
+ heavy_set: list[int],
102
106
  *,
103
107
  repetitions=10_000,
104
108
  sampler: cirq.Sampler = cirq.Simulator(),
@@ -123,7 +127,7 @@ def sample_heavy_set(
123
127
  # Add measure gates to the end of (a copy of) the circuit. Ensure that those
124
128
  # gates measure those in the given mapping, preserving this order.
125
129
  qubits = circuit.all_qubits()
126
- key = None
130
+ key: Callable[[cirq.Qid], cirq.Qid] | None = None
127
131
  if mapping:
128
132
  # Add any qubits that were not explicitly mapped, so they aren't lost in
129
133
  # the sorting.
@@ -154,8 +158,8 @@ def sample_heavy_set(
154
158
 
155
159
 
156
160
  def process_results(
157
- mapping: Dict[cirq.Qid, cirq.Qid],
158
- parity_mapping: Dict[cirq.Qid, cirq.Qid],
161
+ mapping: dict[cirq.Qid, cirq.Qid],
162
+ parity_mapping: dict[cirq.Qid, cirq.Qid],
159
163
  trial_result: cirq.Result,
160
164
  ) -> pd.DataFrame:
161
165
  """Checks the given results for parity and throws away all of the runs that
@@ -172,11 +176,11 @@ def process_results(
172
176
 
173
177
  """
174
178
  # The circuit's mapping from physical qubit to logical qubit.
175
- inverse_mapping: Dict[cirq.Qid, cirq.Qid] = {v: k for k, v in mapping.items()}
179
+ inverse_mapping: dict[cirq.Qid, cirq.Qid] = {v: k for k, v in mapping.items()}
176
180
 
177
181
  # Calculate all the invalid parity pairs.
178
182
  data = trial_result.data
179
- bad_measurements: Set[int] = set()
183
+ bad_measurements: set[int] = set()
180
184
  for final_qubit, original_qubit in mapping.items():
181
185
  if original_qubit in parity_mapping:
182
186
  final_parity_qubit = inverse_mapping[parity_mapping[original_qubit]]
@@ -200,9 +204,9 @@ def compile_circuit(
200
204
  *,
201
205
  device_graph: nx.Graph,
202
206
  routing_attempts: int,
203
- compiler: Optional[Callable[[cirq.Circuit], cirq.Circuit]] = None,
204
- routing_algo_name: Optional[str] = None,
205
- router: Optional[Callable[..., ccr.SwapNetwork]] = None,
207
+ compiler: Callable[[cirq.Circuit], cirq.Circuit] | None = None,
208
+ routing_algo_name: str | None = None,
209
+ router: Callable[..., ccr.SwapNetwork] | None = None,
206
210
  add_readout_error_correction=False,
207
211
  ) -> CompilationResult:
208
212
  """Compile the given model circuit onto the given device graph. This uses a
@@ -233,7 +237,7 @@ def compile_circuit(
233
237
  compiled_circuit = circuit.copy()
234
238
 
235
239
  # Optionally add some the parity check bits.
236
- parity_map: Dict[cirq.Qid, cirq.Qid] = {} # original -> parity
240
+ parity_map: dict[cirq.Qid, cirq.Qid] = {} # original -> parity
237
241
  if add_readout_error_correction:
238
242
  num_qubits = len(compiled_circuit.all_qubits())
239
243
  # Sort just to make it deterministic.
@@ -258,7 +262,7 @@ def compile_circuit(
258
262
  # Github issue: https://github.com/quantumlib/Cirq/issues/2967
259
263
  routing_algo_name = 'greedy'
260
264
 
261
- swap_networks: List[ccr.SwapNetwork] = []
265
+ swap_networks: list[ccr.SwapNetwork] = []
262
266
  for _ in range(routing_attempts):
263
267
  swap_network = ccr.route_circuit(
264
268
  compiled_circuit, device_graph, router=router, algo_name=routing_algo_name
@@ -309,7 +313,7 @@ class QuantumVolumeResult:
309
313
  # The model circuit used.
310
314
  model_circuit: cirq.Circuit
311
315
  # The heavy set computed from the above model circuit.
312
- heavy_set: List[int]
316
+ heavy_set: list[int]
313
317
  # The model circuit after being compiled.
314
318
  compiled_circuit: cirq.Circuit
315
319
  # The percentage of outputs that this sampler had that were in the heavy
@@ -328,7 +332,7 @@ def prepare_circuits(
328
332
  depth: int,
329
333
  num_circuits: int,
330
334
  random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
331
- ) -> List[Tuple[cirq.Circuit, List[int]]]:
335
+ ) -> list[tuple[cirq.Circuit, list[int]]]:
332
336
  """Generates circuits and computes their heavy set.
333
337
 
334
338
  Args:
@@ -354,13 +358,13 @@ def prepare_circuits(
354
358
  def execute_circuits(
355
359
  *,
356
360
  device_graph: nx.Graph,
357
- samplers: List[cirq.Sampler],
358
- circuits: List[Tuple[cirq.Circuit, List[int]]],
361
+ samplers: list[cirq.Sampler],
362
+ circuits: list[tuple[cirq.Circuit, list[int]]],
359
363
  routing_attempts: int,
360
- compiler: Optional[Callable[[cirq.Circuit], cirq.Circuit]] = None,
364
+ compiler: Callable[[cirq.Circuit], cirq.Circuit] | None = None,
361
365
  repetitions: int = 10_000,
362
366
  add_readout_error_correction=False,
363
- ) -> List[QuantumVolumeResult]:
367
+ ) -> list[QuantumVolumeResult]:
364
368
  """Executes the given circuits on the given samplers.
365
369
 
366
370
  Args
@@ -381,7 +385,7 @@ def execute_circuits(
381
385
  """
382
386
  # First, compile all of the model circuits.
383
387
  print("Compiling model circuits")
384
- compiled_circuits: List[CompilationResult] = []
388
+ compiled_circuits: list[CompilationResult] = []
385
389
  for idx, (model_circuit, heavy_set) in enumerate(circuits):
386
390
  print(f" Compiling model circuit #{idx + 1}")
387
391
  compiled_circuits.append(
@@ -422,13 +426,13 @@ def calculate_quantum_volume(
422
426
  depth: int,
423
427
  num_circuits: int,
424
428
  device_graph: nx.Graph,
425
- samplers: List[cirq.Sampler],
429
+ samplers: list[cirq.Sampler],
426
430
  random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
427
- compiler: Optional[Callable[[cirq.Circuit], cirq.Circuit]] = None,
431
+ compiler: Callable[[cirq.Circuit], cirq.Circuit] | None = None,
428
432
  repetitions=10_000,
429
433
  routing_attempts=30,
430
434
  add_readout_error_correction=False,
431
- ) -> List[QuantumVolumeResult]:
435
+ ) -> list[QuantumVolumeResult]:
432
436
  """Run the quantum volume algorithm.
433
437
 
434
438
  This algorithm should compute the same values as Algorithm 1 in
@@ -1,6 +1,8 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
2
  """Tests for the Quantum Volume utilities."""
3
3
 
4
+ from __future__ import annotations
5
+
4
6
  import io
5
7
  from unittest.mock import MagicMock, Mock
6
8
 
@@ -16,7 +18,7 @@ class FakeDevice(cirq.Device):
16
18
  qubits = cirq.GridQubit.rect(5, 5)
17
19
 
18
20
 
19
- def test_generate_model_circuit():
21
+ def test_generate_model_circuit() -> None:
20
22
  """Test that a model circuit is randomly generated."""
21
23
  model_circuit = cirq.contrib.quantum_volume.generate_model_circuit(
22
24
  3, 3, random_state=np.random.RandomState(1)
@@ -27,7 +29,7 @@ def test_generate_model_circuit():
27
29
  assert list(model_circuit.findall_operations_with_gate_type(cirq.MeasurementGate)) == []
28
30
 
29
31
 
30
- def test_generate_model_circuit_without_seed():
32
+ def test_generate_model_circuit_without_seed() -> None:
31
33
  """Test that a model circuit is randomly generated without a seed."""
32
34
  model_circuit = cirq.contrib.quantum_volume.generate_model_circuit(3, 3)
33
35
 
@@ -36,7 +38,7 @@ def test_generate_model_circuit_without_seed():
36
38
  assert list(model_circuit.findall_operations_with_gate_type(cirq.MeasurementGate)) == []
37
39
 
38
40
 
39
- def test_generate_model_circuit_seed():
41
+ def test_generate_model_circuit_seed() -> None:
40
42
  """Test that a model circuit is determined by its seed ."""
41
43
  model_circuit_1 = cirq.contrib.quantum_volume.generate_model_circuit(
42
44
  3, 3, random_state=np.random.RandomState(1)
@@ -52,7 +54,7 @@ def test_generate_model_circuit_seed():
52
54
  assert model_circuit_2 != model_circuit_3
53
55
 
54
56
 
55
- def test_compute_heavy_set():
57
+ def test_compute_heavy_set() -> None:
56
58
  """Test that the heavy set can be computed from a given circuit."""
57
59
  a, b, c = cirq.LineQubit.range(3)
58
60
  model_circuit = cirq.Circuit(
@@ -67,7 +69,7 @@ def test_compute_heavy_set():
67
69
  assert cirq.contrib.quantum_volume.compute_heavy_set(model_circuit) == [5, 7]
68
70
 
69
71
 
70
- def test_sample_heavy_set():
72
+ def test_sample_heavy_set() -> None:
71
73
  """Test that we correctly sample a circuit's heavy set"""
72
74
 
73
75
  sampler = Mock(spec=cirq.Simulator)
@@ -87,7 +89,7 @@ def test_sample_heavy_set():
87
89
  assert probability == 0.75
88
90
 
89
91
 
90
- def test_sample_heavy_set_with_parity():
92
+ def test_sample_heavy_set_with_parity() -> None:
91
93
  """Test that we correctly sample a circuit's heavy set with a parity map"""
92
94
 
93
95
  sampler = Mock(spec=cirq.Simulator)
@@ -120,7 +122,7 @@ def test_sample_heavy_set_with_parity():
120
122
  assert probability == 0.5
121
123
 
122
124
 
123
- def test_compile_circuit_router():
125
+ def test_compile_circuit_router() -> None:
124
126
  """Tests that the given router is used."""
125
127
  router_mock = MagicMock()
126
128
  cirq.contrib.quantum_volume.compile_circuit(
@@ -132,7 +134,7 @@ def test_compile_circuit_router():
132
134
  router_mock.assert_called()
133
135
 
134
136
 
135
- def test_compile_circuit():
137
+ def test_compile_circuit() -> None:
136
138
  """Tests that we are able to compile a model circuit."""
137
139
  compiler_mock = MagicMock(side_effect=lambda circuit: circuit)
138
140
  a, b, c = cirq.LineQubit.range(3)
@@ -152,7 +154,7 @@ def test_compile_circuit():
152
154
  compiler_mock.assert_called_with(compilation_result.circuit)
153
155
 
154
156
 
155
- def test_compile_circuit_replaces_swaps():
157
+ def test_compile_circuit_replaces_swaps() -> None:
156
158
  """Tests that the compiler never sees the SwapPermutationGates from the
157
159
  router."""
158
160
  compiler_mock = MagicMock(side_effect=lambda circuit: circuit)
@@ -193,7 +195,7 @@ def test_compile_circuit_replaces_swaps():
193
195
  )
194
196
 
195
197
 
196
- def test_compile_circuit_with_readout_correction():
198
+ def test_compile_circuit_with_readout_correction() -> None:
197
199
  """Tests that we are able to compile a model circuit with readout error
198
200
  correction."""
199
201
  compiler_mock = MagicMock(side_effect=lambda circuit: circuit)
@@ -220,9 +222,10 @@ def test_compile_circuit_with_readout_correction():
220
222
  )
221
223
 
222
224
 
223
- def test_compile_circuit_multiple_routing_attempts():
225
+ def test_compile_circuit_multiple_routing_attempts() -> None:
224
226
  """Tests that we make multiple attempts at routing and keep the best one."""
225
227
  qubits = cirq.LineQubit.range(3)
228
+ initial_mapping: dict[cirq.Qid, cirq.Qid]
226
229
  initial_mapping = dict(zip(qubits, qubits))
227
230
  more_operations = cirq.Circuit([cirq.X.on_each(qubits), cirq.Y.on_each(qubits)])
228
231
  more_qubits = cirq.Circuit([cirq.X.on_each(cirq.LineQubit.range(4))])
@@ -250,7 +253,7 @@ def test_compile_circuit_multiple_routing_attempts():
250
253
  compiler_mock.assert_called_with(well_routed)
251
254
 
252
255
 
253
- def test_compile_circuit_no_routing_attempts():
256
+ def test_compile_circuit_no_routing_attempts() -> None:
254
257
  """Tests that setting no routing attempts throws an error."""
255
258
  a, b, c = cirq.LineQubit.range(3)
256
259
  model_circuit = cirq.Circuit([cirq.Moment([cirq.X(a), cirq.Y(b), cirq.Z(c)])])
@@ -264,7 +267,7 @@ def test_compile_circuit_no_routing_attempts():
264
267
  assert e.match('Unable to get routing for circuit')
265
268
 
266
269
 
267
- def test_calculate_quantum_volume_result():
270
+ def test_calculate_quantum_volume_result() -> None:
268
271
  """Test that running the main loop returns the desired result"""
269
272
  results = cirq.contrib.quantum_volume.calculate_quantum_volume(
270
273
  num_qubits=3,
@@ -285,7 +288,7 @@ def test_calculate_quantum_volume_result():
285
288
  cirq.to_json(results, buffer)
286
289
 
287
290
 
288
- def test_calculate_quantum_volume_result_with_device_graph():
291
+ def test_calculate_quantum_volume_result_with_device_graph() -> None:
289
292
  """Test that running the main loop routes the circuit onto the given device
290
293
  graph"""
291
294
  device_qubits = [cirq.GridQubit(i, j) for i in range(2) for j in range(3)]
@@ -306,7 +309,7 @@ def test_calculate_quantum_volume_result_with_device_graph():
306
309
  )
307
310
 
308
311
 
309
- def test_calculate_quantum_volume_loop():
312
+ def test_calculate_quantum_volume_loop() -> None:
310
313
  """Test that calculate_quantum_volume is able to run without erring."""
311
314
  # Keep test from taking a long time by lowering circuits and routing
312
315
  # attempts.
@@ -321,7 +324,7 @@ def test_calculate_quantum_volume_loop():
321
324
  )
322
325
 
323
326
 
324
- def test_calculate_quantum_volume_loop_with_readout_correction():
327
+ def test_calculate_quantum_volume_loop_with_readout_correction() -> None:
325
328
  """Test that calculate_quantum_volume is able to run without erring with
326
329
  readout error correction."""
327
330
  # Keep test from taking a long time by lowering circuits and routing
@@ -1,6 +1,9 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  from functools import lru_cache
3
- from typing import Dict, List, Optional, Sequence, Tuple, Union
6
+ from typing import Sequence
4
7
 
5
8
  import numpy as np
6
9
  import quimb
@@ -10,7 +13,7 @@ import cirq
10
13
 
11
14
 
12
15
  @lru_cache()
13
- def _qpos_tag(qubits: Union[cirq.Qid, Tuple[cirq.Qid]]):
16
+ def _qpos_tag(qubits: cirq.Qid | tuple[cirq.Qid]):
14
17
  """Given a qubit or qubits, return a "position tag" (used for drawing).
15
18
 
16
19
  For multiple qubits, the tag is for the first qubit.
@@ -22,9 +25,7 @@ def _qpos_tag(qubits: Union[cirq.Qid, Tuple[cirq.Qid]]):
22
25
 
23
26
 
24
27
  @lru_cache()
25
- def _qpos_y(
26
- qubits: Union[cirq.Qid, Tuple[cirq.Qid, ...]], all_qubits: Tuple[cirq.Qid, ...]
27
- ) -> float:
28
+ def _qpos_y(qubits: cirq.Qid | tuple[cirq.Qid, ...], all_qubits: tuple[cirq.Qid, ...]) -> float:
28
29
  """Given a qubit or qubits, return the position y value (used for drawing).
29
30
 
30
31
  For multiple qubits, the position is the mean of the qubit indices.
@@ -44,11 +45,11 @@ def _qpos_y(
44
45
 
45
46
 
46
47
  def _add_to_positions(
47
- positions: Dict[Tuple[str, str], Tuple[float, float]],
48
+ positions: dict[tuple[str, str], tuple[float, float]],
48
49
  mi: int,
49
- qubits: Union[cirq.Qid, Tuple[cirq.Qid]],
50
+ qubits: cirq.Qid | tuple[cirq.Qid],
50
51
  *,
51
- all_qubits: Tuple[cirq.Qid, ...],
52
+ all_qubits: tuple[cirq.Qid, ...],
52
53
  x_scale,
53
54
  y_scale,
54
55
  x_nudge,
@@ -76,8 +77,8 @@ def _add_to_positions(
76
77
 
77
78
 
78
79
  def circuit_to_density_matrix_tensors(
79
- circuit: cirq.Circuit, qubits: Optional[Sequence[cirq.Qid]] = None
80
- ) -> Tuple[List[qtn.Tensor], Dict['cirq.Qid', int], Dict[Tuple[str, str], Tuple[float, float]]]:
80
+ circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None
81
+ ) -> tuple[list[qtn.Tensor], dict[cirq.Qid, int], dict[tuple[str, str], tuple[float, float]]]:
81
82
  """Given a circuit with mixtures or channels, construct a tensor network
82
83
  representation of the density matrix.
83
84
 
@@ -109,10 +110,10 @@ def circuit_to_density_matrix_tensors(
109
110
  qubits = sorted(circuit.all_qubits()) # pragma: no cover
110
111
  qubits = tuple(qubits)
111
112
 
112
- qubit_frontier: Dict[cirq.Qid, int] = {q: 0 for q in qubits}
113
+ qubit_frontier: dict[cirq.Qid, int] = {q: 0 for q in qubits}
113
114
  kraus_frontier = 0
114
- positions: Dict[Tuple[str, str], Tuple[float, float]] = {}
115
- tensors: List[qtn.Tensor] = []
115
+ positions: dict[tuple[str, str], tuple[float, float]] = {}
116
+ tensors: list[qtn.Tensor] = []
116
117
 
117
118
  x_scale = 2
118
119
  y_scale = 3
@@ -196,7 +197,7 @@ def circuit_to_density_matrix_tensors(
196
197
 
197
198
 
198
199
  def tensor_density_matrix(
199
- circuit: cirq.Circuit, qubits: Optional[List[cirq.Qid]] = None
200
+ circuit: cirq.Circuit, qubits: Sequence[cirq.Qid] | None = None
200
201
  ) -> np.ndarray:
201
202
  """Given a circuit with mixtures or channels, contract a tensor network
202
203
  representing the resultant density matrix.