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,8 +12,10 @@
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 warnings
16
- from typing import Any, cast, Optional, Sequence, TYPE_CHECKING
18
+ from typing import Any, cast, Sequence, TYPE_CHECKING
17
19
 
18
20
  import numpy as np
19
21
  import pandas as pd
@@ -31,14 +33,14 @@ optimize = _import.LazyLoader("optimize", globals(), "scipy.optimize")
31
33
 
32
34
 
33
35
  def t1_decay(
34
- sampler: 'cirq.Sampler',
36
+ sampler: cirq.Sampler,
35
37
  *,
36
- qubit: 'cirq.Qid',
38
+ qubit: cirq.Qid,
37
39
  num_points: int,
38
- max_delay: 'cirq.DURATION_LIKE',
39
- min_delay: 'cirq.DURATION_LIKE' = None,
40
+ max_delay: cirq.DURATION_LIKE,
41
+ min_delay: cirq.DURATION_LIKE = None,
40
42
  repetitions: int = 1000,
41
- ) -> 'cirq.experiments.T1DecayResult':
43
+ ) -> cirq.experiments.T1DecayResult:
42
44
  """Runs a t1 decay experiment.
43
45
 
44
46
  Initializes a qubit into the |1⟩ state, waits for a variable amount of time,
@@ -144,7 +146,7 @@ class T1DecayResult:
144
146
  return np.nan
145
147
 
146
148
  def plot(
147
- self, ax: Optional[plt.Axes] = None, include_fit: bool = False, **plot_kwargs: Any
149
+ self, ax: plt.Axes | None = None, include_fit: bool = False, **plot_kwargs: Any
148
150
  ) -> plt.Axes:
149
151
  """Plots the excited state probability vs the amount of delay.
150
152
 
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pandas as pd
17
19
  import pytest
@@ -20,7 +22,7 @@ import sympy
20
22
  import cirq
21
23
 
22
24
 
23
- def test_init_result():
25
+ def test_init_result() -> None:
24
26
  data = pd.DataFrame(
25
27
  columns=['delay_ns', 'false_count', 'true_count'],
26
28
  index=range(2),
@@ -31,7 +33,7 @@ def test_init_result():
31
33
 
32
34
 
33
35
  @pytest.mark.usefixtures('closefigures')
34
- def test_plot_does_not_raise_error():
36
+ def test_plot_does_not_raise_error() -> None:
35
37
  class _TimeDependentDecay(cirq.NoiseModel):
36
38
  def noisy_moment(self, moment, system_qubits):
37
39
  duration = max(
@@ -55,7 +57,7 @@ def test_plot_does_not_raise_error():
55
57
  results.plot(include_fit=True)
56
58
 
57
59
 
58
- def test_result_eq():
60
+ def test_result_eq() -> None:
59
61
  eq = cirq.testing.EqualsTester()
60
62
  eq.make_equality_group(
61
63
  lambda: cirq.experiments.T1DecayResult(
@@ -75,7 +77,7 @@ def test_result_eq():
75
77
  )
76
78
 
77
79
 
78
- def test_sudden_decay_results():
80
+ def test_sudden_decay_results() -> None:
79
81
  class _SuddenDecay(cirq.NoiseModel):
80
82
  def noisy_moment(self, moment, system_qubits):
81
83
  duration = max(
@@ -107,7 +109,7 @@ def test_sudden_decay_results():
107
109
  )
108
110
 
109
111
 
110
- def test_all_on_results():
112
+ def test_all_on_results() -> None:
111
113
  results = cirq.experiments.t1_decay(
112
114
  sampler=cirq.Simulator(),
113
115
  qubit=cirq.GridQubit(0, 0),
@@ -126,7 +128,7 @@ def test_all_on_results():
126
128
  assert results == desired, f'{results.data=} {desired.data=}'
127
129
 
128
130
 
129
- def test_all_off_results():
131
+ def test_all_off_results() -> None:
130
132
  results = cirq.experiments.t1_decay(
131
133
  sampler=cirq.DensityMatrixSimulator(noise=cirq.amplitude_damp(1)),
132
134
  qubit=cirq.GridQubit(0, 0),
@@ -146,7 +148,7 @@ def test_all_off_results():
146
148
 
147
149
 
148
150
  @pytest.mark.usefixtures('closefigures')
149
- def test_curve_fit_plot_works():
151
+ def test_curve_fit_plot_works() -> None:
150
152
  good_fit = cirq.experiments.T1DecayResult(
151
153
  data=pd.DataFrame(
152
154
  columns=['delay_ns', 'false_count', 'true_count'],
@@ -159,7 +161,7 @@ def test_curve_fit_plot_works():
159
161
 
160
162
 
161
163
  @pytest.mark.parametrize('t1', [200.0, 500.0, 700.0])
162
- def test_noise_model_continous(t1):
164
+ def test_noise_model_continous(t1) -> None:
163
165
  class GradualDecay(cirq.NoiseModel):
164
166
  def __init__(self, t1: float):
165
167
  self.t1 = t1
@@ -193,7 +195,7 @@ def test_noise_model_continous(t1):
193
195
 
194
196
 
195
197
  @pytest.mark.parametrize('gamma', [0.01, 0.05, 0.1])
196
- def test_noise_model_discrete(gamma):
198
+ def test_noise_model_discrete(gamma) -> None:
197
199
  results = cirq.experiments.t1_decay(
198
200
  sampler=cirq.DensityMatrixSimulator(
199
201
  noise=cirq.NoiseModel.from_noise_model_like(cirq.amplitude_damp(gamma))
@@ -212,7 +214,7 @@ def test_noise_model_discrete(gamma):
212
214
  np.testing.assert_allclose(probs, np.mean(probs), atol=0.2)
213
215
 
214
216
 
215
- def test_bad_args():
217
+ def test_bad_args() -> None:
216
218
  with pytest.raises(ValueError, match='repetitions <= 0'):
217
219
  _ = cirq.experiments.t1_decay(
218
220
  sampler=cirq.Simulator(),
@@ -253,7 +255,7 @@ def test_bad_args():
253
255
  )
254
256
 
255
257
 
256
- def test_str():
258
+ def test_str() -> None:
257
259
  result = cirq.experiments.T1DecayResult(
258
260
  data=pd.DataFrame(
259
261
  columns=['delay_ns', 'false_count', 'true_count'],
@@ -11,8 +11,11 @@
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 enum
15
- from typing import Any, List, Optional, TYPE_CHECKING, Union
18
+ from typing import Any, TYPE_CHECKING
16
19
 
17
20
  import pandas as pd
18
21
  import sympy
@@ -35,17 +38,17 @@ _T2_COLUMNS = ['delay_ns', 0, 1]
35
38
 
36
39
 
37
40
  def t2_decay(
38
- sampler: 'cirq.Sampler',
41
+ sampler: cirq.Sampler,
39
42
  *,
40
- qubit: 'cirq.Qid',
41
- experiment_type: 'ExperimentType' = ExperimentType.RAMSEY,
43
+ qubit: cirq.Qid,
44
+ experiment_type: ExperimentType = ExperimentType.RAMSEY,
42
45
  num_points: int,
43
- max_delay: 'cirq.DURATION_LIKE',
44
- min_delay: 'cirq.DURATION_LIKE' = None,
46
+ max_delay: cirq.DURATION_LIKE,
47
+ min_delay: cirq.DURATION_LIKE = None,
45
48
  repetitions: int = 1000,
46
- delay_sweep: Optional[study.Sweep] = None,
47
- num_pulses: Optional[List[int]] = None,
48
- ) -> Union['cirq.experiments.T2DecayResult', List['cirq.experiments.T2DecayResult']]:
49
+ delay_sweep: study.Sweep | None = None,
50
+ num_pulses: list[int] | None = None,
51
+ ) -> cirq.experiments.T2DecayResult | list[cirq.experiments.T2DecayResult]:
49
52
  """Runs a t2 transverse relaxation experiment.
50
53
 
51
54
  Initializes a qubit into a superposition state, evolves the system using
@@ -234,7 +237,7 @@ def _create_tabulation(measurements: pd.DataFrame) -> pd.DataFrame:
234
237
  return tabulation
235
238
 
236
239
 
237
- def _cpmg_circuit(qubit: 'cirq.Qid', delay_var: sympy.Symbol, max_pulses: int) -> 'cirq.Circuit':
240
+ def _cpmg_circuit(qubit: cirq.Qid, delay_var: sympy.Symbol, max_pulses: int) -> cirq.Circuit:
238
241
  """Creates a CPMG circuit for a given qubit.
239
242
 
240
243
  The circuit will look like:
@@ -256,7 +259,7 @@ def _cpmg_circuit(qubit: 'cirq.Qid', delay_var: sympy.Symbol, max_pulses: int) -
256
259
  return circuit
257
260
 
258
261
 
259
- def _cpmg_sweep(num_pulses: List[int]):
262
+ def _cpmg_sweep(num_pulses: list[int]):
260
263
  """Returns a sweep for a circuit created by _cpmg_circuit.
261
264
 
262
265
  The circuit in _cpmg_circuit parameterizes the pulses, so this function
@@ -351,7 +354,7 @@ class T2DecayResult:
351
354
  """
352
355
  return self._expectation_pauli_y
353
356
 
354
- def plot_expectations(self, ax: Optional[plt.Axes] = None, **plot_kwargs: Any) -> plt.Axes:
357
+ def plot_expectations(self, ax: plt.Axes | None = None, **plot_kwargs: Any) -> plt.Axes:
355
358
  """Plots the expectation values of Pauli operators versus delay time.
356
359
 
357
360
  Args:
@@ -392,7 +395,7 @@ class T2DecayResult:
392
395
  fig.show()
393
396
  return ax
394
397
 
395
- def plot_bloch_vector(self, ax: Optional[plt.Axes] = None, **plot_kwargs: Any) -> plt.Axes:
398
+ def plot_bloch_vector(self, ax: plt.Axes | None = None, **plot_kwargs: Any) -> plt.Axes:
396
399
  """Plots the estimated length of the Bloch vector versus time.
397
400
 
398
401
  This plot estimates the Bloch Vector by squaring the Pauli expectation
@@ -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 pandas as pd
16
18
  import pytest
17
19
  import sympy
@@ -13,23 +13,26 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Provides functions for running and analyzing two-qubit XEB experiments."""
16
+
17
+ from __future__ import annotations
18
+
16
19
  import functools
17
20
  import itertools
18
21
  from dataclasses import dataclass
19
22
  from types import MappingProxyType
20
- from typing import Any, cast, Dict, Mapping, Optional, Sequence, Tuple, TYPE_CHECKING
23
+ from typing import Any, cast, Mapping, Sequence, TYPE_CHECKING
21
24
 
22
25
  import networkx as nx
23
26
  import numpy as np
24
- import pandas as pd
25
27
  from matplotlib import pyplot as plt
26
28
 
27
29
  from cirq import ops, value, vis
28
30
  from cirq._compat import cached_method
29
31
  from cirq.experiments import random_quantum_circuit_generation as rqcg
30
32
  from cirq.experiments.qubit_characterizations import (
31
- parallel_single_qubit_randomized_benchmarking,
33
+ parallel_single_qubit_rb,
32
34
  ParallelRandomizedBenchmarkingResult,
35
+ RBParameters,
33
36
  )
34
37
  from cirq.experiments.xeb_fitting import (
35
38
  benchmark_2q_xeb_fidelities,
@@ -42,25 +45,27 @@ from cirq.qis import noise_utils
42
45
  if TYPE_CHECKING:
43
46
  import multiprocessing
44
47
 
48
+ import pandas as pd
49
+
45
50
  import cirq
46
51
 
47
52
 
48
- def _grid_qubits_for_sampler(sampler: 'cirq.Sampler') -> Optional[Sequence['cirq.GridQubit']]:
53
+ def _grid_qubits_for_sampler(sampler: cirq.Sampler) -> Sequence[cirq.GridQubit] | None:
49
54
  if hasattr(sampler, 'processor'):
50
55
  device = sampler.processor.get_device()
51
56
  return sorted(device.metadata.qubit_set)
52
57
  return None
53
58
 
54
59
 
55
- def _manhattan_distance(qubit1: 'cirq.GridQubit', qubit2: 'cirq.GridQubit') -> int:
60
+ def _manhattan_distance(qubit1: cirq.GridQubit, qubit2: cirq.GridQubit) -> int:
56
61
  return abs(qubit1.row - qubit2.row) + abs(qubit1.col - qubit2.col)
57
62
 
58
63
 
59
64
  def qubits_and_pairs(
60
- sampler: 'cirq.Sampler',
61
- qubits: Optional[Sequence['cirq.GridQubit']] = None,
62
- pairs: Optional[Sequence[tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
63
- ) -> Tuple[Sequence['cirq.GridQubit'], Sequence[tuple['cirq.GridQubit', 'cirq.GridQubit']]]:
65
+ sampler: cirq.Sampler,
66
+ qubits: Sequence[cirq.GridQubit] | None = None,
67
+ pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
68
+ ) -> tuple[Sequence[cirq.GridQubit], Sequence[tuple[cirq.GridQubit, cirq.GridQubit]]]:
64
69
  """Extract qubits and pairs from sampler.
65
70
 
66
71
 
@@ -103,17 +108,21 @@ class TwoQubitXEBResult:
103
108
  fidelities: pd.DataFrame
104
109
 
105
110
  @functools.cached_property
106
- def _qubit_pair_map(self) -> Dict[Tuple['cirq.GridQubit', 'cirq.GridQubit'], int]:
111
+ def _qubit_pair_map(self) -> dict[tuple[cirq.GridQubit, cirq.GridQubit], int]:
112
+ if isinstance(self.fidelities.index[0][0], ops.Qid):
113
+ return {
114
+ (min(q0, q1), max(q0, q1)): i for i, (q0, q1) in enumerate(self.fidelities.index)
115
+ }
107
116
  return {
108
117
  (min(q0, q1), max(q0, q1)): i
109
118
  for i, (_, _, (q0, q1)) in enumerate(self.fidelities.index)
110
119
  }
111
120
 
112
121
  @functools.cached_property
113
- def all_qubit_pairs(self) -> Tuple[Tuple['cirq.GridQubit', 'cirq.GridQubit'], ...]:
122
+ def all_qubit_pairs(self) -> tuple[tuple[cirq.GridQubit, cirq.GridQubit], ...]:
114
123
  return tuple(sorted(self._qubit_pair_map.keys()))
115
124
 
116
- def plot_heatmap(self, ax: Optional[plt.Axes] = None, **plot_kwargs) -> plt.Axes:
125
+ def plot_heatmap(self, ax: plt.Axes | None = None, **plot_kwargs) -> plt.Axes:
117
126
  """plot the heatmap of XEB errors.
118
127
 
119
128
  Args:
@@ -127,7 +136,7 @@ class TwoQubitXEBResult:
127
136
  show_plot = not ax
128
137
  if not isinstance(ax, plt.Axes):
129
138
  fig, ax = plt.subplots(1, 1, figsize=(8, 8))
130
- heatmap_data: Dict[Tuple['cirq.GridQubit', ...], float] = {
139
+ heatmap_data: dict[tuple[cirq.GridQubit, ...], float] = {
131
140
  pair: self.xeb_error(*pair) for pair in self.all_qubit_pairs
132
141
  }
133
142
 
@@ -139,11 +148,7 @@ class TwoQubitXEBResult:
139
148
  return ax
140
149
 
141
150
  def plot_fitted_exponential(
142
- self,
143
- q0: 'cirq.GridQubit',
144
- q1: 'cirq.GridQubit',
145
- ax: Optional[plt.Axes] = None,
146
- **plot_kwargs,
151
+ self, q0: cirq.GridQubit, q1: cirq.GridQubit, ax: plt.Axes | None = None, **plot_kwargs
147
152
  ) -> plt.Axes:
148
153
  """plot the fitted model to for xeb error of a qubit pair.
149
154
 
@@ -185,21 +190,21 @@ class TwoQubitXEBResult:
185
190
  q0, q1 = q1, q0
186
191
  return self.fidelities.iloc[self._qubit_pair_map[(q0, q1)]]
187
192
 
188
- def xeb_fidelity(self, q0: 'cirq.GridQubit', q1: 'cirq.GridQubit') -> float:
193
+ def xeb_fidelity(self, q0: cirq.GridQubit, q1: cirq.GridQubit) -> float:
189
194
  """Return the XEB fidelity of a qubit pair."""
190
195
  return noise_utils.decay_constant_to_xeb_fidelity(
191
196
  self._record(q0, q1).layer_fid, num_qubits=2
192
197
  )
193
198
 
194
- def xeb_error(self, q0: 'cirq.GridQubit', q1: 'cirq.GridQubit') -> float:
199
+ def xeb_error(self, q0: cirq.GridQubit, q1: cirq.GridQubit) -> float:
195
200
  """Return the XEB error of a qubit pair."""
196
201
  return 1 - self.xeb_fidelity(q0, q1)
197
202
 
198
- def all_errors(self) -> Dict[Tuple['cirq.GridQubit', 'cirq.GridQubit'], float]:
203
+ def all_errors(self) -> dict[tuple[cirq.GridQubit, cirq.GridQubit], float]:
199
204
  """Return the XEB error of all qubit pairs."""
200
205
  return {(q0, q1): self.xeb_error(q0, q1) for q0, q1 in self.all_qubit_pairs}
201
206
 
202
- def plot_histogram(self, ax: Optional[plt.Axes] = None, **plot_kwargs) -> plt.Axes:
207
+ def plot_histogram(self, ax: plt.Axes | None = None, **plot_kwargs) -> plt.Axes:
203
208
  """plot a histogram of all xeb errors.
204
209
 
205
210
  Args:
@@ -219,7 +224,7 @@ class TwoQubitXEBResult:
219
224
  return ax
220
225
 
221
226
  @cached_method
222
- def pauli_error(self) -> Dict[Tuple['cirq.GridQubit', 'cirq.GridQubit'], float]:
227
+ def pauli_error(self) -> dict[tuple[cirq.GridQubit, cirq.GridQubit], float]:
223
228
  """Return the Pauli error of all qubit pairs."""
224
229
  return {
225
230
  pair: noise_utils.decay_constant_to_pauli_error(
@@ -242,33 +247,33 @@ class InferredXEBResult:
242
247
  xeb_result: TwoQubitXEBResult
243
248
 
244
249
  @property
245
- def all_qubit_pairs(self) -> Sequence[Tuple['cirq.GridQubit', 'cirq.GridQubit']]:
250
+ def all_qubit_pairs(self) -> Sequence[tuple[cirq.GridQubit, cirq.GridQubit]]:
246
251
  return self.xeb_result.all_qubit_pairs
247
252
 
248
253
  @cached_method
249
- def single_qubit_pauli_error(self) -> Mapping['cirq.Qid', float]:
254
+ def single_qubit_pauli_error(self) -> Mapping[cirq.Qid, float]:
250
255
  """Return the single-qubit Pauli error for all qubits (RB results)."""
251
256
  return self.rb_result.pauli_error()
252
257
 
253
258
  @cached_method
254
- def two_qubit_pauli_error(self) -> Mapping[Tuple['cirq.GridQubit', 'cirq.GridQubit'], float]:
259
+ def two_qubit_pauli_error(self) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
255
260
  """Return the two-qubit Pauli error for all pairs."""
256
261
  return MappingProxyType(self.xeb_result.pauli_error())
257
262
 
258
263
  @cached_method
259
- def inferred_pauli_error(self) -> Mapping[Tuple['cirq.GridQubit', 'cirq.GridQubit'], float]:
264
+ def inferred_pauli_error(self) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
260
265
  """Return the inferred Pauli error for all pairs."""
261
266
  single_q_paulis = self.rb_result.pauli_error()
262
267
  xeb = self.xeb_result.pauli_error()
263
268
 
264
- def _pauli_error(q0: 'cirq.GridQubit', q1: 'cirq.GridQubit') -> float:
269
+ def _pauli_error(q0: cirq.GridQubit, q1: cirq.GridQubit) -> float:
265
270
  q0, q1 = sorted([q0, q1])
266
271
  return xeb[(q0, q1)] - single_q_paulis[q0] - single_q_paulis[q1]
267
272
 
268
273
  return MappingProxyType({pair: _pauli_error(*pair) for pair in self.all_qubit_pairs})
269
274
 
270
275
  @cached_method
271
- def inferred_decay_constant(self) -> Mapping[Tuple['cirq.GridQubit', 'cirq.GridQubit'], float]:
276
+ def inferred_decay_constant(self) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
272
277
  """Return the inferred decay constant for all pairs."""
273
278
  return MappingProxyType(
274
279
  {
@@ -278,7 +283,7 @@ class InferredXEBResult:
278
283
  )
279
284
 
280
285
  @cached_method
281
- def inferred_xeb_error(self) -> Mapping[Tuple['cirq.GridQubit', 'cirq.GridQubit'], float]:
286
+ def inferred_xeb_error(self) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
282
287
  """Return the inferred XEB error for all pairs."""
283
288
  return MappingProxyType(
284
289
  {
@@ -289,7 +294,7 @@ class InferredXEBResult:
289
294
 
290
295
  def _target_errors(
291
296
  self, target_error: str
292
- ) -> Mapping[Tuple['cirq.GridQubit', 'cirq.GridQubit'], float]:
297
+ ) -> Mapping[tuple[cirq.GridQubit, cirq.GridQubit], float]:
293
298
  """Returns requested error.
294
299
 
295
300
  The requested error must be one of 'pauli', 'decay_constant', or 'xeb'.
@@ -311,7 +316,7 @@ class InferredXEBResult:
311
316
  return error_funcs[target_error]()
312
317
 
313
318
  def plot_heatmap(
314
- self, target_error: str = 'pauli', ax: Optional[plt.Axes] = None, **plot_kwargs
319
+ self, target_error: str = 'pauli', ax: plt.Axes | None = None, **plot_kwargs
315
320
  ) -> plt.Axes:
316
321
  """plot the heatmap of the target errors.
317
322
 
@@ -325,7 +330,7 @@ class InferredXEBResult:
325
330
  if not isinstance(ax, plt.Axes):
326
331
  fig, ax = plt.subplots(1, 1, figsize=(8, 8))
327
332
  heatmap_data = cast(
328
- Mapping[Tuple['cirq.GridQubit', ...], float], self._target_errors(target_error)
333
+ Mapping[tuple['cirq.GridQubit', ...], float], self._target_errors(target_error)
329
334
  )
330
335
 
331
336
  name = f'{target_error} error' if target_error != 'decay_constant' else 'decay constant'
@@ -339,7 +344,7 @@ class InferredXEBResult:
339
344
  def plot_histogram(
340
345
  self,
341
346
  target_error: str = 'pauli',
342
- ax: Optional[plt.Axes] = None,
347
+ ax: plt.Axes | None = None,
343
348
  kind: str = 'two_qubit',
344
349
  **plot_kwargs,
345
350
  ) -> plt.Axes:
@@ -393,21 +398,21 @@ class InferredXEBResult:
393
398
 
394
399
 
395
400
  def parallel_xeb_workflow(
396
- sampler: 'cirq.Sampler',
397
- qubits: Optional[Sequence['cirq.GridQubit']] = None,
398
- entangling_gate: 'cirq.Gate' = ops.CZ,
401
+ sampler: cirq.Sampler,
402
+ qubits: Sequence[cirq.GridQubit] | None = None,
403
+ entangling_gate: cirq.Gate = ops.CZ,
399
404
  n_repetitions: int = 10**4,
400
405
  n_combinations: int = 10,
401
406
  n_circuits: int = 20,
402
407
  cycle_depths: Sequence[int] = (5, 25, 50, 100, 200, 300),
403
- random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
404
- ax: Optional[plt.Axes] = None,
405
- pairs: Optional[Sequence[tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
406
- pool: Optional['multiprocessing.pool.Pool'] = None,
408
+ random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
409
+ ax: plt.Axes | None = None,
410
+ pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
411
+ pool: multiprocessing.pool.Pool | None = None,
407
412
  batch_size: int = 9,
408
413
  tags: Sequence[Any] = (),
409
414
  **plot_kwargs,
410
- ) -> Tuple[pd.DataFrame, Sequence['cirq.Circuit'], pd.DataFrame]:
415
+ ) -> tuple[pd.DataFrame, Sequence[cirq.Circuit], pd.DataFrame]:
411
416
  """A utility method that runs the full XEB workflow.
412
417
 
413
418
  Args:
@@ -483,16 +488,16 @@ def parallel_xeb_workflow(
483
488
 
484
489
 
485
490
  def parallel_two_qubit_xeb(
486
- sampler: 'cirq.Sampler',
487
- qubits: Optional[Sequence['cirq.GridQubit']] = None,
488
- entangling_gate: 'cirq.Gate' = ops.CZ,
491
+ sampler: cirq.Sampler,
492
+ qubits: Sequence[cirq.GridQubit] | None = None,
493
+ entangling_gate: cirq.Gate = ops.CZ,
489
494
  n_repetitions: int = 10**4,
490
495
  n_combinations: int = 10,
491
496
  n_circuits: int = 20,
492
497
  cycle_depths: Sequence[int] = (5, 25, 50, 100, 200, 300),
493
- random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
494
- ax: Optional[plt.Axes] = None,
495
- pairs: Optional[Sequence[tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
498
+ random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
499
+ ax: plt.Axes | None = None,
500
+ pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
496
501
  batch_size: int = 9,
497
502
  tags: Sequence[Any] = (),
498
503
  **plot_kwargs,
@@ -540,18 +545,18 @@ def parallel_two_qubit_xeb(
540
545
 
541
546
 
542
547
  def run_rb_and_xeb(
543
- sampler: 'cirq.Sampler',
544
- qubits: Optional[Sequence['cirq.GridQubit']] = None,
548
+ sampler: cirq.Sampler,
549
+ qubits: Sequence[cirq.GridQubit] | None = None,
545
550
  repetitions: int = 10**3,
546
551
  num_circuits: int = 20,
547
552
  num_clifford_range: Sequence[int] = tuple(
548
553
  np.logspace(np.log10(5), np.log10(1000), 5, dtype=int)
549
554
  ),
550
- entangling_gate: 'cirq.Gate' = ops.CZ,
555
+ entangling_gate: cirq.Gate = ops.CZ,
551
556
  depths_xeb: Sequence[int] = (5, 25, 50, 100, 200, 300),
552
557
  xeb_combinations: int = 10,
553
- random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
554
- pairs: Optional[Sequence[tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
558
+ random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
559
+ pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
555
560
  batch_size: int = 9,
556
561
  tags: Sequence[Any] = (),
557
562
  ) -> InferredXEBResult:
@@ -582,12 +587,14 @@ def run_rb_and_xeb(
582
587
 
583
588
  qubits, pairs = qubits_and_pairs(sampler, qubits, pairs)
584
589
 
585
- rb = parallel_single_qubit_randomized_benchmarking(
590
+ rb = parallel_single_qubit_rb(
586
591
  sampler=sampler,
587
592
  qubits=qubits,
588
- repetitions=repetitions,
589
- num_circuits=num_circuits,
590
- num_clifford_range=num_clifford_range,
593
+ parameters=RBParameters(
594
+ num_circuits=num_circuits,
595
+ repetitions=repetitions,
596
+ num_clifford_range=num_clifford_range,
597
+ ),
591
598
  )
592
599
 
593
600
  xeb = parallel_two_qubit_xeb(
@@ -11,10 +11,14 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
14
15
  """Wraps Parallel Two Qubit XEB into a few convenience methods."""
16
+
17
+ from __future__ import annotations
18
+
15
19
  import io
16
20
  import itertools
17
- from typing import Dict, Optional, Sequence
21
+ from typing import Sequence
18
22
 
19
23
  import matplotlib.pyplot as plt
20
24
  import networkx as nx
@@ -26,7 +30,7 @@ import cirq
26
30
  from cirq.experiments.qubit_characterizations import ParallelRandomizedBenchmarkingResult
27
31
 
28
32
 
29
- def _manhattan_distance(qubit1: 'cirq.GridQubit', qubit2: 'cirq.GridQubit') -> int:
33
+ def _manhattan_distance(qubit1: cirq.GridQubit, qubit2: cirq.GridQubit) -> int:
30
34
  return abs(qubit1.row - qubit2.row) + abs(qubit1.col - qubit2.col)
31
35
 
32
36
 
@@ -86,7 +90,7 @@ def test_parallel_two_qubit_xeb_simulator_without_processor_fails():
86
90
  ),
87
91
  ],
88
92
  )
89
- def test_parallel_two_qubit_xeb(sampler: cirq.Sampler, qubits: Optional[Sequence[cirq.GridQubit]]):
93
+ def test_parallel_two_qubit_xeb(sampler: cirq.Sampler, qubits: Sequence[cirq.GridQubit] | None):
90
94
  res = cirq.experiments.parallel_two_qubit_xeb(
91
95
  sampler=sampler,
92
96
  qubits=qubits,
@@ -158,7 +162,7 @@ def test_pauli_error(q0: cirq.GridQubit, q1: cirq.GridQubit, pauli: float):
158
162
 
159
163
 
160
164
  class MockParallelRandomizedBenchmarkingResult(ParallelRandomizedBenchmarkingResult):
161
- def pauli_error(self) -> Dict[cirq.Qid, float]:
165
+ def pauli_error(self) -> dict[cirq.Qid, float]:
162
166
  return {
163
167
  cirq.GridQubit(4, 4): 0.01,
164
168
  cirq.GridQubit(5, 4): 0.02,
@@ -290,8 +294,8 @@ def test_inferred_plots(ax, target_error, kind):
290
294
  )
291
295
  def test_run_rb_and_xeb(
292
296
  sampler: cirq.Sampler,
293
- qubits: Optional[Sequence[cirq.GridQubit]],
294
- pairs: Optional[Sequence[tuple[cirq.GridQubit, cirq.GridQubit]]],
297
+ qubits: Sequence[cirq.GridQubit] | None,
298
+ pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None,
295
299
  ):
296
300
  res = cirq.experiments.run_rb_and_xeb(
297
301
  sampler=sampler,