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,12 +14,14 @@
14
14
 
15
15
  """Creates the abstraction for gauge compiling as a cirq transformer."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import abc
18
20
  import functools
19
21
  import itertools
20
22
  from dataclasses import dataclass
21
23
  from numbers import Real
22
- from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
24
+ from typing import Callable, Sequence, TYPE_CHECKING
23
25
 
24
26
  import numpy as np
25
27
  import sympy
@@ -28,11 +30,13 @@ from attrs import field, frozen
28
30
  from cirq import circuits, ops
29
31
  from cirq.protocols import unitary_protocol
30
32
  from cirq.protocols.has_unitary_protocol import has_unitary
31
- from cirq.study import sweepable
32
33
  from cirq.study.sweeps import Points, Zip
33
34
  from cirq.transformers import transformer_api
34
35
  from cirq.transformers.analytical_decompositions import single_qubit_decompositions
35
36
 
37
+ if TYPE_CHECKING:
38
+ import cirq
39
+
36
40
 
37
41
  class Gauge(abc.ABC):
38
42
  """A gauge replaces a two qubit gate with an equivalent subcircuit.
@@ -49,7 +53,7 @@ class Gauge(abc.ABC):
49
53
  return 1.0
50
54
 
51
55
  @abc.abstractmethod
52
- def sample(self, gate: ops.Gate, prng: np.random.Generator) -> "ConstantGauge":
56
+ def sample(self, gate: ops.Gate, prng: np.random.Generator) -> ConstantGauge:
53
57
  """Returns a ConstantGauge sampled from a family of gauges.
54
58
 
55
59
  Args:
@@ -66,30 +70,30 @@ class ConstantGauge(Gauge):
66
70
  """A gauge that replaces a two qubit gate with a constant gauge."""
67
71
 
68
72
  two_qubit_gate: ops.Gate
69
- pre_q0: Tuple[ops.Gate, ...] = field(
73
+ pre_q0: tuple[ops.Gate, ...] = field(
70
74
  default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
71
75
  )
72
- pre_q1: Tuple[ops.Gate, ...] = field(
76
+ pre_q1: tuple[ops.Gate, ...] = field(
73
77
  default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
74
78
  )
75
- post_q0: Tuple[ops.Gate, ...] = field(
79
+ post_q0: tuple[ops.Gate, ...] = field(
76
80
  default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
77
81
  )
78
- post_q1: Tuple[ops.Gate, ...] = field(
82
+ post_q1: tuple[ops.Gate, ...] = field(
79
83
  default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
80
84
  )
81
85
  swap_qubits: bool = False
82
86
 
83
- def sample(self, gate: ops.Gate, prng: np.random.Generator) -> "ConstantGauge":
87
+ def sample(self, gate: ops.Gate, prng: np.random.Generator) -> ConstantGauge:
84
88
  return self
85
89
 
86
90
  @property
87
- def pre(self) -> Tuple[Tuple[ops.Gate, ...], Tuple[ops.Gate, ...]]:
91
+ def pre(self) -> tuple[tuple[ops.Gate, ...], tuple[ops.Gate, ...]]:
88
92
  """A tuple (ops to apply to q0, ops to apply to q1)."""
89
93
  return self.pre_q0, self.pre_q1
90
94
 
91
95
  @property
92
- def post(self) -> Tuple[Tuple[ops.Gate, ...], Tuple[ops.Gate, ...]]:
96
+ def post(self) -> tuple[tuple[ops.Gate, ...], tuple[ops.Gate, ...]]:
93
97
  """A tuple (ops to apply to q0, ops to apply to q1)."""
94
98
  return self.post_q0, self.post_q1
95
99
 
@@ -104,16 +108,16 @@ class ConstantGauge(Gauge):
104
108
  class SameGateGauge(Gauge):
105
109
  """Same as ConstantGauge but the new two-qubit gate equals the old gate."""
106
110
 
107
- pre_q0: Tuple[ops.Gate, ...] = field(
111
+ pre_q0: tuple[ops.Gate, ...] = field(
108
112
  default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
109
113
  )
110
- pre_q1: Tuple[ops.Gate, ...] = field(
114
+ pre_q1: tuple[ops.Gate, ...] = field(
111
115
  default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
112
116
  )
113
- post_q0: Tuple[ops.Gate, ...] = field(
117
+ post_q0: tuple[ops.Gate, ...] = field(
114
118
  default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
115
119
  )
116
- post_q1: Tuple[ops.Gate, ...] = field(
120
+ post_q1: tuple[ops.Gate, ...] = field(
117
121
  default=(), converter=lambda g: (g,) if isinstance(g, ops.Gate) else tuple(g)
118
122
  )
119
123
  swap_qubits: bool = False
@@ -140,12 +144,12 @@ class TwoQubitGateSymbolizer:
140
144
  n_symbols: The number of symbols to use for parameterization.
141
145
  """
142
146
 
143
- symbolizer_fn: Callable[[ops.Gate, Sequence[sympy.Symbol]], Tuple[ops.Gate, Dict[str, Real]]]
147
+ symbolizer_fn: Callable[[ops.Gate, Sequence[sympy.Symbol]], tuple[ops.Gate, dict[str, Real]]]
144
148
  n_symbols: int
145
149
 
146
150
  def __call__(
147
151
  self, two_qubit_gate: ops.Gate, symbols: Sequence[sympy.Symbol]
148
- ) -> Tuple[ops.Gate, Dict[str, Real]]:
152
+ ) -> tuple[ops.Gate, dict[str, Real]]:
149
153
  """Symbolizes a two qubit gate to a parameterized gate.
150
154
 
151
155
  Args:
@@ -193,9 +197,9 @@ class GaugeTransformer:
193
197
  self,
194
198
  # target can be either a specific gate, gatefamily or gateset
195
199
  # which allows matching parametric gates.
196
- target: Union[ops.Gate, ops.Gateset, ops.GateFamily],
200
+ target: ops.Gate | ops.Gateset | ops.GateFamily,
197
201
  gauge_selector: Callable[[np.random.Generator], Gauge],
198
- two_qubit_gate_symbolizer: Optional[TwoQubitGateSymbolizer] = None,
202
+ two_qubit_gate_symbolizer: TwoQubitGateSymbolizer | None = None,
199
203
  ) -> None:
200
204
  """Constructs a GaugeTransformer.
201
205
 
@@ -213,8 +217,8 @@ class GaugeTransformer:
213
217
  self,
214
218
  circuit: circuits.AbstractCircuit,
215
219
  *,
216
- context: Optional[transformer_api.TransformerContext] = None,
217
- prng: Optional[np.random.Generator] = None,
220
+ context: transformer_api.TransformerContext | None = None,
221
+ prng: np.random.Generator | None = None,
218
222
  ) -> circuits.AbstractCircuit:
219
223
  rng = np.random.default_rng() if prng is None else prng
220
224
  if context is None:
@@ -222,12 +226,12 @@ class GaugeTransformer:
222
226
  if context.deep:
223
227
  raise ValueError('GaugeTransformer cannot be used with deep=True')
224
228
  new_moments = []
225
- left: List[List[ops.Operation]] = []
226
- right: List[List[ops.Operation]] = []
229
+ left: list[list[ops.Operation]] = []
230
+ right: list[list[ops.Operation]] = []
227
231
  for moment in circuit:
228
232
  left.clear()
229
233
  right.clear()
230
- center: List[ops.Operation] = []
234
+ center: list[ops.Operation] = []
231
235
  for op in moment:
232
236
  if isinstance(op, ops.TaggedOperation) and set(op.tags).intersection(
233
237
  context.tags_to_ignore
@@ -254,9 +258,9 @@ class GaugeTransformer:
254
258
  circuit: circuits.AbstractCircuit,
255
259
  *,
256
260
  N: int,
257
- context: Optional[transformer_api.TransformerContext] = None,
258
- prng: Optional[np.random.Generator] = None,
259
- ) -> Tuple[circuits.AbstractCircuit, sweepable.Sweepable]:
261
+ context: transformer_api.TransformerContext | None = None,
262
+ prng: np.random.Generator | None = None,
263
+ ) -> tuple[circuits.AbstractCircuit, cirq.Sweepable]:
260
264
  """Generates a parameterized circuit with *N* sets of sweepable parameters.
261
265
 
262
266
  Args:
@@ -272,31 +276,31 @@ class GaugeTransformer:
272
276
  context = transformer_api.TransformerContext(deep=False)
273
277
  if context.deep:
274
278
  raise ValueError('GaugeTransformer cannot be used with deep=True')
275
- new_moments: List[List[ops.Operation]] = [] # Store parameterized circuits.
279
+ new_moments: list[list[ops.Operation]] = [] # Store parameterized circuits.
276
280
  phxz_sid = itertools.count()
277
281
  two_qubit_gate_sid = itertools.count()
278
282
  # Map from "((pre|post),$qid,$moment_id)" to gate parameters.
279
283
  # E.g., {(post,q1,2): {"x_exponent": "x1", "z_exponent": "z1", "axis_phase": "a1"}}
280
- phxz_symbols_by_locs: Dict[Tuple[str, ops.Qid, int], Dict[str, sympy.Symbol]] = {}
284
+ phxz_symbols_by_locs: dict[tuple[str, ops.Qid, int], dict[str, sympy.Symbol]] = {}
281
285
  # Map from "($q0,$q1,$moment_id)" to gate parameters.
282
286
  # E.g., {(q0,q1,0): ["s0"]}.
283
- two_qubit_gate_symbols_by_locs: Dict[Tuple[ops.Qid, ops.Qid, int], List[sympy.Symbol]] = {}
287
+ two_qubit_gate_symbols_by_locs: dict[tuple[ops.Qid, ops.Qid, int], list[sympy.Symbol]] = {}
284
288
 
285
- def single_qubit_next_symbol() -> Dict[str, sympy.Symbol]:
289
+ def single_qubit_next_symbol() -> dict[str, sympy.Symbol]:
286
290
  sid = next(phxz_sid)
287
291
  return _parameterize_to_phxz(sid)
288
292
 
289
- def two_qubit_gate_next_symbol_list(n: int) -> List[sympy.Symbol]:
293
+ def two_qubit_gate_next_symbol_list(n: int) -> list[sympy.Symbol]:
290
294
  """Returns symbols for 2 qubit gate parameterization."""
291
295
  sid = next(two_qubit_gate_sid)
292
- symbols: List[sympy.Symbol] = [sympy.Symbol(f"s{sid}_{sub}") for sub in range(n)]
296
+ symbols: list[sympy.Symbol] = [sympy.Symbol(f"s{sid}_{sub}") for sub in range(n)]
293
297
  return symbols
294
298
 
295
299
  # Build parameterized circuit.
296
300
  for moment_id, moment in enumerate(circuit):
297
- center_moment: List[ops.Operation] = []
298
- left_moment: List[ops.Operation] = []
299
- right_moment: List[ops.Operation] = []
301
+ center_moment: list[ops.Operation] = []
302
+ left_moment: list[ops.Operation] = []
303
+ right_moment: list[ops.Operation] = []
300
304
  for op in moment:
301
305
  if isinstance(op, ops.TaggedOperation) and set(op.tags).intersection(
302
306
  context.tags_to_ignore
@@ -338,7 +342,7 @@ class GaugeTransformer:
338
342
  )
339
343
 
340
344
  # Initialize the map from symbol names to their N values.
341
- values_by_params: Dict[str, List[float]] = {
345
+ values_by_params: dict[str, list[float]] = {
342
346
  **{
343
347
  str(symbol): []
344
348
  for symbols_by_names in phxz_symbols_by_locs.values()
@@ -385,14 +389,14 @@ class GaugeTransformer:
385
389
  for key, value in phxz_params.items():
386
390
  values_by_params[key].append(float(value))
387
391
 
388
- sweeps: List[Points] = [
392
+ sweeps: list[Points] = [
389
393
  Points(key=key, points=values) for key, values in values_by_params.items()
390
394
  ]
391
395
 
392
396
  return circuits.Circuit.from_moments(*new_moments), Zip(*sweeps)
393
397
 
394
398
 
395
- def _build_moments(operation_by_qubits: List[List[ops.Operation]]) -> List[List[ops.Operation]]:
399
+ def _build_moments(operation_by_qubits: list[list[ops.Operation]]) -> list[list[ops.Operation]]:
396
400
  """Builds moments from a list of operations grouped by qubits.
397
401
 
398
402
  Returns a list of moments from a list whose ith element is a list of operations applied
@@ -404,7 +408,7 @@ def _build_moments(operation_by_qubits: List[List[ops.Operation]]) -> List[List[
404
408
  return moments
405
409
 
406
410
 
407
- def _parameterize_to_phxz(symbol_id: int) -> Dict[str, sympy.Symbol]:
411
+ def _parameterize_to_phxz(symbol_id: int) -> dict[str, sympy.Symbol]:
408
412
  """Returns symbolized parameters for the gate."""
409
413
 
410
414
  # Parameterize single qubit gate to parameterized PhasedXZGate.
@@ -417,8 +421,8 @@ def _parameterize_to_phxz(symbol_id: int) -> Dict[str, sympy.Symbol]:
417
421
 
418
422
 
419
423
  def _gate_sequence_to_phxz_params(
420
- gates: Tuple[ops.Gate, ...], xza_by_symbols: Dict[str, sympy.Symbol]
421
- ) -> Dict[str, float]:
424
+ gates: tuple[ops.Gate, ...], xza_by_symbols: dict[str, sympy.Symbol]
425
+ ) -> dict[str, float]:
422
426
  identity_gate_in_phxz = {
423
427
  str(xza_by_symbols["x_exponent"]): 0.0,
424
428
  str(xza_by_symbols["z_exponent"]): 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
  import unittest.mock
16
18
 
17
19
  import numpy as np
@@ -12,6 +12,7 @@
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
  from unittest.mock import patch
17
18
 
@@ -12,13 +12,17 @@
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
- import numpy as np
17
+ from typing import TYPE_CHECKING
17
18
 
18
19
  import cirq
19
20
  from cirq.transformers import ConstantGauge, GaugeSelector, GaugeTransformer
20
21
  from cirq.transformers.gauge_compiling.gauge_compiling_test_utils import GaugeTester
21
22
 
23
+ if TYPE_CHECKING:
24
+ import numpy as np
25
+
22
26
 
23
27
  class ExampleGate(cirq.testing.TwoQubitGate):
24
28
  unitary = cirq.unitary(cirq.CZ**0.123)
@@ -14,6 +14,8 @@
14
14
 
15
15
  """A Gauge transformer for ISWAP gate."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import numpy as np
18
20
 
19
21
  from cirq import ops
@@ -12,6 +12,7 @@
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 cirq
17
18
  from cirq.transformers.gauge_compiling import ISWAPGaugeTransformer
@@ -14,6 +14,8 @@
14
14
 
15
15
  """The spin inversion gauge transformer."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  from cirq import ops
18
20
  from cirq.transformers.gauge_compiling.gauge_compiling import (
19
21
  GaugeSelector,
@@ -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
  from cirq.transformers.gauge_compiling import SpinInversionGaugeTransformer
17
19
  from cirq.transformers.gauge_compiling.gauge_compiling_test_utils import GaugeTester
@@ -14,12 +14,10 @@
14
14
 
15
15
  """A Gauge transformer for CZ**0.5 and CZ**-0.5 gates."""
16
16
 
17
+ from __future__ import annotations
17
18
 
18
19
  from numbers import Real
19
- from typing import Dict, Sequence, Tuple, TYPE_CHECKING
20
-
21
- import numpy as np
22
- import sympy
20
+ from typing import Sequence, TYPE_CHECKING
23
21
 
24
22
  from cirq.ops import CZ, CZPowGate, Gate, Gateset, S, X
25
23
  from cirq.transformers.gauge_compiling.gauge_compiling import (
@@ -31,6 +29,9 @@ from cirq.transformers.gauge_compiling.gauge_compiling import (
31
29
  )
32
30
 
33
31
  if TYPE_CHECKING:
32
+ import numpy as np
33
+ import sympy
34
+
34
35
  import cirq
35
36
 
36
37
  _SQRT_CZ = CZ**0.5
@@ -42,7 +43,7 @@ class SqrtCZGauge(Gauge):
42
43
  def weight(self) -> float:
43
44
  return 3.0
44
45
 
45
- def sample(self, gate: 'cirq.Gate', prng: np.random.Generator) -> ConstantGauge:
46
+ def sample(self, gate: cirq.Gate, prng: np.random.Generator) -> ConstantGauge:
46
47
  if prng.choice([True, False]):
47
48
  return ConstantGauge(two_qubit_gate=gate)
48
49
  swap_qubits = prng.choice([True, False])
@@ -65,7 +66,7 @@ class SqrtCZGauge(Gauge):
65
66
 
66
67
  def _symbolize_as_cz_pow(
67
68
  two_qubit_gate: Gate, symbols: Sequence[sympy.Symbol]
68
- ) -> Tuple[Gate, Dict[str, Real]]:
69
+ ) -> tuple[Gate, dict[str, Real]]:
69
70
  """Symbolizes a CZPowGate to a parameterized CZPowGate."""
70
71
 
71
72
  if not isinstance(two_qubit_gate, CZPowGate) or not isinstance(two_qubit_gate.exponent, Real):
@@ -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
  from cirq.transformers.gauge_compiling import SqrtCZGaugeTransformer
17
19
  from cirq.transformers.gauge_compiling.gauge_compiling_test_utils import GaugeTester
@@ -14,6 +14,8 @@
14
14
 
15
15
  """A Gauge transformer for SQRT_ISWAP gate."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import numpy as np
18
20
 
19
21
  from cirq import ops
@@ -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
  from cirq.transformers.gauge_compiling import SqrtISWAPGaugeTransformer
17
19
  from cirq.transformers.gauge_compiling.gauge_compiling_test_utils import GaugeTester
@@ -1,12 +1,15 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import itertools
3
- from typing import Optional, Sequence, Union
6
+ from typing import Sequence
4
7
 
5
8
  import numpy as np
6
9
 
7
10
  from cirq.value import random_state
8
11
 
9
- _RealArraylike = Union[np.ndarray, float]
12
+ _RealArraylike = np.ndarray | float
10
13
 
11
14
 
12
15
  def _single_qubit_unitary(
@@ -45,7 +48,7 @@ def _single_qubit_unitary(
45
48
  def random_qubit_unitary(
46
49
  shape: Sequence[int] = (),
47
50
  randomize_global_phase: bool = False,
48
- rng: Optional[np.random.RandomState] = None,
51
+ rng: np.random.RandomState | None = None,
49
52
  ) -> np.ndarray:
50
53
  """Random qubit unitary distributed over the Haar measure.
51
54
 
@@ -1,4 +1,7 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import numpy as np
3
6
  import pytest
4
7
 
@@ -14,9 +14,12 @@
14
14
 
15
15
  """Attempt to tabulate single qubit gates required to generate a target 2Q gate
16
16
  with a product A k A."""
17
+
18
+ from __future__ import annotations
19
+
17
20
  from dataclasses import dataclass
18
21
  from functools import reduce
19
- from typing import List, NamedTuple, Sequence, Tuple
22
+ from typing import NamedTuple, Sequence
20
23
 
21
24
  import numpy as np
22
25
 
@@ -31,7 +34,7 @@ from cirq.transformers.heuristic_decompositions.gate_tabulation_math_utils impor
31
34
  weyl_chamber_mesh,
32
35
  )
33
36
 
34
- _SingleQubitGatePair = Tuple[np.ndarray, np.ndarray]
37
+ _SingleQubitGatePair = tuple[np.ndarray, np.ndarray]
35
38
 
36
39
 
37
40
  class TwoQubitGateTabulationResult(NamedTuple):
@@ -58,7 +61,7 @@ class TwoQubitGateTabulationResult(NamedTuple):
58
61
 
59
62
  base_gate_unitary: np.ndarray
60
63
  target_gate: np.ndarray
61
- local_unitaries: Tuple[_SingleQubitGatePair, ...]
64
+ local_unitaries: tuple[_SingleQubitGatePair, ...]
62
65
  actual_gate: np.ndarray
63
66
  success: bool
64
67
 
@@ -79,7 +82,7 @@ class TwoQubitGateTabulation:
79
82
  summary: str # Text summarizing the results of the tabulation procedure.
80
83
  # Any KAK vectors which are expected to be compilable (within infidelity
81
84
  # max_expected_infidelity) using 2 or 3 base gates.
82
- missed_points: Tuple[np.ndarray, ...]
85
+ missed_points: tuple[np.ndarray, ...]
83
86
 
84
87
  def compile_two_qubit_gate(self, unitary: np.ndarray) -> TwoQubitGateTabulationResult:
85
88
  r"""Compute single qubit gates required to compile a desired unitary.
@@ -198,7 +201,7 @@ class TwoQubitGateTabulation:
198
201
 
199
202
  def _outer_locals_for_unitary(
200
203
  target: np.ndarray, base: np.ndarray
201
- ) -> Tuple[_SingleQubitGatePair, _SingleQubitGatePair, np.ndarray]:
204
+ ) -> tuple[_SingleQubitGatePair, _SingleQubitGatePair, np.ndarray]:
202
205
  """Local unitaries mapping between locally equivalent 2-local unitaries.
203
206
 
204
207
  Finds the left and right 1-local unitaries kL, kR such that
@@ -243,10 +246,10 @@ def _outer_locals_for_unitary(
243
246
 
244
247
  class _TabulationStepResult(NamedTuple):
245
248
  # Generated KAK vectors that are uniquely close to at least one mesh point.
246
- kept_kaks: List[np.ndarray]
249
+ kept_kaks: list[np.ndarray]
247
250
  # The corresponding single qubit unitaries required to obtain the desired
248
251
  # KAK vectors.
249
- kept_cycles: List[Tuple[_SingleQubitGatePair, ...]]
252
+ kept_cycles: list[tuple[_SingleQubitGatePair, ...]]
250
253
 
251
254
 
252
255
  def _tabulate_kak_vectors(
@@ -316,7 +319,7 @@ def two_qubit_gate_product_tabulation(
316
319
  *,
317
320
  sample_scaling: int = 50,
318
321
  allow_missed_points: bool = True,
319
- random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
322
+ random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
320
323
  ) -> TwoQubitGateTabulation:
321
324
  r"""Generate a TwoQubitGateTabulation for a base two qubit unitary.
322
325
 
@@ -358,7 +361,7 @@ def two_qubit_gate_product_tabulation(
358
361
 
359
362
  # include the base gate itself
360
363
  kak_vecs = [cirq.kak_vector(base_gate, check_preconditions=False)]
361
- sq_cycles: List[Tuple[_SingleQubitGatePair, ...]] = [()]
364
+ sq_cycles: list[tuple[_SingleQubitGatePair, ...]] = [()]
362
365
 
363
366
  # Tabulate gates that are close to gates in the mesh
364
367
  u_locals_0 = random_qubit_unitary((num_samples,), rng=rng)
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
 
@@ -41,7 +43,7 @@ _random_2Q_unitaries = np.array([random_special_unitary(4, random_state=_rng) fo
41
43
 
42
44
  @pytest.mark.parametrize('tabulation', [sycamore_tabulation, sqrt_iswap_tabulation])
43
45
  @pytest.mark.parametrize('target', _random_2Q_unitaries)
44
- def test_gate_compilation_matches_expected_max_infidelity(tabulation, target):
46
+ def test_gate_compilation_matches_expected_max_infidelity(tabulation, target) -> None:
45
47
  result = tabulation.compile_two_qubit_gate(target)
46
48
 
47
49
  assert result.success
@@ -50,7 +52,7 @@ def test_gate_compilation_matches_expected_max_infidelity(tabulation, target):
50
52
 
51
53
 
52
54
  @pytest.mark.parametrize('tabulation', [sycamore_tabulation, sqrt_iswap_tabulation])
53
- def test_gate_compilation_on_base_gate_standard(tabulation):
55
+ def test_gate_compilation_on_base_gate_standard(tabulation) -> None:
54
56
  base_gate = tabulation.base_gate
55
57
 
56
58
  result = tabulation.compile_two_qubit_gate(base_gate)
@@ -61,7 +63,7 @@ def test_gate_compilation_on_base_gate_standard(tabulation):
61
63
  assert fidelity > 0.99999
62
64
 
63
65
 
64
- def test_gate_compilation_on_base_gate_identity():
66
+ def test_gate_compilation_on_base_gate_identity() -> None:
65
67
  tabulation = two_qubit_gate_product_tabulation(np.eye(4), 0.25)
66
68
  base_gate = tabulation.base_gate
67
69
 
@@ -73,7 +75,7 @@ def test_gate_compilation_on_base_gate_identity():
73
75
  assert fidelity > 0.99999
74
76
 
75
77
 
76
- def test_gate_compilation_missing_points_raises_error():
78
+ def test_gate_compilation_missing_points_raises_error() -> None:
77
79
  with pytest.raises(ValueError, match='Failed to tabulate a'):
78
80
  two_qubit_gate_product_tabulation(
79
81
  np.eye(4), 0.4, allow_missed_points=False, random_state=_rng
@@ -81,7 +83,7 @@ def test_gate_compilation_missing_points_raises_error():
81
83
 
82
84
 
83
85
  @pytest.mark.parametrize('seed', [0, 1])
84
- def test_sycamore_gate_tabulation(seed):
86
+ def test_sycamore_gate_tabulation(seed) -> None:
85
87
  base_gate = cirq.unitary(cirq.FSimGate(np.pi / 2, np.pi / 6))
86
88
  tab = two_qubit_gate_product_tabulation(
87
89
  base_gate, 0.1, sample_scaling=2, random_state=np.random.RandomState(seed)
@@ -90,7 +92,7 @@ def test_sycamore_gate_tabulation(seed):
90
92
  assert result.success
91
93
 
92
94
 
93
- def test_sycamore_gate_tabulation_repr():
95
+ def test_sycamore_gate_tabulation_repr() -> None:
94
96
  simple_tabulation = TwoQubitGateTabulation(
95
97
  np.array([[(1 + 0j), 0j, 0j, 0j]], dtype=np.complex128),
96
98
  np.array([[(1 + 0j), 0j, 0j, 0j]], dtype=np.complex128),
@@ -102,7 +104,7 @@ def test_sycamore_gate_tabulation_repr():
102
104
  assert_equivalent_repr(simple_tabulation)
103
105
 
104
106
 
105
- def test_sycamore_gate_tabulation_eq():
107
+ def test_sycamore_gate_tabulation_eq() -> None:
106
108
  assert sycamore_tabulation == sycamore_tabulation
107
109
  assert sycamore_tabulation != sqrt_iswap_tabulation
108
110
  assert sycamore_tabulation != 1
@@ -14,7 +14,9 @@
14
14
 
15
15
  """Transformer that sorts commuting operations in increasing order of their `.qubits` tuple."""
16
16
 
17
- from typing import Dict, List, Optional, TYPE_CHECKING
17
+ from __future__ import annotations
18
+
19
+ from typing import TYPE_CHECKING
18
20
 
19
21
  from cirq import circuits, protocols
20
22
  from cirq.transformers import transformer_api
@@ -25,8 +27,8 @@ if TYPE_CHECKING:
25
27
 
26
28
  @transformer_api.transformer(add_deep_support=True)
27
29
  def insertion_sort_transformer(
28
- circuit: 'cirq.AbstractCircuit', *, context: Optional['cirq.TransformerContext'] = None
29
- ) -> 'cirq.Circuit':
30
+ circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
31
+ ) -> cirq.Circuit:
30
32
  """Sorts the operations using their sorted `.qubits` property as comparison key.
31
33
 
32
34
  Operations are swapped only if they commute.
@@ -35,11 +37,11 @@ def insertion_sort_transformer(
35
37
  circuit: input circuit.
36
38
  context: optional TransformerContext (not used),
37
39
  """
38
- final_operations: List['cirq.Operation'] = []
39
- qubit_index: Dict['cirq.Qid', int] = {
40
+ final_operations: list[cirq.Operation] = []
41
+ qubit_index: dict[cirq.Qid, int] = {
40
42
  q: idx for idx, q in enumerate(sorted(circuit.all_qubits()))
41
43
  }
42
- cached_qubit_indices: Dict[int, List[int]] = {}
44
+ cached_qubit_indices: dict[int, list[int]] = {}
43
45
  for pos, op in enumerate(circuit.all_operations()):
44
46
  # here `pos` is at the append position of final_operations
45
47
  if (op_qubit_indices := cached_qubit_indices.get(id(op))) is None:
@@ -12,11 +12,13 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import cirq
16
18
  import cirq.transformers
17
19
 
18
20
 
19
- def test_insertion_sort():
21
+ def test_insertion_sort() -> None:
20
22
  c = cirq.Circuit(
21
23
  cirq.CZ(cirq.q(2), cirq.q(1)),
22
24
  cirq.CZ(cirq.q(2), cirq.q(4)),