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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
  import sympy
@@ -21,11 +23,11 @@ import cirq
21
23
 
22
24
 
23
25
  @pytest.mark.parametrize('eigen_gate_type', [cirq.ISwapPowGate, cirq.SwapPowGate])
24
- def test_phase_sensitive_eigen_gates_consistent_protocols(eigen_gate_type):
26
+ def test_phase_sensitive_eigen_gates_consistent_protocols(eigen_gate_type) -> None:
25
27
  cirq.testing.assert_eigengate_implements_consistent_protocols(eigen_gate_type)
26
28
 
27
29
 
28
- def test_interchangeable_qubit_eq():
30
+ def test_interchangeable_qubit_eq() -> None:
29
31
  a = cirq.NamedQubit('a')
30
32
  b = cirq.NamedQubit('b')
31
33
  c = cirq.NamedQubit('c')
@@ -44,7 +46,7 @@ def test_interchangeable_qubit_eq():
44
46
  eq.add_equality_group(cirq.ISWAP(a, c) ** 0.3)
45
47
 
46
48
 
47
- def test_text_diagrams():
49
+ def test_text_diagrams() -> None:
48
50
  a = cirq.NamedQubit('a')
49
51
  b = cirq.NamedQubit('b')
50
52
  circuit = cirq.Circuit(cirq.SWAP(a, b), cirq.ISWAP(a, b) ** -1)
@@ -69,14 +71,14 @@ b: ---Swap---iSwap^-1---
69
71
  )
70
72
 
71
73
 
72
- def test_swap_has_stabilizer_effect():
74
+ def test_swap_has_stabilizer_effect() -> None:
73
75
  assert cirq.has_stabilizer_effect(cirq.SWAP)
74
76
  assert cirq.has_stabilizer_effect(cirq.SWAP**2)
75
77
  assert not cirq.has_stabilizer_effect(cirq.SWAP**0.5)
76
78
  assert not cirq.has_stabilizer_effect(cirq.SWAP ** sympy.Symbol('foo'))
77
79
 
78
80
 
79
- def test_swap_unitary():
81
+ def test_swap_unitary() -> None:
80
82
  # yapf: disable
81
83
  np.testing.assert_almost_equal(
82
84
  cirq.unitary(cirq.SWAP**0.5),
@@ -89,7 +91,7 @@ def test_swap_unitary():
89
91
  # yapf: enable
90
92
 
91
93
 
92
- def test_iswap_unitary():
94
+ def test_iswap_unitary() -> None:
93
95
  # yapf: disable
94
96
  cirq.testing.assert_allclose_up_to_global_phase(
95
97
  cirq.unitary(cirq.ISWAP),
@@ -103,7 +105,7 @@ def test_iswap_unitary():
103
105
  # yapf: enable
104
106
 
105
107
 
106
- def test_iswap_inv_unitary():
108
+ def test_iswap_inv_unitary() -> None:
107
109
  # yapf: disable
108
110
  cirq.testing.assert_allclose_up_to_global_phase(
109
111
  cirq.unitary(cirq.ISWAP_INV),
@@ -117,7 +119,7 @@ def test_iswap_inv_unitary():
117
119
  # yapf: enable
118
120
 
119
121
 
120
- def test_sqrt_iswap_unitary():
122
+ def test_sqrt_iswap_unitary() -> None:
121
123
  # yapf: disable
122
124
  cirq.testing.assert_allclose_up_to_global_phase(
123
125
  cirq.unitary(cirq.SQRT_ISWAP),
@@ -131,7 +133,7 @@ def test_sqrt_iswap_unitary():
131
133
  # yapf: enable
132
134
 
133
135
 
134
- def test_sqrt_iswap_inv_unitary():
136
+ def test_sqrt_iswap_inv_unitary() -> None:
135
137
  # yapf: disable
136
138
  cirq.testing.assert_allclose_up_to_global_phase(
137
139
  cirq.unitary(cirq.SQRT_ISWAP_INV),
@@ -145,7 +147,7 @@ def test_sqrt_iswap_inv_unitary():
145
147
  # yapf: enable
146
148
 
147
149
 
148
- def test_repr():
150
+ def test_repr() -> None:
149
151
  assert repr(cirq.SWAP) == 'cirq.SWAP'
150
152
  assert repr(cirq.SWAP**0.5) == '(cirq.SWAP**0.5)'
151
153
 
@@ -156,7 +158,7 @@ def test_repr():
156
158
  assert repr(cirq.ISWAP_INV**0.5) == '(cirq.ISWAP**-0.5)'
157
159
 
158
160
 
159
- def test_str():
161
+ def test_str() -> None:
160
162
  assert str(cirq.SWAP) == 'SWAP'
161
163
  assert str(cirq.SWAP**0.5) == 'SWAP**0.5'
162
164
 
@@ -167,7 +169,7 @@ def test_str():
167
169
  assert str(cirq.ISWAP_INV**0.5) == 'ISWAP**-0.5'
168
170
 
169
171
 
170
- def test_iswap_decompose_diagram():
172
+ def test_iswap_decompose_diagram() -> None:
171
173
  a = cirq.NamedQubit('a')
172
174
  b = cirq.NamedQubit('b')
173
175
 
@@ -182,7 +184,7 @@ b: ───X───────@───────@───────
182
184
  )
183
185
 
184
186
 
185
- def test_trace_distance():
187
+ def test_trace_distance() -> None:
186
188
  foo = sympy.Symbol('foo')
187
189
  sswap = cirq.SWAP**foo
188
190
  siswap = cirq.ISWAP**foo
@@ -194,14 +196,14 @@ def test_trace_distance():
194
196
  assert cirq.approx_eq(cirq.trace_distance_bound(cirq.ISWAP**0), 0.0)
195
197
 
196
198
 
197
- def test_trace_distance_over_range_of_exponents():
199
+ def test_trace_distance_over_range_of_exponents() -> None:
198
200
  for exp in np.linspace(0, 4, 20):
199
201
  cirq.testing.assert_has_consistent_trace_distance_bound(cirq.SWAP**exp)
200
202
  cirq.testing.assert_has_consistent_trace_distance_bound(cirq.ISWAP**exp)
201
203
 
202
204
 
203
205
  @pytest.mark.parametrize('angle_rads', (-np.pi, -np.pi / 3, -0.1, np.pi / 5))
204
- def test_riswap_unitary(angle_rads):
206
+ def test_riswap_unitary(angle_rads) -> None:
205
207
  actual = cirq.unitary(cirq.riswap(angle_rads))
206
208
  c = np.cos(angle_rads)
207
209
  s = 1j * np.sin(angle_rads)
@@ -215,7 +217,7 @@ def test_riswap_unitary(angle_rads):
215
217
 
216
218
 
217
219
  @pytest.mark.parametrize('angle_rads', (-2 * np.pi / 3, -0.2, 0.4, np.pi / 4))
218
- def test_riswap_hamiltonian(angle_rads):
220
+ def test_riswap_hamiltonian(angle_rads) -> None:
219
221
  actual = cirq.unitary(cirq.riswap(angle_rads))
220
222
  x = np.array([[0, 1], [1, 0]])
221
223
  y = np.array([[0, -1j], [1j, 0]])
@@ -226,5 +228,5 @@ def test_riswap_hamiltonian(angle_rads):
226
228
 
227
229
 
228
230
  @pytest.mark.parametrize('angle_rads', (-np.pi / 5, 0.4, 2, np.pi))
229
- def test_riswap_has_consistent_protocols(angle_rads):
231
+ def test_riswap_has_consistent_protocols(angle_rads) -> None:
230
232
  cirq.testing.assert_implements_consistent_protocols(cirq.riswap(angle_rads))
cirq/ops/tags.py CHANGED
@@ -11,8 +11,10 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
14
15
  """Canonical tags for the TaggedOperation class."""
15
- from typing import Dict
16
+
17
+ from __future__ import annotations
16
18
 
17
19
 
18
20
  class VirtualTag:
@@ -38,7 +40,7 @@ class VirtualTag:
38
40
  def __repr__(self) -> str:
39
41
  return 'cirq.VirtualTag()'
40
42
 
41
- def _json_dict_(self) -> Dict[str, str]:
43
+ def _json_dict_(self) -> dict[str, str]:
42
44
  return {}
43
45
 
44
46
  def __hash__(self):
@@ -61,7 +63,7 @@ class RoutingSwapTag:
61
63
  def __repr__(self) -> str:
62
64
  return 'cirq.RoutingSwapTag()'
63
65
 
64
- def _json_dict_(self) -> Dict[str, str]:
66
+ def _json_dict_(self) -> dict[str, str]:
65
67
  return {}
66
68
 
67
69
  def __hash__(self):
cirq/ops/tags_test.py CHANGED
@@ -12,10 +12,12 @@
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
 
17
19
 
18
- def test_virtual_tag():
20
+ def test_virtual_tag() -> None:
19
21
  tag1 = cirq.ops.VirtualTag()
20
22
  tag2 = cirq.ops.VirtualTag()
21
23
 
@@ -26,7 +28,7 @@ def test_virtual_tag():
26
28
  cirq.testing.assert_equivalent_repr(tag2)
27
29
 
28
30
 
29
- def test_routing_swap_tag():
31
+ def test_routing_swap_tag() -> None:
30
32
  tag1 = cirq.ops.RoutingSwapTag()
31
33
  tag2 = cirq.ops.RoutingSwapTag()
32
34
 
@@ -14,19 +14,9 @@
14
14
 
15
15
  """Common quantum gates that target three qubits."""
16
16
 
17
- from typing import (
18
- AbstractSet,
19
- Any,
20
- Collection,
21
- Dict,
22
- Iterator,
23
- List,
24
- Optional,
25
- Sequence,
26
- Tuple,
27
- TYPE_CHECKING,
28
- Union,
29
- )
17
+ from __future__ import annotations
18
+
19
+ from typing import AbstractSet, Any, Collection, Iterator, Sequence, TYPE_CHECKING
30
20
 
31
21
  import numpy as np
32
22
  import sympy
@@ -47,7 +37,6 @@ from cirq.ops import (
47
37
  )
48
38
 
49
39
  if TYPE_CHECKING:
50
- # pylint: disable=unused-import
51
40
  import cirq
52
41
 
53
42
 
@@ -70,10 +59,10 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
70
59
  $$
71
60
  """
72
61
 
73
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
62
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
74
63
  return [(0, np.diag([1, 1, 1, 1, 1, 1, 1, 0])), (1, np.diag([0, 0, 0, 0, 0, 0, 0, 1]))]
75
64
 
76
- def _trace_distance_bound_(self) -> Optional[float]:
65
+ def _trace_distance_bound_(self) -> float | None:
77
66
  if self._is_parameterized_():
78
67
  return None
79
68
  return abs(np.sin(self._exponent * 0.5 * np.pi))
@@ -117,19 +106,11 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
117
106
  elif not b.is_adjacent(c):
118
107
  a, b = b, a
119
108
 
120
- p = common_gates.T**self._exponent
109
+ exp = self._exponent
110
+ p = common_gates.T**exp
121
111
  sweep_abc = [common_gates.CNOT(a, b), common_gates.CNOT(b, c)]
122
- global_phase = 1j ** (2 * self.global_shift * self._exponent)
123
- global_phase = (
124
- complex(global_phase)
125
- if protocols.is_parameterized(global_phase) and global_phase.is_complex
126
- else global_phase
127
- )
128
- global_phase_operation = (
129
- [global_phase_op.global_phase_operation(global_phase)]
130
- if protocols.is_parameterized(global_phase) or abs(global_phase - 1.0) > 0
131
- else []
132
- )
112
+ global_phase_gate = global_phase_op.from_phase_and_exponent(self.global_shift, exp)
113
+ global_phase_operation = [] if global_phase_gate.is_identity() else [global_phase_gate()]
133
114
  return global_phase_operation + [
134
115
  p(a),
135
116
  p(b),
@@ -144,7 +125,7 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
144
125
  sweep_abc,
145
126
  ]
146
127
 
147
- def _apply_unitary_(self, args: 'protocols.ApplyUnitaryArgs') -> np.ndarray:
128
+ def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
148
129
  if protocols.is_parameterized(self):
149
130
  return NotImplemented
150
131
  ooo = args.subspace_index(0b111)
@@ -154,12 +135,10 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
154
135
  args.target_tensor *= p
155
136
  return args.target_tensor
156
137
 
157
- def _circuit_diagram_info_(
158
- self, args: 'cirq.CircuitDiagramInfoArgs'
159
- ) -> 'cirq.CircuitDiagramInfo':
138
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
160
139
  return protocols.CircuitDiagramInfo(('@', '@', '@'), exponent=self._diagram_exponent(args))
161
140
 
162
- def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
141
+ def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
163
142
  if self._exponent != 1:
164
143
  return None
165
144
 
@@ -191,11 +170,9 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
191
170
 
192
171
  def controlled(
193
172
  self,
194
- num_controls: Optional[int] = None,
195
- control_values: Optional[
196
- Union[cv.AbstractControlValues, Sequence[Union[int, Collection[int]]]]
197
- ] = None,
198
- control_qid_shape: Optional[Tuple[int, ...]] = None,
173
+ num_controls: int | None = None,
174
+ control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
175
+ control_qid_shape: tuple[int, ...] | None = None,
199
176
  ) -> raw_types.Gate:
200
177
  """Returns a controlled `ZPowGate` with two additional controls.
201
178
 
@@ -206,7 +183,7 @@ class CCZPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
206
183
  """
207
184
  if num_controls == 0:
208
185
  return self
209
- sub_gate: 'cirq.Gate' = self
186
+ sub_gate: cirq.Gate = self
210
187
  if self._global_shift == 0:
211
188
  sub_gate = controlled_gate.ControlledGate(
212
189
  common_gates.ZPowGate(exponent=self._exponent), num_controls=2
@@ -238,10 +215,10 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
238
215
  If these values are $(x_0, x_1, \ldots , x_7)$ then the unitary
239
216
  has diagonal values $(e^{i x_0}, e^{i x_1}, \ldots, e^{i x_7})$.
240
217
  """
241
- self._diag_angles_radians: Tuple[value.TParamVal, ...] = tuple(diag_angles_radians)
218
+ self._diag_angles_radians: tuple[value.TParamVal, ...] = tuple(diag_angles_radians)
242
219
 
243
220
  @property
244
- def diag_angles_radians(self) -> Tuple[value.TParamVal, ...]:
221
+ def diag_angles_radians(self) -> tuple[value.TParamVal, ...]:
245
222
  return self._diag_angles_radians
246
223
 
247
224
  def _is_parameterized_(self) -> bool:
@@ -253,8 +230,8 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
253
230
  }
254
231
 
255
232
  def _resolve_parameters_(
256
- self, resolver: 'cirq.ParamResolver', recursive: bool
257
- ) -> 'ThreeQubitDiagonalGate':
233
+ self, resolver: cirq.ParamResolver, recursive: bool
234
+ ) -> ThreeQubitDiagonalGate:
258
235
  return self.__class__(
259
236
  [
260
237
  protocols.resolve_parameters(angle, resolver, recursive)
@@ -270,7 +247,7 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
270
247
  return NotImplemented
271
248
  return np.diag([np.exp(1j * angle) for angle in self._diag_angles_radians])
272
249
 
273
- def _apply_unitary_(self, args: 'protocols.ApplyUnitaryArgs') -> np.ndarray:
250
+ def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
274
251
  if self._is_parameterized_():
275
252
  return NotImplemented
276
253
  for index, angle in enumerate(self._diag_angles_radians):
@@ -279,16 +256,14 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
279
256
  args.target_tensor[subspace_index] *= np.exp(1j * angle)
280
257
  return args.target_tensor
281
258
 
282
- def _circuit_diagram_info_(
283
- self, args: 'cirq.CircuitDiagramInfoArgs'
284
- ) -> 'cirq.CircuitDiagramInfo':
259
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
285
260
  rounded_angles = np.array(self._diag_angles_radians)
286
261
  if args.precision is not None:
287
262
  rounded_angles = rounded_angles.round(args.precision)
288
263
  diag_str = f"diag({', '.join(proper_repr(angle) for angle in rounded_angles)})"
289
264
  return protocols.CircuitDiagramInfo((diag_str, '#2', '#3'))
290
265
 
291
- def __pow__(self, exponent: Any) -> 'ThreeQubitDiagonalGate':
266
+ def __pow__(self, exponent: Any) -> ThreeQubitDiagonalGate:
292
267
  if not isinstance(exponent, (int, float, sympy.Basic)):
293
268
  return NotImplemented
294
269
  return ThreeQubitDiagonalGate(
@@ -382,7 +357,7 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
382
357
  }
383
358
  )
384
359
 
385
- def _json_dict_(self) -> Dict[str, Any]:
360
+ def _json_dict_(self) -> dict[str, Any]:
386
361
  return protocols.obj_to_dict_helper(self, attribute_names=["diag_angles_radians"])
387
362
 
388
363
  def __repr__(self) -> str:
@@ -413,7 +388,7 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
413
388
  $$
414
389
  """
415
390
 
416
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
391
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
417
392
  return [
418
393
  (0, linalg.block_diag(np.diag([1, 1, 1, 1, 1, 1]), np.array([[0.5, 0.5], [0.5, 0.5]]))),
419
394
  (
@@ -424,7 +399,7 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
424
399
  ),
425
400
  ]
426
401
 
427
- def _trace_distance_bound_(self) -> Optional[float]:
402
+ def _trace_distance_bound_(self) -> float | None:
428
403
  if self._is_parameterized_():
429
404
  return None
430
405
  return abs(np.sin(self._exponent * 0.5 * np.pi))
@@ -451,7 +426,7 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
451
426
  def qubit_index_to_equivalence_group_key(self, index):
452
427
  return index < 2
453
428
 
454
- def _apply_unitary_(self, args: 'protocols.ApplyUnitaryArgs') -> np.ndarray:
429
+ def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
455
430
  if protocols.is_parameterized(self):
456
431
  return NotImplemented
457
432
  p = 1j ** (2 * self._exponent * self._global_shift)
@@ -471,14 +446,12 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
471
446
  yield CCZPowGate(exponent=self._exponent, global_shift=self.global_shift).on(c1, c2, t)
472
447
  yield common_gates.H(t)
473
448
 
474
- def _circuit_diagram_info_(
475
- self, args: 'cirq.CircuitDiagramInfoArgs'
476
- ) -> 'cirq.CircuitDiagramInfo':
449
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
477
450
  return protocols.CircuitDiagramInfo(
478
451
  ('@', '@', 'X'), exponent=self._diagram_exponent(args), exponent_qubit_index=2
479
452
  )
480
453
 
481
- def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
454
+ def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
482
455
  if self._exponent != 1:
483
456
  return None
484
457
 
@@ -505,11 +478,9 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
505
478
 
506
479
  def controlled(
507
480
  self,
508
- num_controls: Optional[int] = None,
509
- control_values: Optional[
510
- Union[cv.AbstractControlValues, Sequence[Union[int, Collection[int]]]]
511
- ] = None,
512
- control_qid_shape: Optional[Tuple[int, ...]] = None,
481
+ num_controls: int | None = None,
482
+ control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
483
+ control_qid_shape: tuple[int, ...] | None = None,
513
484
  ) -> raw_types.Gate:
514
485
  """Returns a controlled `XPowGate` with two additional controls.
515
486
 
@@ -520,7 +491,7 @@ class CCXPowGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
520
491
  """
521
492
  if num_controls == 0:
522
493
  return self
523
- sub_gate: 'cirq.Gate' = self
494
+ sub_gate: cirq.Gate = self
524
495
  if self._global_shift == 0:
525
496
  sub_gate = controlled_gate.ControlledGate(
526
497
  common_gates.XPowGate(exponent=self._exponent), num_controls=2
@@ -572,8 +543,8 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
572
543
  return self._decompose_outside_control(c, t1, t2)
573
544
 
574
545
  def _decompose_inside_control(
575
- self, target1: 'cirq.Qid', control: 'cirq.Qid', target2: 'cirq.Qid'
576
- ) -> Iterator['cirq.OP_TREE']:
546
+ self, target1: cirq.Qid, control: cirq.Qid, target2: cirq.Qid
547
+ ) -> Iterator[cirq.OP_TREE]:
577
548
  """A decomposition assuming the control separates the targets.
578
549
 
579
550
  target1: ─@─X───────T──────@────────@─────────X───@─────X^-0.5─
@@ -608,7 +579,7 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
608
579
  yield common_gates.S(c) ** -1
609
580
  yield pauli_gates.X(a) ** -0.5
610
581
 
611
- def _apply_unitary_(self, args: 'protocols.ApplyUnitaryArgs') -> np.ndarray:
582
+ def _apply_unitary_(self, args: protocols.ApplyUnitaryArgs) -> np.ndarray:
612
583
  return protocols.apply_unitary(
613
584
  controlled_gate.ControlledGate(swap_gates.SWAP),
614
585
  protocols.ApplyUnitaryArgs(args.target_tensor, args.available_buffer, args.axes),
@@ -616,8 +587,8 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
616
587
  )
617
588
 
618
589
  def _decompose_outside_control(
619
- self, control: 'cirq.Qid', near_target: 'cirq.Qid', far_target: 'cirq.Qid'
620
- ) -> Iterator['cirq.OP_TREE']:
590
+ self, control: cirq.Qid, near_target: cirq.Qid, far_target: cirq.Qid
591
+ ) -> Iterator[cirq.OP_TREE]:
621
592
  """A decomposition assuming one of the targets is in the middle.
622
593
 
623
594
  control: ───T──────@────────@───@────────────@────────────────
@@ -652,14 +623,12 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
652
623
  def _unitary_(self) -> np.ndarray:
653
624
  return linalg.block_diag(np.diag([1, 1, 1, 1, 1]), np.array([[0, 1], [1, 0]]), np.diag([1]))
654
625
 
655
- def _circuit_diagram_info_(
656
- self, args: 'cirq.CircuitDiagramInfoArgs'
657
- ) -> 'cirq.CircuitDiagramInfo':
626
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
658
627
  if not args.use_unicode_characters:
659
628
  return protocols.CircuitDiagramInfo(('@', 'swap', 'swap'))
660
629
  return protocols.CircuitDiagramInfo(('@', '×', '×'))
661
630
 
662
- def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
631
+ def _qasm_(self, args: cirq.QasmArgs, qubits: tuple[cirq.Qid, ...]) -> str | None:
663
632
  args.validate_version('2.0', '3.0')
664
633
  return args.format('cswap {0},{1},{2};\n', qubits[0], qubits[1], qubits[2])
665
634
 
@@ -682,11 +651,9 @@ class CSwapGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
682
651
 
683
652
  def controlled(
684
653
  self,
685
- num_controls: Optional[int] = None,
686
- control_values: Optional[
687
- Union[cv.AbstractControlValues, Sequence[Union[int, Collection[int]]]]
688
- ] = None,
689
- control_qid_shape: Optional[Tuple[int, ...]] = None,
654
+ num_controls: int | None = None,
655
+ control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
656
+ control_qid_shape: tuple[int, ...] | None = None,
690
657
  ) -> raw_types.Gate:
691
658
  """Returns a controlled `SWAP` with one additional control.
692
659
 
@@ -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 itertools
16
18
 
17
19
  import numpy as np
@@ -22,7 +24,7 @@ import cirq
22
24
 
23
25
 
24
26
  @pytest.mark.parametrize('eigen_gate_type', [cirq.CCXPowGate, cirq.CCZPowGate])
25
- def test_eigen_gates_consistent_protocols(eigen_gate_type):
27
+ def test_eigen_gates_consistent_protocols(eigen_gate_type) -> None:
26
28
  cirq.testing.assert_eigengate_implements_consistent_protocols(eigen_gate_type)
27
29
 
28
30
 
@@ -36,18 +38,18 @@ def test_eigen_gates_consistent_protocols(eigen_gate_type):
36
38
  (cirq.CCZ),
37
39
  ),
38
40
  )
39
- def test_consistent_protocols(gate):
41
+ def test_consistent_protocols(gate) -> None:
40
42
  cirq.testing.assert_implements_consistent_protocols(gate)
41
43
 
42
44
 
43
- def test_init():
45
+ def test_init() -> None:
44
46
  assert (cirq.CCZ**0.5).exponent == 0.5
45
47
  assert (cirq.CCZ**0.25).exponent == 0.25
46
48
  assert (cirq.CCX**0.5).exponent == 0.5
47
49
  assert (cirq.CCX**0.25).exponent == 0.25
48
50
 
49
51
 
50
- def test_unitary():
52
+ def test_unitary() -> None:
51
53
  assert cirq.has_unitary(cirq.CCX)
52
54
  np.testing.assert_allclose(
53
55
  cirq.unitary(cirq.CCX),
@@ -123,7 +125,7 @@ def test_unitary():
123
125
  )
124
126
 
125
127
 
126
- def test_str():
128
+ def test_str() -> None:
127
129
  assert str(cirq.CCX) == 'TOFFOLI'
128
130
  assert str(cirq.TOFFOLI) == 'TOFFOLI'
129
131
  assert str(cirq.CSWAP) == 'FREDKIN'
@@ -134,7 +136,7 @@ def test_str():
134
136
  assert str(cirq.CCZ**0.5) == 'CCZ**0.5'
135
137
 
136
138
 
137
- def test_repr():
139
+ def test_repr() -> None:
138
140
  assert repr(cirq.CCX) == 'cirq.TOFFOLI'
139
141
  assert repr(cirq.TOFFOLI) == 'cirq.TOFFOLI'
140
142
  assert repr(cirq.CSWAP) == 'cirq.FREDKIN'
@@ -145,7 +147,7 @@ def test_repr():
145
147
  assert repr(cirq.CCZ**0.5) == '(cirq.CCZ**0.5)'
146
148
 
147
149
 
148
- def test_eq():
150
+ def test_eq() -> None:
149
151
  a, b, c, d = cirq.LineQubit.range(4)
150
152
  eq = cirq.testing.EqualsTester()
151
153
  eq.add_equality_group(cirq.CCZ(a, b, c), cirq.CCZ(a, c, b), cirq.CCZ(b, c, a))
@@ -163,7 +165,7 @@ def test_eq():
163
165
  eq.add_equality_group(cirq.CSWAP(b, a, c), cirq.CSWAP(b, c, a))
164
166
 
165
167
 
166
- def test_gate_equality():
168
+ def test_gate_equality() -> None:
167
169
  eq = cirq.testing.EqualsTester()
168
170
  eq.add_equality_group(cirq.CSwapGate(), cirq.CSwapGate())
169
171
  eq.add_equality_group(cirq.CZPowGate(), cirq.CZPowGate())
@@ -171,7 +173,7 @@ def test_gate_equality():
171
173
  eq.add_equality_group(cirq.CCZPowGate(), cirq.CCZPowGate())
172
174
 
173
175
 
174
- def test_identity_multiplication():
176
+ def test_identity_multiplication() -> None:
175
177
  a, b, c = cirq.LineQubit.range(3)
176
178
  assert cirq.CCX(a, b, c) * cirq.I(a) == cirq.CCX(a, b, c)
177
179
  assert cirq.CCX(a, b, c) * cirq.I(b) == cirq.CCX(a, b, c)
@@ -197,7 +199,7 @@ def test_identity_multiplication():
197
199
  ),
198
200
  ],
199
201
  )
200
- def test_decomposition_cost(op: cirq.Operation, max_two_cost: int):
202
+ def test_decomposition_cost(op: cirq.Operation, max_two_cost: int) -> None:
201
203
  ops = tuple(cirq.flatten_op_tree(cirq.decompose(op)))
202
204
  two_cost = len([e for e in ops if len(e.qubits) == 2])
203
205
  over_cost = len([e for e in ops if len(e.qubits) > 2])
@@ -205,12 +207,12 @@ def test_decomposition_cost(op: cirq.Operation, max_two_cost: int):
205
207
  assert two_cost == max_two_cost
206
208
 
207
209
 
208
- def test_parameterized_ccz_decompose_no_global_phase():
210
+ def test_parameterized_ccz_decompose_no_global_phase() -> None:
209
211
  decomposed_ops = cirq.decompose(cirq.CCZ(*cirq.LineQubit.range(3)) ** sympy.Symbol("theta"))
210
212
  assert not any(isinstance(op.gate, cirq.GlobalPhaseGate) for op in decomposed_ops)
211
213
 
212
214
 
213
- def test_diagonal_gate_property():
215
+ def test_diagonal_gate_property() -> None:
214
216
  assert cirq.ThreeQubitDiagonalGate([2, 3, 5, 7, 0, 0, 0, 1]).diag_angles_radians == (
215
217
  (2, 3, 5, 7, 0, 0, 0, 1)
216
218
  )
@@ -220,7 +222,7 @@ def test_diagonal_gate_property():
220
222
  'gate',
221
223
  [cirq.CCX, cirq.CSWAP, cirq.CCZ, cirq.ThreeQubitDiagonalGate([2, 3, 5, 7, 11, 13, 17, 19])],
222
224
  )
223
- def test_decomposition_respects_locality(gate):
225
+ def test_decomposition_respects_locality(gate) -> None:
224
226
  a = cirq.GridQubit(0, 0)
225
227
  b = cirq.GridQubit(1, 0)
226
228
  c = cirq.GridQubit(0, 1)
@@ -231,7 +233,7 @@ def test_decomposition_respects_locality(gate):
231
233
  dev.validate_circuit(circuit)
232
234
 
233
235
 
234
- def test_diagram():
236
+ def test_diagram() -> None:
235
237
  a, b, c, d = cirq.LineQubit.range(4)
236
238
  circuit = cirq.Circuit(
237
239
  cirq.TOFFOLI(a, b, c),
@@ -295,7 +297,7 @@ def test_diagram():
295
297
  )
296
298
 
297
299
 
298
- def test_diagonal_exponent():
300
+ def test_diagonal_exponent() -> None:
299
301
  diagonal_angles = [2, 3, 5, 7, 11, 13, 17, 19]
300
302
  diagonal_gate = cirq.ThreeQubitDiagonalGate(diagonal_angles)
301
303
 
@@ -308,7 +310,7 @@ def test_diagonal_exponent():
308
310
 
309
311
 
310
312
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
311
- def test_resolve(resolve_fn):
313
+ def test_resolve(resolve_fn) -> None:
312
314
  diagonal_angles = [2, 3, 5, 7, 11, 13, 17, 19]
313
315
  diagonal_gate = cirq.ThreeQubitDiagonalGate(
314
316
  diagonal_angles[:6] + [sympy.Symbol('a'), sympy.Symbol('b')]
@@ -325,7 +327,7 @@ def test_resolve(resolve_fn):
325
327
 
326
328
 
327
329
  @pytest.mark.parametrize('gate', [cirq.CCX, cirq.CCZ, cirq.CSWAP])
328
- def test_controlled_ops_consistency(gate):
330
+ def test_controlled_ops_consistency(gate) -> None:
329
331
  a, b, c, d = cirq.LineQubit.range(4)
330
332
  assert gate.controlled(0) is gate
331
333
  assert gate(a, b, c).controlled_by(d) == gate(d, b, c).controlled_by(a)