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

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

Potentially problematic release.


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

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