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
@@ -11,21 +11,12 @@
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 json
15
18
  import urllib.parse
16
- from typing import (
17
- Any,
18
- cast,
19
- Dict,
20
- Iterable,
21
- List,
22
- Mapping,
23
- Optional,
24
- Sequence,
25
- Tuple,
26
- TYPE_CHECKING,
27
- Union,
28
- )
19
+ from typing import Any, cast, Iterable, Mapping, Sequence, TYPE_CHECKING
29
20
 
30
21
  import numpy as np
31
22
 
@@ -47,12 +38,10 @@ if TYPE_CHECKING:
47
38
  def quirk_url_to_circuit(
48
39
  quirk_url: str,
49
40
  *,
50
- qubits: Optional[Sequence['cirq.Qid']] = None,
51
- extra_cell_makers: Union[
52
- Dict[str, 'cirq.Gate'], Iterable['cirq.interop.quirk.cells.CellMaker']
53
- ] = (),
41
+ qubits: Sequence[cirq.Qid] | None = None,
42
+ extra_cell_makers: dict[str, cirq.Gate] | Iterable[cirq.interop.quirk.cells.CellMaker] = (),
54
43
  max_operation_count: int = 10**6,
55
- ) -> 'cirq.Circuit':
44
+ ) -> cirq.Circuit:
56
45
  """Parses a Cirq circuit out of a Quirk URL.
57
46
 
58
47
  Args:
@@ -150,13 +139,11 @@ def quirk_url_to_circuit(
150
139
  def quirk_json_to_circuit(
151
140
  data: dict,
152
141
  *,
153
- qubits: Optional[Sequence['cirq.Qid']] = None,
154
- extra_cell_makers: Union[
155
- Dict[str, 'cirq.Gate'], Iterable['cirq.interop.quirk.cells.CellMaker']
156
- ] = (),
157
- quirk_url: Optional[str] = None,
142
+ qubits: Sequence[cirq.Qid] | None = None,
143
+ extra_cell_makers: dict[str, cirq.Gate] | Iterable[cirq.interop.quirk.cells.CellMaker] = (),
144
+ quirk_url: str | None = None,
158
145
  max_operation_count: int = 10**6,
159
- ) -> 'cirq.Circuit':
146
+ ) -> cirq.Circuit:
160
147
  """Constructs a Cirq circuit from Quirk's JSON format.
161
148
 
162
149
  Args:
@@ -239,7 +226,7 @@ def quirk_json_to_circuit(
239
226
  if qubits is not None:
240
227
  qs = qubits
241
228
 
242
- def map_qubit(qubit: 'cirq.Qid') -> 'cirq.Qid':
229
+ def map_qubit(qubit: cirq.Qid) -> cirq.Qid:
243
230
  q = cast(devices.LineQubit, qubit)
244
231
  if q.x >= len(qs):
245
232
  raise IndexError(
@@ -255,9 +242,9 @@ def quirk_json_to_circuit(
255
242
 
256
243
 
257
244
  def _parse_cols_into_composite_cell(
258
- data: Dict[str, Any], registry: Dict[str, CellMaker]
245
+ data: dict[str, Any], registry: dict[str, CellMaker]
259
246
  ) -> CompositeCell:
260
- if not isinstance(data, Dict):
247
+ if not isinstance(data, dict):
261
248
  raise ValueError('Circuit JSON must be a dictionary.')
262
249
  if 'cols' not in data:
263
250
  raise ValueError(f'Circuit JSON dict must have a "cols" entry.\nJSON={data}')
@@ -266,7 +253,7 @@ def _parse_cols_into_composite_cell(
266
253
  raise ValueError(f'Circuit JSON cols must be a list.\nJSON={data}')
267
254
 
268
255
  # Parse column json into cells.
269
- parsed_cols: List[List[Optional[Cell]]] = []
256
+ parsed_cols: list[list[Cell | None]] = []
270
257
  height = 0
271
258
  for i, col in enumerate(cols):
272
259
  parsed_col, h = _parse_col_cells_with_height(registry, i, col)
@@ -300,8 +287,8 @@ def _parse_cols_into_composite_cell(
300
287
  return CompositeCell(height, parsed_cols, gate_count=gate_count)
301
288
 
302
289
 
303
- def _register_custom_gate(gate_json: Any, registry: Dict[str, CellMaker]):
304
- if not isinstance(gate_json, Dict):
290
+ def _register_custom_gate(gate_json: Any, registry: dict[str, CellMaker]):
291
+ if not isinstance(gate_json, dict):
305
292
  raise ValueError(f'Custom gate json must be a dictionary.\nCustom gate json={gate_json!r}.')
306
293
 
307
294
  if 'id' not in gate_json:
@@ -343,11 +330,11 @@ def _register_custom_gate(gate_json: Any, registry: Dict[str, CellMaker]):
343
330
  )
344
331
 
345
332
 
346
- def _init_ops(data: Dict[str, Any]) -> 'cirq.OP_TREE':
333
+ def _init_ops(data: dict[str, Any]) -> cirq.OP_TREE:
347
334
  if 'init' not in data:
348
335
  return []
349
336
  init = data['init']
350
- if not isinstance(init, List):
337
+ if not isinstance(init, list):
351
338
  raise ValueError(f'Circuit JSON init must be a list but was {init!r}.')
352
339
  init_ops = []
353
340
  for i in range(len(init)):
@@ -371,8 +358,8 @@ def _init_ops(data: Dict[str, Any]) -> 'cirq.OP_TREE':
371
358
 
372
359
 
373
360
  def _parse_col_cells_with_height(
374
- registry: Dict[str, CellMaker], col: int, col_data: Any
375
- ) -> Tuple[List[Optional[Cell]], int]:
361
+ registry: dict[str, CellMaker], col: int, col_data: Any
362
+ ) -> tuple[list[Cell | None], int]:
376
363
  if not isinstance(col_data, list):
377
364
  raise ValueError(f'col must be a list.\ncol: {col_data!r}')
378
365
  result = []
@@ -385,8 +372,8 @@ def _parse_col_cells_with_height(
385
372
 
386
373
 
387
374
  def _parse_cell_with_height(
388
- registry: Dict[str, CellMaker], row: int, col: int, entry: Any
389
- ) -> Tuple[Optional[Cell], int]:
375
+ registry: dict[str, CellMaker], row: int, col: int, entry: Any
376
+ ) -> tuple[Cell | None, int]:
390
377
  if entry == 1:
391
378
  return None, 0
392
379
 
@@ -11,6 +11,9 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import json
15
18
  import urllib
16
19
 
@@ -353,7 +356,7 @@ def test_example_qft_circuit():
353
356
  6: ───┼───×─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────@^0.016───@^0.031───@^(1/16)───@^(1/8)───@^0.25───@^0.5───H───┼─────────┼─────────┼─────────┼──────────┼─────────┼────────@───────────
354
357
  │ │ │ │ │ │ │ │
355
358
  7: ───×───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────@^0.008───@^0.016───@^0.031───@^(1/16)───@^(1/8)───@^0.25───@^0.5───H───
356
- """
359
+ """ # noqa: E501
357
360
 
358
361
  qft_example_json = (
359
362
  '{"cols":['
@@ -12,16 +12,18 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  """Methods for resolving JSON types during serialization."""
15
+
16
+ from __future__ import annotations
17
+
15
18
  import datetime
16
19
  import functools
17
- from typing import Dict, List, NamedTuple, Optional, Tuple, TYPE_CHECKING
18
-
19
- from cirq.protocols.json_serialization import ObjectFactory
20
+ from typing import NamedTuple, TYPE_CHECKING
20
21
 
21
22
  if TYPE_CHECKING:
22
23
  import cirq
23
24
  import cirq.devices.unconstrained_device
24
25
  import cirq.ops.pauli_gates
26
+ from cirq.protocols.json_serialization import ObjectFactory
25
27
 
26
28
 
27
29
  # Needed for backwards compatible named tuples of CrossEntropyResult
@@ -30,23 +32,23 @@ SpecklePurityPair = NamedTuple('SpecklePurityPair', [('num_cycle', int), ('purit
30
32
  CrossEntropyResult = NamedTuple(
31
33
  'CrossEntropyResult',
32
34
  [
33
- ('data', List[CrossEntropyPair]),
35
+ ('data', list[CrossEntropyPair]),
34
36
  ('repetitions', int),
35
- ('purity_data', Optional[List[SpecklePurityPair]]),
37
+ ('purity_data', list[SpecklePurityPair] | None),
36
38
  ],
37
39
  )
38
40
  CrossEntropyResultDict = NamedTuple(
39
- 'CrossEntropyResultDict', [('results', Dict[Tuple['cirq.Qid', ...], CrossEntropyResult])]
41
+ 'CrossEntropyResultDict', [('results', dict[tuple['cirq.Qid', ...], CrossEntropyResult])]
40
42
  )
41
43
 
42
44
 
43
45
  @functools.lru_cache()
44
- def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
46
+ def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
45
47
  import numpy as np
46
48
  import pandas as pd
47
49
 
48
50
  import cirq
49
- from cirq.devices import InsertionNoiseModel
51
+ from cirq.devices import InsertionNoiseModel, NoiseModelFromNoiseProperties, ThermalNoiseModel
50
52
  from cirq.devices.noise_model import _NoNoiseModel
51
53
  from cirq.experiments import GridInteractionLayer
52
54
  from cirq.ops import raw_types
@@ -80,7 +82,7 @@ def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
80
82
  )
81
83
 
82
84
  def _cross_entropy_result_dict(
83
- results: List[Tuple[List['cirq.Qid'], CrossEntropyResult]], **kwargs
85
+ results: list[tuple[list[cirq.Qid], CrossEntropyResult]], **kwargs
84
86
  ) -> CrossEntropyResultDict:
85
87
  return CrossEntropyResultDict(results={tuple(qubits): result for qubits, result in results})
86
88
 
@@ -173,6 +175,7 @@ def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
173
175
  'NamedQubit': cirq.NamedQubit,
174
176
  'NamedQid': cirq.NamedQid,
175
177
  'NoIdentifierQubit': cirq.testing.NoIdentifierQubit,
178
+ 'NoiseModelFromNoiseProperties': NoiseModelFromNoiseProperties,
176
179
  'ObservableMeasuredResult': cirq.work.ObservableMeasuredResult,
177
180
  'OpIdentifier': cirq.OpIdentifier,
178
181
  'ParamResolver': cirq.ParamResolver,
@@ -224,6 +227,7 @@ def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
224
227
  'SympyCondition': cirq.SympyCondition,
225
228
  'TaggedOperation': cirq.TaggedOperation,
226
229
  'TensoredConfusionMatrices': cirq.TensoredConfusionMatrices,
230
+ 'ThermalNoiseModel': ThermalNoiseModel,
227
231
  'TiltedSquareLattice': cirq.TiltedSquareLattice,
228
232
  'ThreeQubitDiagonalGate': cirq.ThreeQubitDiagonalGate,
229
233
  'TrialResult': cirq.ResultDict, # keep support for Cirq < 0.11.
@@ -235,9 +239,7 @@ def _class_resolver_dictionary() -> Dict[str, ObjectFactory]:
235
239
  'VirtualTag': cirq.VirtualTag,
236
240
  'WaitGate': cirq.WaitGate,
237
241
  # The formatter keeps putting this back
238
- # pylint: disable=line-too-long
239
- 'XEBPhasedFSimCharacterizationOptions': cirq.experiments.XEBPhasedFSimCharacterizationOptions,
240
- # pylint: enable=line-too-long
242
+ 'XEBPhasedFSimCharacterizationOptions': cirq.experiments.XEBPhasedFSimCharacterizationOptions, # noqa: E501
241
243
  '_XEigenState': cirq.value.product_state._XEigenState,
242
244
  'XPowGate': cirq.XPowGate,
243
245
  'XXPowGate': cirq.XXPowGate,
cirq/linalg/__init__.py CHANGED
@@ -26,7 +26,6 @@ from cirq.linalg.combinators import (
26
26
  )
27
27
 
28
28
  from cirq.linalg.decompositions import (
29
- # pylint: disable=line-too-long
30
29
  axis_angle as axis_angle,
31
30
  AxisAngleDecomposition as AxisAngleDecomposition,
32
31
  deconstruct_single_qubit_matrix_into_angles as deconstruct_single_qubit_matrix_into_angles,
@@ -39,15 +38,14 @@ from cirq.linalg.decompositions import (
39
38
  map_eigenvalues as map_eigenvalues,
40
39
  num_cnots_required as num_cnots_required,
41
40
  unitary_eig as unitary_eig,
42
- scatter_plot_normalized_kak_interaction_coefficients as scatter_plot_normalized_kak_interaction_coefficients,
41
+ scatter_plot_normalized_kak_interaction_coefficients as scatter_plot_normalized_kak_interaction_coefficients, # noqa: E501
43
42
  so4_to_magic_su2s as so4_to_magic_su2s,
44
43
  )
45
44
 
46
45
  from cirq.linalg.diagonalize import (
47
- # pylint: disable=line-too-long
48
- bidiagonalize_real_matrix_pair_with_symmetric_products as bidiagonalize_real_matrix_pair_with_symmetric_products,
49
- bidiagonalize_unitary_with_special_orthogonals as bidiagonalize_unitary_with_special_orthogonals,
50
- diagonalize_real_symmetric_and_sorted_diagonal_matrices as diagonalize_real_symmetric_and_sorted_diagonal_matrices,
46
+ bidiagonalize_real_matrix_pair_with_symmetric_products as bidiagonalize_real_matrix_pair_with_symmetric_products, # noqa: E501
47
+ bidiagonalize_unitary_with_special_orthogonals as bidiagonalize_unitary_with_special_orthogonals, # noqa: E501
48
+ diagonalize_real_symmetric_and_sorted_diagonal_matrices as diagonalize_real_symmetric_and_sorted_diagonal_matrices, # noqa: E501
51
49
  diagonalize_real_symmetric_matrix as diagonalize_real_symmetric_matrix,
52
50
  )
53
51
 
@@ -14,8 +14,10 @@
14
14
 
15
15
  """Utility methods for combining matrices."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import functools
18
- from typing import TYPE_CHECKING, Union
20
+ from typing import TYPE_CHECKING
19
21
 
20
22
  import numpy as np
21
23
 
@@ -25,7 +27,7 @@ if TYPE_CHECKING:
25
27
  from numpy.typing import ArrayLike, DTypeLike
26
28
 
27
29
 
28
- def kron(*factors: Union[np.ndarray, complex], shape_len: int = 2) -> np.ndarray:
30
+ def kron(*factors: np.ndarray | complex, shape_len: int = 2) -> np.ndarray:
29
31
  """Computes the kronecker product of a sequence of values.
30
32
 
31
33
  A *args version of lambda args: functools.reduce(np.kron, args).
@@ -56,7 +58,7 @@ document(
56
58
  )
57
59
 
58
60
 
59
- def kron_with_controls(*factors: Union[np.ndarray, complex]) -> np.ndarray:
61
+ def kron_with_controls(*factors: np.ndarray | complex) -> np.ndarray:
60
62
  """Computes the kronecker product of a sequence of values and control tags.
61
63
 
62
64
  Use `cirq.CONTROL_TAG` to represent controls. Any entry of the output
@@ -107,7 +109,7 @@ def kron_with_controls(*factors: Union[np.ndarray, complex]) -> np.ndarray:
107
109
  return product
108
110
 
109
111
 
110
- def dot(*values: 'ArrayLike') -> np.ndarray:
112
+ def dot(*values: ArrayLike) -> np.ndarray:
111
113
  """Computes the dot/matrix product of a sequence of values.
112
114
 
113
115
  Performs the computation in serial order without regard to the matrix
@@ -136,7 +138,7 @@ def dot(*values: 'ArrayLike') -> np.ndarray:
136
138
  return result
137
139
 
138
140
 
139
- def _merge_dtypes(dtype1: 'DTypeLike', dtype2: 'DTypeLike') -> np.dtype:
141
+ def _merge_dtypes(dtype1: DTypeLike, dtype2: DTypeLike) -> np.dtype:
140
142
  return (np.zeros(0, dtype1) + np.zeros(0, dtype2)).dtype
141
143
 
142
144
 
@@ -11,13 +11,16 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import numpy as np
15
18
  import pytest
16
19
 
17
20
  import cirq
18
21
 
19
22
 
20
- def test_dot():
23
+ def test_dot() -> None:
21
24
  assert cirq.dot(2) == 2
22
25
  assert cirq.dot(2.5, 2.5) == 6.25
23
26
 
@@ -33,7 +36,7 @@ def test_dot():
33
36
  cirq.dot()
34
37
 
35
38
 
36
- def test_kron_multiplies_sizes():
39
+ def test_kron_multiplies_sizes() -> None:
37
40
  assert cirq.kron(np.array([1, 2])).shape == (1, 2)
38
41
  assert cirq.kron(np.array([1, 2]), shape_len=1).shape == (2,)
39
42
  assert cirq.kron(np.array([1, 2]), np.array([3, 4, 5]), shape_len=1).shape == (6,)
@@ -51,7 +54,7 @@ def test_kron_multiplies_sizes():
51
54
  assert np.allclose(cirq.kron(np.eye(2), np.eye(3), np.eye(4)), np.eye(24))
52
55
 
53
56
 
54
- def test_kron_spreads_values():
57
+ def test_kron_spreads_values() -> None:
55
58
  u = np.array([[2, 3], [5, 7]])
56
59
 
57
60
  assert np.allclose(
@@ -68,7 +71,7 @@ def test_kron_spreads_values():
68
71
  )
69
72
 
70
73
 
71
- def test_acts_like_kron_multiplies_sizes():
74
+ def test_acts_like_kron_multiplies_sizes() -> None:
72
75
  assert np.allclose(cirq.kron_with_controls(), np.eye(1))
73
76
  assert np.allclose(cirq.kron_with_controls(np.eye(2), np.eye(3), np.eye(4)), np.eye(24))
74
77
 
@@ -79,7 +82,7 @@ def test_acts_like_kron_multiplies_sizes():
79
82
  )
80
83
 
81
84
 
82
- def test_supports_controls():
85
+ def test_supports_controls() -> None:
83
86
  u = np.array([[2, 3], [5, 7]])
84
87
  assert np.allclose(cirq.kron_with_controls(cirq.CONTROL_TAG), np.array([[1, 0], [0, 1]]))
85
88
  assert np.allclose(
@@ -92,7 +95,7 @@ def test_supports_controls():
92
95
  )
93
96
 
94
97
 
95
- def test_block_diag():
98
+ def test_block_diag() -> None:
96
99
  assert np.allclose(cirq.block_diag(), np.zeros((0, 0)))
97
100
 
98
101
  assert np.allclose(cirq.block_diag(np.array([[1, 2], [3, 4]])), np.array([[1, 2], [3, 4]]))
@@ -108,7 +111,7 @@ def test_block_diag():
108
111
  _ = cirq.block_diag(np.array([[1, 2, 3], [3, 4, 5]]))
109
112
 
110
113
 
111
- def test_block_diag_dtype():
114
+ def test_block_diag_dtype() -> None:
112
115
  assert cirq.block_diag().dtype == np.complex128
113
116
 
114
117
  assert cirq.block_diag(np.array([[1]], dtype=np.int8)).dtype == np.int8
@@ -12,23 +12,13 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
-
16
15
  """Utility methods for breaking matrices into useful pieces."""
17
16
 
17
+ from __future__ import annotations
18
+
18
19
  import cmath
19
20
  import math
20
- from typing import (
21
- Any,
22
- Callable,
23
- cast,
24
- Iterable,
25
- List,
26
- Optional,
27
- Tuple,
28
- TYPE_CHECKING,
29
- TypeVar,
30
- Union,
31
- )
21
+ from typing import Any, Callable, cast, Iterable, TYPE_CHECKING, TypeVar
32
22
 
33
23
  import matplotlib.pyplot as plt
34
24
  import numpy as np
@@ -69,7 +59,7 @@ def _rotation_matrix(angle: float) -> np.ndarray:
69
59
  return np.array([[c, -s], [s, c]])
70
60
 
71
61
 
72
- def deconstruct_single_qubit_matrix_into_angles(mat: np.ndarray) -> Tuple[float, float, float]:
62
+ def deconstruct_single_qubit_matrix_into_angles(mat: np.ndarray) -> tuple[float, float, float]:
73
63
  r"""Breaks down a 2x2 unitary into ZYZ angle parameters.
74
64
 
75
65
  Given a unitary U, this function returns three angles: $\phi_0, \phi_1, \phi_2$,
@@ -107,7 +97,7 @@ def deconstruct_single_qubit_matrix_into_angles(mat: np.ndarray) -> Tuple[float,
107
97
 
108
98
  def unitary_eig(
109
99
  matrix: np.ndarray, check_preconditions: bool = True, atol: float = 1e-8
110
- ) -> Tuple[np.ndarray, np.ndarray]:
100
+ ) -> tuple[np.ndarray, np.ndarray]:
111
101
  r"""Gives the guaranteed unitary eigendecomposition of a normal matrix.
112
102
 
113
103
  All hermitian and unitary matrices are normal matrices. This method was
@@ -126,7 +116,7 @@ def unitary_eig(
126
116
  was unitary.
127
117
 
128
118
  Returns:
129
- A Tuple of
119
+ A tuple of
130
120
  eigvals: The eigenvalues of `matrix`.
131
121
  V: The unitary matrix with the eigenvectors as columns.
132
122
 
@@ -140,7 +130,6 @@ def unitary_eig(
140
130
  return R.diagonal(), V
141
131
 
142
132
 
143
- # pylint: enable=missing-raises-doc
144
133
  def map_eigenvalues(
145
134
  matrix: np.ndarray, func: Callable[[complex], complex], *, atol: float = 1e-8
146
135
  ) -> np.ndarray:
@@ -168,7 +157,7 @@ def map_eigenvalues(
168
157
 
169
158
  def kron_factor_4x4_to_2x2s(
170
159
  matrix: np.ndarray, rtol=1e-5, atol=1e-8
171
- ) -> Tuple[complex, np.ndarray, np.ndarray]:
160
+ ) -> tuple[complex, np.ndarray, np.ndarray]:
172
161
  """Splits a 4x4 matrix U = kron(A, B) into A, B, and a global factor.
173
162
 
174
163
  Requires the matrix to be the kronecker product of two 2x2 unitaries.
@@ -218,7 +207,7 @@ def kron_factor_4x4_to_2x2s(
218
207
 
219
208
  def so4_to_magic_su2s(
220
209
  mat: np.ndarray, *, rtol: float = 1e-5, atol: float = 1e-8, check_preconditions: bool = True
221
- ) -> Tuple[np.ndarray, np.ndarray]:
210
+ ) -> tuple[np.ndarray, np.ndarray]:
222
211
  """Finds 2x2 special-unitaries A, B where mat = Mag.H @ kron(A, B) @ Mag.
223
212
 
224
213
  Mag is the magic basis matrix:
@@ -264,14 +253,14 @@ class AxisAngleDecomposition:
264
253
  rotation axis, and g is the global phase.
265
254
  """
266
255
 
267
- def __init__(self, *, angle: float, axis: Tuple[float, float, float], global_phase: complex):
256
+ def __init__(self, *, angle: float, axis: tuple[float, float, float], global_phase: complex):
268
257
  if not np.isclose(np.linalg.norm(axis, 2), 1, atol=1e-8):
269
258
  raise ValueError('Axis vector must be normalized.')
270
259
  self.global_phase = complex(global_phase)
271
260
  self.axis = tuple(axis)
272
261
  self.angle = float(angle)
273
262
 
274
- def canonicalize(self, atol: float = 1e-8) -> 'AxisAngleDecomposition':
263
+ def canonicalize(self, atol: float = 1e-8) -> AxisAngleDecomposition:
275
264
  """Returns a standardized AxisAngleDecomposition with the same unitary.
276
265
 
277
266
  Ensures the axis (x, y, z) satisfies x+y+z >= 0.
@@ -412,9 +401,9 @@ class KakDecomposition:
412
401
  self,
413
402
  *,
414
403
  global_phase: complex = complex(1),
415
- single_qubit_operations_before: Optional[Tuple[np.ndarray, np.ndarray]] = None,
416
- interaction_coefficients: Tuple[float, float, float],
417
- single_qubit_operations_after: Optional[Tuple[np.ndarray, np.ndarray]] = None,
404
+ single_qubit_operations_before: tuple[np.ndarray, np.ndarray] | None = None,
405
+ interaction_coefficients: tuple[float, float, float],
406
+ single_qubit_operations_after: tuple[np.ndarray, np.ndarray] | None = None,
418
407
  ):
419
408
  """Initializes a decomposition for a two-qubit operation U.
420
409
 
@@ -427,12 +416,12 @@ class KakDecomposition:
427
416
  single_qubit_operations_after: a0, a1 from the above equation.
428
417
  """
429
418
  self.global_phase: complex = global_phase
430
- self.single_qubit_operations_before: Tuple[np.ndarray, np.ndarray] = (
419
+ self.single_qubit_operations_before: tuple[np.ndarray, np.ndarray] = (
431
420
  single_qubit_operations_before
432
421
  or (np.eye(2, dtype=np.complex64), np.eye(2, dtype=np.complex64))
433
422
  )
434
423
  self.interaction_coefficients = interaction_coefficients
435
- self.single_qubit_operations_after: Tuple[np.ndarray, np.ndarray] = (
424
+ self.single_qubit_operations_after: tuple[np.ndarray, np.ndarray] = (
436
425
  single_qubit_operations_after
437
426
  or (np.eye(2, dtype=np.complex64), np.eye(2, dtype=np.complex64))
438
427
  )
@@ -524,10 +513,10 @@ class KakDecomposition:
524
513
 
525
514
 
526
515
  def scatter_plot_normalized_kak_interaction_coefficients(
527
- interactions: Iterable[Union[np.ndarray, 'cirq.SupportsUnitary', 'KakDecomposition']],
516
+ interactions: Iterable[np.ndarray | cirq.SupportsUnitary | KakDecomposition],
528
517
  *,
529
518
  include_frame: bool = True,
530
- ax: Optional[mplot3d.axes3d.Axes3D] = None,
519
+ ax: mplot3d.axes3d.Axes3D | None = None,
531
520
  **kwargs,
532
521
  ):
533
522
  r"""Plots the interaction coefficients of many two-qubit operations.
@@ -609,8 +598,8 @@ def scatter_plot_normalized_kak_interaction_coefficients(
609
598
  ax = cast(mplot3d.axes3d.Axes3D, fig.add_subplot(1, 1, 1, projection='3d'))
610
599
 
611
600
  def coord_transform(
612
- pts: Union[List[Tuple[int, int, int]], np.ndarray],
613
- ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
601
+ pts: list[tuple[int, int, int]] | np.ndarray,
602
+ ) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
614
603
  if len(pts) == 0:
615
604
  return np.array([]), np.array([]), np.array([])
616
605
  xs, ys, zs = np.transpose(pts)
@@ -636,7 +625,7 @@ def scatter_plot_normalized_kak_interaction_coefficients(
636
625
 
637
626
  # parse input and extract KAK vector
638
627
  if not isinstance(interactions, np.ndarray):
639
- interactions_extracted: List[np.ndarray] = [
628
+ interactions_extracted: list[np.ndarray] = [
640
629
  a if isinstance(a, np.ndarray) else protocols.unitary(a) for a in interactions
641
630
  ]
642
631
  else:
@@ -785,9 +774,9 @@ KAK_GAMMA = np.array([[1, 1, 1, 1],
785
774
 
786
775
 
787
776
  def kak_decomposition(
788
- unitary_object: Union[
789
- np.ndarray, 'cirq.SupportsUnitary', 'cirq.Gate', 'cirq.Operation', KakDecomposition
790
- ],
777
+ unitary_object: (
778
+ np.ndarray | cirq.SupportsUnitary | cirq.Gate | cirq.Operation | KakDecomposition
779
+ ),
791
780
  *,
792
781
  rtol: float = 1e-5,
793
782
  atol: float = 1e-8,
@@ -857,7 +846,7 @@ def kak_decomposition(
857
846
 
858
847
 
859
848
  def kak_vector(
860
- unitary: Union[Iterable[np.ndarray], np.ndarray],
849
+ unitary: Iterable[np.ndarray] | np.ndarray,
861
850
  *,
862
851
  rtol: float = 1e-5,
863
852
  atol: float = 1e-8,
@@ -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 random
16
18
 
17
19
  import numpy as np
@@ -582,7 +584,7 @@ def _local_two_qubit_unitaries(samples, random_state):
582
584
  _kak_gens = np.array([np.kron(X, X), np.kron(Y, Y), np.kron(Z, Z)])
583
585
 
584
586
 
585
- def _random_two_qubit_unitaries(num_samples: int, random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE'):
587
+ def _random_two_qubit_unitaries(num_samples: int, random_state: cirq.RANDOM_STATE_OR_SEED_LIKE):
586
588
  # Randomly generated two-qubit unitaries and the KAK vectors (not canonical)
587
589
  kl = _local_two_qubit_unitaries(num_samples, random_state)
588
590
 
@@ -14,7 +14,9 @@
14
14
 
15
15
  """Utility methods for diagonalizing matrices."""
16
16
 
17
- from typing import Callable, List, Tuple
17
+ from __future__ import annotations
18
+
19
+ from typing import Callable
18
20
 
19
21
  import numpy as np
20
22
 
@@ -52,7 +54,7 @@ def diagonalize_real_symmetric_matrix(
52
54
 
53
55
  def _contiguous_groups(
54
56
  length: int, comparator: Callable[[int, int], bool]
55
- ) -> List[Tuple[int, int]]:
57
+ ) -> list[tuple[int, int]]:
56
58
  """Splits range(length) into approximate equivalence classes.
57
59
 
58
60
  Args:
@@ -155,7 +157,7 @@ def bidiagonalize_real_matrix_pair_with_symmetric_products(
155
157
  rtol: float = 1e-5,
156
158
  atol: float = 1e-8,
157
159
  check_preconditions: bool = True,
158
- ) -> Tuple[np.ndarray, np.ndarray]:
160
+ ) -> tuple[np.ndarray, np.ndarray]:
159
161
  """Finds orthogonal matrices that diagonalize both mat1 and mat2.
160
162
 
161
163
  Requires mat1 and mat2 to be real.
@@ -226,7 +228,7 @@ def bidiagonalize_real_matrix_pair_with_symmetric_products(
226
228
 
227
229
  def bidiagonalize_unitary_with_special_orthogonals(
228
230
  mat: np.ndarray, *, rtol: float = 1e-5, atol: float = 1e-8, check_preconditions: bool = True
229
- ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
231
+ ) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
230
232
  """Finds orthogonal matrices L, R such that L @ matrix @ R is diagonal.
231
233
 
232
234
  Args: