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
@@ -14,18 +14,20 @@
14
14
 
15
15
  """Base class for creating custom target gatesets which can be used for compilation."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import abc
18
- from typing import Hashable, List, Optional, Type, TYPE_CHECKING, Union
20
+ from typing import Hashable, TYPE_CHECKING
19
21
 
20
22
  from cirq import circuits, ops, protocols, transformers
21
- from cirq.protocols.decompose_protocol import DecomposeResult
22
23
  from cirq.transformers import merge_k_qubit_gates, merge_single_qubit_gates
23
24
 
24
25
  if TYPE_CHECKING:
25
26
  import cirq
27
+ from cirq.protocols.decompose_protocol import DecomposeResult
26
28
 
27
29
 
28
- def create_transformer_with_kwargs(transformer: 'cirq.TRANSFORMER', **kwargs) -> 'cirq.TRANSFORMER':
30
+ def create_transformer_with_kwargs(transformer: cirq.TRANSFORMER, **kwargs) -> cirq.TRANSFORMER:
29
31
  """Method to capture additional keyword arguments to transformers while preserving mypy type.
30
32
 
31
33
  Returns a `cirq.TRANSFORMER` which, when called with a circuit and transformer context, is
@@ -33,13 +35,13 @@ def create_transformer_with_kwargs(transformer: 'cirq.TRANSFORMER', **kwargs) ->
33
35
  capture keyword arguments of a transformer before passing them as an argument to an API that
34
36
  expects `cirq.TRANSFORMER`. For example:
35
37
 
36
- >>> def run_transformers(transformers: 'List[cirq.TRANSFORMER]'):
38
+ >>> def run_transformers(transformers: list[cirq.TRANSFORMER]):
37
39
  ... circuit = cirq.Circuit(cirq.X(cirq.q(0)))
38
40
  ... context = cirq.TransformerContext()
39
41
  ... for transformer in transformers:
40
42
  ... transformer(circuit, context=context)
41
43
  ...
42
- >>> transformers: 'List[cirq.TRANSFORMER]' = []
44
+ >>> transformers: list[cirq.TRANSFORMER] = []
43
45
  >>> transformers.append(
44
46
  ... cirq.create_transformer_with_kwargs(
45
47
  ... cirq.expand_composite, no_decomp=lambda op: cirq.num_qubits(op) <= 2
@@ -65,8 +67,8 @@ def create_transformer_with_kwargs(transformer: 'cirq.TRANSFORMER', **kwargs) ->
65
67
  raise SyntaxError('**kwargs to be captured must not contain `context`.')
66
68
 
67
69
  def transformer_with_kwargs(
68
- circuit: 'cirq.AbstractCircuit', *, context: Optional['cirq.TransformerContext'] = None
69
- ) -> 'cirq.AbstractCircuit':
70
+ circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
71
+ ) -> cirq.AbstractCircuit:
70
72
  return transformer(circuit, context=context, **kwargs)
71
73
 
72
74
  return transformer_with_kwargs
@@ -81,8 +83,8 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
81
83
 
82
84
  def __init__(
83
85
  self,
84
- *gates: Union[Type['cirq.Gate'], 'cirq.Gate', 'cirq.GateFamily'],
85
- name: Optional[str] = None,
86
+ *gates: type[cirq.Gate] | cirq.Gate | cirq.GateFamily,
87
+ name: str | None = None,
86
88
  unroll_circuit_op: bool = True,
87
89
  preserve_moment_structure: bool = True,
88
90
  reorder_operations: bool = False,
@@ -116,7 +118,7 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
116
118
  """Maximum number of qubits on which a gate from this gateset can act upon."""
117
119
 
118
120
  @abc.abstractmethod
119
- def decompose_to_target_gateset(self, op: 'cirq.Operation', moment_idx: int) -> DecomposeResult:
121
+ def decompose_to_target_gateset(self, op: cirq.Operation, moment_idx: int) -> DecomposeResult:
120
122
  """Method to rewrite the given operation using gates from this gateset.
121
123
 
122
124
  Args:
@@ -128,7 +130,7 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
128
130
  - `None` or `NotImplemented` if does not know how to decompose `op`.
129
131
  """
130
132
 
131
- def _validate_operation(self, op: 'cirq.Operation') -> bool:
133
+ def _validate_operation(self, op: cirq.Operation) -> bool:
132
134
  """Validates whether the given `cirq.Operation` is contained in this Gateset.
133
135
 
134
136
  Overrides the method on the base gateset class to ensure that operations which created
@@ -153,7 +155,7 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
153
155
  return "_default_merged_k_qubit_unitaries"
154
156
 
155
157
  @property
156
- def preprocess_transformers(self) -> List['cirq.TRANSFORMER']:
158
+ def preprocess_transformers(self) -> list[cirq.TRANSFORMER]:
157
159
  """List of transformers which should be run before decomposing individual operations."""
158
160
  reorder_transfomers = (
159
161
  [transformers.insertion_sort_transformer] if self._reorder_operations else []
@@ -172,9 +174,9 @@ class CompilationTargetGateset(ops.Gateset, metaclass=abc.ABCMeta):
172
174
  ]
173
175
 
174
176
  @property
175
- def postprocess_transformers(self) -> List['cirq.TRANSFORMER']:
177
+ def postprocess_transformers(self) -> list[cirq.TRANSFORMER]:
176
178
  """List of transformers which should be run after decomposing individual operations."""
177
- processors: List['cirq.TRANSFORMER'] = [
179
+ processors: list[cirq.TRANSFORMER] = [
178
180
  merge_single_qubit_gates.merge_single_qubit_moments_to_phxz,
179
181
  transformers.drop_negligible_operations,
180
182
  transformers.drop_empty_moments,
@@ -221,7 +223,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
221
223
  def num_qubits(self) -> int:
222
224
  return 2
223
225
 
224
- def decompose_to_target_gateset(self, op: 'cirq.Operation', moment_idx: int) -> DecomposeResult:
226
+ def decompose_to_target_gateset(self, op: cirq.Operation, moment_idx: int) -> DecomposeResult:
225
227
  if not 1 <= protocols.num_qubits(op) <= 2:
226
228
  return self._decompose_multi_qubit_operation(op, moment_idx)
227
229
  if protocols.num_qubits(op) == 1:
@@ -248,7 +250,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
248
250
  )
249
251
  if switch_to_new:
250
252
  return new_optree
251
- mapped_old_optree: List['cirq.OP_TREE'] = []
253
+ mapped_old_optree: list[cirq.OP_TREE] = []
252
254
  for old_op in ops.flatten_to_ops(old_optree):
253
255
  if old_op in self:
254
256
  mapped_old_optree.append(old_op)
@@ -260,7 +262,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
260
262
  return mapped_old_optree
261
263
 
262
264
  def _decompose_single_qubit_operation(
263
- self, op: 'cirq.Operation', moment_idx: int
265
+ self, op: cirq.Operation, moment_idx: int
264
266
  ) -> DecomposeResult:
265
267
  """Decomposes (connected component of) 1-qubit operations using gates from this gateset.
266
268
 
@@ -282,7 +284,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
282
284
  )
283
285
 
284
286
  def _decompose_multi_qubit_operation(
285
- self, op: 'cirq.Operation', moment_idx: int
287
+ self, op: cirq.Operation, moment_idx: int
286
288
  ) -> DecomposeResult:
287
289
  """Decomposes operations acting on more than 2 qubits using gates from this gateset.
288
290
 
@@ -298,7 +300,7 @@ class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
298
300
 
299
301
  @abc.abstractmethod
300
302
  def _decompose_two_qubit_operation(
301
- self, op: 'cirq.Operation', moment_idx: int
303
+ self, op: cirq.Operation, moment_idx: int
302
304
  ) -> DecomposeResult:
303
305
  """Decomposes (connected component of) 2-qubit operations using gates from this gateset.
304
306
 
@@ -12,15 +12,19 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import List
15
+ from __future__ import annotations
16
+
17
+ from typing import TYPE_CHECKING
16
18
 
17
19
  import pytest
18
20
 
19
21
  import cirq
20
- from cirq.protocols.decompose_protocol import DecomposeResult
22
+
23
+ if TYPE_CHECKING:
24
+ from cirq.protocols.decompose_protocol import DecomposeResult
21
25
 
22
26
 
23
- def test_compilation_target_gateset():
27
+ def test_compilation_target_gateset() -> None:
24
28
  class ExampleTargetGateset(cirq.CompilationTargetGateset):
25
29
  def __init__(self):
26
30
  super().__init__(cirq.AnyUnitaryGateFamily(2))
@@ -29,11 +33,11 @@ def test_compilation_target_gateset():
29
33
  def num_qubits(self) -> int:
30
34
  return 2
31
35
 
32
- def decompose_to_target_gateset(self, op: 'cirq.Operation', _) -> DecomposeResult:
36
+ def decompose_to_target_gateset(self, op: cirq.Operation, _) -> DecomposeResult:
33
37
  return op if cirq.num_qubits(op) == 2 and cirq.has_unitary(op) else NotImplemented
34
38
 
35
39
  @property
36
- def preprocess_transformers(self) -> List[cirq.TRANSFORMER]:
40
+ def preprocess_transformers(self) -> list[cirq.TRANSFORMER]:
37
41
  return []
38
42
 
39
43
  gateset = ExampleTargetGateset()
@@ -63,7 +67,7 @@ class ExampleCXTargetGateset(cirq.TwoQubitCompilationTargetGateset):
63
67
  def __init__(self):
64
68
  super().__init__(cirq.AnyUnitaryGateFamily(1), cirq.CNOT)
65
69
 
66
- def _decompose_two_qubit_operation(self, op: 'cirq.Operation', _) -> DecomposeResult:
70
+ def _decompose_two_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
67
71
  if not cirq.has_unitary(op):
68
72
  return NotImplemented
69
73
 
@@ -77,7 +81,7 @@ class ExampleCXTargetGateset(cirq.TwoQubitCompilationTargetGateset):
77
81
  cirq.Z.on_each(q0, q1),
78
82
  ]
79
83
 
80
- def _decompose_single_qubit_operation(self, op: 'cirq.Operation', _) -> DecomposeResult:
84
+ def _decompose_single_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
81
85
  if not cirq.has_unitary(op):
82
86
  return NotImplemented
83
87
  assert self._intermediate_result_tag in op.tags
@@ -90,7 +94,7 @@ class ExampleCXTargetGateset(cirq.TwoQubitCompilationTargetGateset):
90
94
  )
91
95
 
92
96
 
93
- def test_two_qubit_compilation_leaves_single_gates_in_gateset():
97
+ def test_two_qubit_compilation_leaves_single_gates_in_gateset() -> None:
94
98
  q = cirq.LineQubit.range(2)
95
99
  gateset = ExampleCXTargetGateset()
96
100
 
@@ -101,7 +105,7 @@ def test_two_qubit_compilation_leaves_single_gates_in_gateset():
101
105
  cirq.testing.assert_same_circuits(cirq.optimize_for_target_gateset(c, gateset=gateset), c)
102
106
 
103
107
 
104
- def test_two_qubit_compilation_merges_runs_of_single_qubit_gates():
108
+ def test_two_qubit_compilation_merges_runs_of_single_qubit_gates() -> None:
105
109
  q = cirq.LineQubit.range(2)
106
110
  c = cirq.Circuit(cirq.CNOT(*q), cirq.X(q[0]), cirq.Y(q[0]), cirq.CNOT(*q))
107
111
  cirq.testing.assert_same_circuits(
@@ -114,7 +118,7 @@ def test_two_qubit_compilation_merges_runs_of_single_qubit_gates():
114
118
  )
115
119
 
116
120
 
117
- def test_two_qubit_compilation_decompose_operation_not_implemented():
121
+ def test_two_qubit_compilation_decompose_operation_not_implemented() -> None:
118
122
  gateset = ExampleCXTargetGateset()
119
123
  q = cirq.LineQubit.range(3)
120
124
  assert gateset.decompose_to_target_gateset(cirq.measure(q[0]), 1) is NotImplemented
@@ -126,7 +130,7 @@ def test_two_qubit_compilation_decompose_operation_not_implemented():
126
130
  assert gateset.decompose_to_target_gateset(cirq.CCZ(*q), 1) is NotImplemented
127
131
 
128
132
 
129
- def test_two_qubit_compilation_merge_and_replace_to_target_gateset():
133
+ def test_two_qubit_compilation_merge_and_replace_to_target_gateset() -> None:
130
134
  q = cirq.LineQubit.range(2)
131
135
  c_orig = cirq.Circuit(
132
136
  cirq.Moment(cirq.Z(q[1]), cirq.X(q[0])),
@@ -160,7 +164,7 @@ def test_two_qubit_compilation_merge_and_replace_to_target_gateset():
160
164
  )
161
165
 
162
166
 
163
- def test_two_qubit_compilation_merge_and_replace_inefficient_component():
167
+ def test_two_qubit_compilation_merge_and_replace_inefficient_component() -> None:
164
168
  q = cirq.LineQubit.range(2)
165
169
  c_orig = cirq.Circuit(
166
170
  cirq.Moment(cirq.X(q[0])),
@@ -204,16 +208,16 @@ m: ═════════════════════════
204
208
  )
205
209
 
206
210
 
207
- def test_two_qubit_compilation_replaces_only_if_2q_gate_count_is_less():
211
+ def test_two_qubit_compilation_replaces_only_if_2q_gate_count_is_less() -> None:
208
212
  class ExampleTargetGateset(cirq.TwoQubitCompilationTargetGateset):
209
213
  def __init__(self):
210
214
  super().__init__(cirq.X, cirq.CNOT)
211
215
 
212
- def _decompose_two_qubit_operation(self, op: 'cirq.Operation', _) -> DecomposeResult:
216
+ def _decompose_two_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
213
217
  q0, q1 = op.qubits
214
218
  return [cirq.X.on_each(q0, q1), cirq.CNOT(q0, q1)] * 10
215
219
 
216
- def _decompose_single_qubit_operation(self, op: 'cirq.Operation', _) -> DecomposeResult:
220
+ def _decompose_single_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
217
221
  return cirq.X(*op.qubits) if op.gate == cirq.Y else NotImplemented
218
222
 
219
223
  q = cirq.LineQubit.range(2)
@@ -224,7 +228,7 @@ def test_two_qubit_compilation_replaces_only_if_2q_gate_count_is_less():
224
228
  cirq.testing.assert_same_circuits(c_new, c_expected)
225
229
 
226
230
 
227
- def test_create_transformer_with_kwargs_raises():
231
+ def test_create_transformer_with_kwargs_raises() -> None:
228
232
  with pytest.raises(SyntaxError, match="must not contain `context`"):
229
233
  cirq.create_transformer_with_kwargs(
230
234
  cirq.merge_k_qubit_unitaries, k=2, context=cirq.TransformerContext()
@@ -14,7 +14,9 @@
14
14
 
15
15
  """Target gateset used for compiling circuits to CZ + 1-q rotations + measurement gates."""
16
16
 
17
- from typing import Any, Dict, Sequence, Type, TYPE_CHECKING, Union
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Sequence, TYPE_CHECKING
18
20
 
19
21
  from cirq import ops, protocols
20
22
  from cirq.transformers.analytical_decompositions import two_qubit_to_cz
@@ -47,7 +49,7 @@ class CZTargetGateset(compilation_target_gateset.TwoQubitCompilationTargetGatese
47
49
  *,
48
50
  atol: float = 1e-8,
49
51
  allow_partial_czs: bool = False,
50
- additional_gates: Sequence[Union[Type['cirq.Gate'], 'cirq.Gate', 'cirq.GateFamily']] = (),
52
+ additional_gates: Sequence[type[cirq.Gate] | cirq.Gate | cirq.GateFamily] = (),
51
53
  preserve_moment_structure: bool = True,
52
54
  reorder_operations: bool = False,
53
55
  ) -> None:
@@ -83,7 +85,7 @@ class CZTargetGateset(compilation_target_gateset.TwoQubitCompilationTargetGatese
83
85
  self.atol = atol
84
86
  self.allow_partial_czs = allow_partial_czs
85
87
 
86
- def _decompose_two_qubit_operation(self, op: 'cirq.Operation', _) -> 'cirq.OP_TREE':
88
+ def _decompose_two_qubit_operation(self, op: cirq.Operation, _) -> cirq.OP_TREE:
87
89
  if not protocols.has_unitary(op):
88
90
  return NotImplemented
89
91
  return two_qubit_to_cz.two_qubit_matrix_to_cz_operations(
@@ -106,8 +108,8 @@ class CZTargetGateset(compilation_target_gateset.TwoQubitCompilationTargetGatese
106
108
  def _value_equality_values_(self) -> Any:
107
109
  return self.atol, self.allow_partial_czs, frozenset(self.additional_gates)
108
110
 
109
- def _json_dict_(self) -> Dict[str, Any]:
110
- d: Dict[str, Any] = {'atol': self.atol, 'allow_partial_czs': self.allow_partial_czs}
111
+ def _json_dict_(self) -> dict[str, Any]:
112
+ d: dict[str, Any] = {'atol': self.atol, 'allow_partial_czs': self.allow_partial_czs}
111
113
  if self.additional_gates:
112
114
  d['additional_gates'] = list(self.additional_gates)
113
115
  return d
@@ -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 Optional, Sequence, Type
15
+ from __future__ import annotations
16
+
17
+ from typing import Sequence
16
18
 
17
19
  import numpy as np
18
20
  import pytest
@@ -31,7 +33,7 @@ def all_gates_of_type(m: cirq.Moment, g: cirq.Gateset):
31
33
  def assert_optimizes(
32
34
  before: cirq.Circuit,
33
35
  expected: cirq.Circuit,
34
- additional_gates: Optional[Sequence[Type[cirq.Gate]]] = None,
36
+ additional_gates: Sequence[type[cirq.Gate]] | None = None,
35
37
  ):
36
38
  if additional_gates is None:
37
39
  gateset = cirq.CZTargetGateset()
@@ -56,7 +58,7 @@ def assert_optimization_not_broken(circuit: cirq.Circuit):
56
58
  )
57
59
 
58
60
 
59
- def test_convert_to_cz_preserving_moment_structure():
61
+ def test_convert_to_cz_preserving_moment_structure() -> None:
60
62
  q = cirq.LineQubit.range(5)
61
63
  op = lambda q0, q1: cirq.H(q1).controlled_by(q0)
62
64
  c_orig = cirq.Circuit(
@@ -100,7 +102,7 @@ def test_convert_to_cz_preserving_moment_structure():
100
102
  )
101
103
 
102
104
 
103
- def test_clears_paired_cnot():
105
+ def test_clears_paired_cnot() -> None:
104
106
  a, b = cirq.LineQubit.range(2)
105
107
  assert_optimizes(
106
108
  before=cirq.Circuit(cirq.Moment(cirq.CNOT(a, b)), cirq.Moment(cirq.CNOT(a, b))),
@@ -108,7 +110,7 @@ def test_clears_paired_cnot():
108
110
  )
109
111
 
110
112
 
111
- def test_ignores_czs_separated_by_parameterized():
113
+ def test_ignores_czs_separated_by_parameterized() -> None:
112
114
  a, b = cirq.LineQubit.range(2)
113
115
  assert_optimizes(
114
116
  before=cirq.Circuit(
@@ -129,19 +131,19 @@ def test_ignores_czs_separated_by_parameterized():
129
131
  )
130
132
 
131
133
 
132
- def test_cnots_separated_by_single_gates_correct():
134
+ def test_cnots_separated_by_single_gates_correct() -> None:
133
135
  a, b = cirq.LineQubit.range(2)
134
136
  assert_optimization_not_broken(cirq.Circuit(cirq.CNOT(a, b), cirq.H(b), cirq.CNOT(a, b)))
135
137
 
136
138
 
137
- def test_czs_separated_by_single_gates_correct():
139
+ def test_czs_separated_by_single_gates_correct() -> None:
138
140
  a, b = cirq.LineQubit.range(2)
139
141
  assert_optimization_not_broken(
140
142
  cirq.Circuit(cirq.CZ(a, b), cirq.X(b), cirq.X(b), cirq.X(b), cirq.CZ(a, b))
141
143
  )
142
144
 
143
145
 
144
- def test_inefficient_circuit_correct():
146
+ def test_inefficient_circuit_correct() -> None:
145
147
  t = 0.1
146
148
  v = 0.11
147
149
  a, b = cirq.LineQubit.range(2)
@@ -166,7 +168,7 @@ def test_inefficient_circuit_correct():
166
168
  )
167
169
 
168
170
 
169
- def test_optimizes_single_iswap():
171
+ def test_optimizes_single_iswap() -> None:
170
172
  a, b = cirq.LineQubit.range(2)
171
173
  c = cirq.Circuit(cirq.ISWAP(a, b))
172
174
  assert_optimization_not_broken(c)
@@ -174,7 +176,7 @@ def test_optimizes_single_iswap():
174
176
  assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 2
175
177
 
176
178
 
177
- def test_optimizes_tagged_partial_cz():
179
+ def test_optimizes_tagged_partial_cz() -> None:
178
180
  a, b = cirq.LineQubit.range(2)
179
181
  c = cirq.Circuit((cirq.CZ**0.5)(a, b).with_tags('mytag'))
180
182
  assert_optimization_not_broken(c)
@@ -184,7 +186,7 @@ def test_optimizes_tagged_partial_cz():
184
186
  ), 'It should take 2 CZ gates to decompose a CZ**0.5 gate'
185
187
 
186
188
 
187
- def test_not_decompose_czs():
189
+ def test_not_decompose_czs() -> None:
188
190
  circuit = cirq.Circuit(
189
191
  cirq.CZPowGate(exponent=1, global_shift=-0.5).on(*cirq.LineQubit.range(2))
190
192
  )
@@ -201,7 +203,7 @@ def test_not_decompose_czs():
201
203
  ),
202
204
  ),
203
205
  )
204
- def test_decompose_partial_czs(circuit):
206
+ def test_decompose_partial_czs(circuit) -> None:
205
207
  circuit = cirq.optimize_for_target_gateset(
206
208
  circuit, gateset=cirq.CZTargetGateset(), ignore_failures=False
207
209
  )
@@ -216,7 +218,7 @@ def test_decompose_partial_czs(circuit):
216
218
  assert num_part_cz == 0
217
219
 
218
220
 
219
- def test_not_decompose_partial_czs():
221
+ def test_not_decompose_partial_czs() -> None:
220
222
  circuit = cirq.Circuit(
221
223
  cirq.CZPowGate(exponent=0.1, global_shift=-0.5)(*cirq.LineQubit.range(2))
222
224
  )
@@ -232,7 +234,7 @@ def test_not_decompose_partial_czs():
232
234
  assert num_part_cz == 1
233
235
 
234
236
 
235
- def test_avoids_decompose_when_matrix_available():
237
+ def test_avoids_decompose_when_matrix_available() -> None:
236
238
  class OtherXX(cirq.testing.TwoQubitGate): # pragma: no cover
237
239
  def _has_unitary_(self) -> bool:
238
240
  return True
@@ -261,7 +263,7 @@ def test_avoids_decompose_when_matrix_available():
261
263
  assert len(c) == 0
262
264
 
263
265
 
264
- def test_composite_gates_without_matrix():
266
+ def test_composite_gates_without_matrix() -> None:
265
267
  class CompositeExample(cirq.testing.SingleQubitGate):
266
268
  def _decompose_(self, qubits):
267
269
  yield cirq.X(qubits[0])
@@ -289,7 +291,7 @@ def test_composite_gates_without_matrix():
289
291
  )
290
292
 
291
293
 
292
- def test_unsupported_gate():
294
+ def test_unsupported_gate() -> None:
293
295
  class UnsupportedExample(cirq.testing.TwoQubitGate):
294
296
  pass
295
297
 
@@ -319,11 +321,11 @@ def test_unsupported_gate():
319
321
  cirq.CZTargetGateset(additional_gates=()),
320
322
  ],
321
323
  )
322
- def test_repr(gateset):
324
+ def test_repr(gateset) -> None:
323
325
  cirq.testing.assert_equivalent_repr(gateset)
324
326
 
325
327
 
326
- def test_with_commutation():
328
+ def test_with_commutation() -> None:
327
329
  c = cirq.Circuit(
328
330
  cirq.CZ(cirq.q(0), cirq.q(1)), cirq.CZ(cirq.q(1), cirq.q(2)), cirq.CZ(cirq.q(0), cirq.q(1))
329
331
  )
@@ -335,7 +337,7 @@ def test_with_commutation():
335
337
  assert got == cirq.Circuit(cirq.CZ(cirq.q(1), cirq.q(2)))
336
338
 
337
339
 
338
- def test_reorder_operations_and_preserve_moment_structure_raises():
340
+ def test_reorder_operations_and_preserve_moment_structure_raises() -> None:
339
341
  with pytest.raises(
340
342
  ValueError, match='reorder_operations and preserve_moment_structure can not both be True'
341
343
  ):
@@ -14,15 +14,17 @@
14
14
 
15
15
  """Target gateset used for compiling circuits to √iSWAP + 1-q rotations + measurement gates."""
16
16
 
17
- from typing import Any, Dict, Optional, Sequence, Type, TYPE_CHECKING, Union
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Sequence, TYPE_CHECKING
18
20
 
19
21
  from cirq import ops, protocols
20
- from cirq.protocols.decompose_protocol import DecomposeResult
21
22
  from cirq.transformers.analytical_decompositions import two_qubit_to_sqrt_iswap
22
23
  from cirq.transformers.target_gatesets import compilation_target_gateset
23
24
 
24
25
  if TYPE_CHECKING:
25
26
  import cirq
27
+ from cirq.protocols.decompose_protocol import DecomposeResult
26
28
 
27
29
 
28
30
  class SqrtIswapTargetGateset(compilation_target_gateset.TwoQubitCompilationTargetGateset):
@@ -47,9 +49,9 @@ class SqrtIswapTargetGateset(compilation_target_gateset.TwoQubitCompilationTarge
47
49
  self,
48
50
  *,
49
51
  atol: float = 1e-8,
50
- required_sqrt_iswap_count: Optional[int] = None,
52
+ required_sqrt_iswap_count: int | None = None,
51
53
  use_sqrt_iswap_inv: bool = False,
52
- additional_gates: Sequence[Union[Type['cirq.Gate'], 'cirq.Gate', 'cirq.GateFamily']] = (),
54
+ additional_gates: Sequence[type[cirq.Gate] | cirq.Gate | cirq.GateFamily] = (),
53
55
  ):
54
56
  """Initializes `cirq.SqrtIswapTargetGateset`
55
57
 
@@ -87,7 +89,7 @@ class SqrtIswapTargetGateset(compilation_target_gateset.TwoQubitCompilationTarge
87
89
  self.required_sqrt_iswap_count = required_sqrt_iswap_count
88
90
  self.use_sqrt_iswap_inv = use_sqrt_iswap_inv
89
91
 
90
- def _decompose_two_qubit_operation(self, op: 'cirq.Operation', _) -> DecomposeResult:
92
+ def _decompose_two_qubit_operation(self, op: cirq.Operation, _) -> DecomposeResult:
91
93
  if protocols.has_unitary(op):
92
94
  return two_qubit_to_sqrt_iswap.two_qubit_matrix_to_sqrt_iswap_operations(
93
95
  op.qubits[0],
@@ -123,8 +125,8 @@ class SqrtIswapTargetGateset(compilation_target_gateset.TwoQubitCompilationTarge
123
125
  frozenset(self.additional_gates),
124
126
  )
125
127
 
126
- def _json_dict_(self) -> Dict[str, Any]:
127
- d: Dict[str, Any] = {
128
+ def _json_dict_(self) -> dict[str, Any]:
129
+ d: dict[str, Any] = {
128
130
  'atol': self.atol,
129
131
  'required_sqrt_iswap_count': self.required_sqrt_iswap_count,
130
132
  'use_sqrt_iswap_inv': self.use_sqrt_iswap_inv,