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
@@ -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
  """Estimation of fidelity associated with experimental circuit executions."""
16
+
17
+ from __future__ import annotations
18
+
15
19
  import dataclasses
16
20
  from abc import ABC, abstractmethod
17
- from typing import Dict, Iterable, List, Optional, Sequence, Tuple, TYPE_CHECKING
21
+ from typing import Iterable, Sequence, TYPE_CHECKING
18
22
 
19
23
  import numpy as np
20
24
  import pandas as pd
@@ -41,10 +45,10 @@ THETA_SYMBOL, ZETA_SYMBOL, CHI_SYMBOL, GAMMA_SYMBOL, PHI_SYMBOL = sympy.symbols(
41
45
 
42
46
  def benchmark_2q_xeb_fidelities(
43
47
  sampled_df: pd.DataFrame,
44
- circuits: Sequence['cirq.Circuit'],
45
- cycle_depths: Optional[Sequence[int]] = None,
46
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
47
- pool: Optional['multiprocessing.pool.Pool'] = None,
48
+ circuits: Sequence[cirq.Circuit],
49
+ cycle_depths: Sequence[int] | None = None,
50
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
51
+ pool: multiprocessing.pool.Pool | None = None,
48
52
  ) -> pd.DataFrame:
49
53
  """Simulate and benchmark two-qubit XEB circuits.
50
54
 
@@ -144,21 +148,21 @@ def benchmark_2q_xeb_fidelities(
144
148
  class XEBCharacterizationOptions(ABC):
145
149
  @staticmethod
146
150
  @abstractmethod
147
- def should_parameterize(op: 'cirq.Operation') -> bool:
151
+ def should_parameterize(op: cirq.Operation) -> bool:
148
152
  """Whether to replace `op` with a parameterized version."""
149
153
 
150
154
  @abstractmethod
151
- def get_parameterized_gate(self) -> 'cirq.Gate':
155
+ def get_parameterized_gate(self) -> cirq.Gate:
152
156
  """The parameterized gate to use."""
153
157
 
154
158
  @abstractmethod
155
159
  def get_initial_simplex_and_names(
156
160
  self, initial_simplex_step_size: float = 0.1
157
- ) -> Tuple[np.ndarray, List[str]]:
161
+ ) -> tuple[np.ndarray, list[str]]:
158
162
  """Return an initial Nelder-Mead simplex and the names for each parameter."""
159
163
 
160
164
 
161
- def _try_defaults_from_unitary(gate: 'cirq.Gate') -> Optional[Dict[str, 'cirq.TParamVal']]:
165
+ def _try_defaults_from_unitary(gate: cirq.Gate) -> dict[str, cirq.TParamVal] | None:
162
166
  r"""Try to figure out the PhasedFSim angles from the unitary of the gate.
163
167
 
164
168
  The unitary of a PhasedFSimGate has the form:
@@ -221,10 +225,10 @@ def _try_defaults_from_unitary(gate: 'cirq.Gate') -> Optional[Dict[str, 'cirq.TP
221
225
  return None
222
226
 
223
227
 
224
- def phased_fsim_angles_from_gate(gate: 'cirq.Gate') -> Dict[str, 'cirq.TParamVal']:
228
+ def phased_fsim_angles_from_gate(gate: cirq.Gate) -> dict[str, cirq.TParamVal]:
225
229
  """For a given gate, return a dictionary mapping '{angle}_default' to its noiseless value
226
230
  for the five PhasedFSim angles."""
227
- defaults: Dict[str, 'cirq.TParamVal'] = {
231
+ defaults: dict[str, cirq.TParamVal] = {
228
232
  'theta_default': 0.0,
229
233
  'zeta_default': 0.0,
230
234
  'chi_default': 0.0,
@@ -284,13 +288,13 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
284
288
  characterize_gamma: bool = True
285
289
  characterize_phi: bool = True
286
290
 
287
- theta_default: Optional[float] = None
288
- zeta_default: Optional[float] = None
289
- chi_default: Optional[float] = None
290
- gamma_default: Optional[float] = None
291
- phi_default: Optional[float] = None
291
+ theta_default: float | None = None
292
+ zeta_default: float | None = None
293
+ chi_default: float | None = None
294
+ gamma_default: float | None = None
295
+ phi_default: float | None = None
292
296
 
293
- def _iter_angles(self) -> Iterable[Tuple[bool, Optional[float], 'sympy.Symbol']]:
297
+ def _iter_angles(self) -> Iterable[tuple[bool, float | None, sympy.Symbol]]:
294
298
  yield from (
295
299
  (self.characterize_theta, self.theta_default, THETA_SYMBOL),
296
300
  (self.characterize_zeta, self.zeta_default, ZETA_SYMBOL),
@@ -299,7 +303,7 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
299
303
  (self.characterize_phi, self.phi_default, PHI_SYMBOL),
300
304
  )
301
305
 
302
- def _iter_angles_for_characterization(self) -> Iterable[Tuple[Optional[float], 'sympy.Symbol']]:
306
+ def _iter_angles_for_characterization(self) -> Iterable[tuple[float | None, sympy.Symbol]]:
303
307
  yield from (
304
308
  (default, symbol)
305
309
  for characterize, default, symbol in self._iter_angles()
@@ -308,7 +312,7 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
308
312
 
309
313
  def get_initial_simplex_and_names(
310
314
  self, initial_simplex_step_size: float = 0.1
311
- ) -> Tuple[np.ndarray, List[str]]:
315
+ ) -> tuple[np.ndarray, list[str]]:
312
316
  """Get an initial simplex and parameter names for the optimization implied by these options.
313
317
 
314
318
  The initial simplex initiates the Nelder-Mead optimization parameter. We
@@ -347,7 +351,7 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
347
351
  return ops.PhasedFSimGate(theta=theta, zeta=zeta, chi=chi, gamma=gamma, phi=phi)
348
352
 
349
353
  @staticmethod
350
- def should_parameterize(op: 'cirq.Operation') -> bool:
354
+ def should_parameterize(op: cirq.Operation) -> bool:
351
355
  return isinstance(op.gate, (ops.PhasedFSimGate, ops.ISwapPowGate, ops.FSimGate))
352
356
 
353
357
  def defaults_set(self) -> bool:
@@ -369,7 +373,7 @@ class XEBPhasedFSimCharacterizationOptions(XEBCharacterizationOptions):
369
373
  return False
370
374
 
371
375
  def with_defaults_from_gate(
372
- self, gate: 'cirq.Gate', gate_to_angles_func=phased_fsim_angles_from_gate
376
+ self, gate: cirq.Gate, gate_to_angles_func=phased_fsim_angles_from_gate
373
377
  ):
374
378
  """A new Options class with {angle}_defaults inferred from `gate`.
375
379
 
@@ -397,10 +401,10 @@ def SqrtISwapXEBOptions(*args, **kwargs):
397
401
 
398
402
 
399
403
  def parameterize_circuit(
400
- circuit: 'cirq.Circuit',
404
+ circuit: cirq.Circuit,
401
405
  options: XEBCharacterizationOptions,
402
- target_gatefamily: Optional[ops.GateFamily] = None,
403
- ) -> 'cirq.Circuit':
406
+ target_gatefamily: ops.GateFamily | None = None,
407
+ ) -> cirq.Circuit:
404
408
  """Parameterize PhasedFSim-like gates in a given circuit according to
405
409
  `phased_fsim_options`.
406
410
  """
@@ -417,7 +421,7 @@ def parameterize_circuit(
417
421
  )
418
422
 
419
423
 
420
- QPair_T = Tuple['cirq.Qid', 'cirq.Qid']
424
+ QPair_T = tuple['cirq.Qid', 'cirq.Qid']
421
425
 
422
426
 
423
427
  @dataclasses.dataclass(frozen=True)
@@ -432,21 +436,21 @@ class XEBCharacterizationResult:
432
436
  fitting the characterization.
433
437
  """
434
438
 
435
- optimization_results: Dict[QPair_T, 'scipy.optimize.OptimizeResult']
436
- final_params: Dict[QPair_T, Dict[str, float]]
439
+ optimization_results: dict[QPair_T, scipy.optimize.OptimizeResult]
440
+ final_params: dict[QPair_T, dict[str, float]]
437
441
  fidelities_df: pd.DataFrame
438
442
 
439
443
 
440
444
  def characterize_phased_fsim_parameters_with_xeb(
441
445
  sampled_df: pd.DataFrame,
442
- parameterized_circuits: List['cirq.Circuit'],
446
+ parameterized_circuits: list[cirq.Circuit],
443
447
  cycle_depths: Sequence[int],
444
448
  options: XEBCharacterizationOptions,
445
449
  initial_simplex_step_size: float = 0.1,
446
450
  xatol: float = 1e-3,
447
451
  fatol: float = 1e-3,
448
452
  verbose: bool = True,
449
- pool: Optional['multiprocessing.pool.Pool'] = None,
453
+ pool: multiprocessing.pool.Pool | None = None,
450
454
  ) -> XEBCharacterizationResult:
451
455
  """Run a classical optimization to fit phased fsim parameters to experimental data, and
452
456
  thereby characterize PhasedFSim-like gates.
@@ -496,13 +500,13 @@ def characterize_phased_fsim_parameters_with_xeb(
496
500
  method='nelder-mead',
497
501
  )
498
502
 
499
- final_params: 'cirq.ParamDictType' = dict(zip(names, optimization_result.x))
503
+ final_params: cirq.ParamDictType = dict(zip(names, optimization_result.x))
500
504
  fidelities_df = benchmark_2q_xeb_fidelities(
501
505
  sampled_df, parameterized_circuits, cycle_depths, param_resolver=final_params
502
506
  )
503
507
  return XEBCharacterizationResult(
504
508
  optimization_results={pair: optimization_result},
505
- final_params={pair: final_params}, # type: ignore[dict-item]
509
+ final_params={pair: final_params},
506
510
  fidelities_df=fidelities_df,
507
511
  )
508
512
 
@@ -512,7 +516,7 @@ class _CharacterizePhasedFsimParametersWithXebClosure:
512
516
  """A closure object to wrap `characterize_phased_fsim_parameters_with_xeb` for use in
513
517
  multiprocessing."""
514
518
 
515
- parameterized_circuits: List['cirq.Circuit']
519
+ parameterized_circuits: list[cirq.Circuit]
516
520
  cycle_depths: Sequence[int]
517
521
  options: XEBCharacterizationOptions
518
522
  initial_simplex_step_size: float = 0.1
@@ -535,13 +539,13 @@ class _CharacterizePhasedFsimParametersWithXebClosure:
535
539
 
536
540
  def characterize_phased_fsim_parameters_with_xeb_by_pair(
537
541
  sampled_df: pd.DataFrame,
538
- parameterized_circuits: List['cirq.Circuit'],
542
+ parameterized_circuits: list[cirq.Circuit],
539
543
  cycle_depths: Sequence[int],
540
544
  options: XEBCharacterizationOptions,
541
545
  initial_simplex_step_size: float = 0.1,
542
546
  xatol: float = 1e-3,
543
547
  fatol: float = 1e-3,
544
- pool: Optional['multiprocessing.pool.Pool'] = None,
548
+ pool: multiprocessing.pool.Pool | None = None,
545
549
  ) -> XEBCharacterizationResult:
546
550
  """Run a classical optimization to fit phased fsim parameters to experimental data, and
547
551
  thereby characterize PhasedFSim-like gates grouped by pairs.
@@ -614,7 +618,7 @@ def exponential_decay(cycle_depths: np.ndarray, a: float, layer_fid: float) -> n
614
618
 
615
619
  def _fit_exponential_decay(
616
620
  cycle_depths: np.ndarray, fidelities: np.ndarray
617
- ) -> Tuple[float, float, float, float]:
621
+ ) -> tuple[float, float, float, float]:
618
622
  """Fit an exponential model fidelity = a * layer_fid**x using nonlinear least squares.
619
623
 
620
624
  This uses `exponential_decay` as the function to fit with parameters `a` and `layer_fid`.
@@ -11,23 +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
+
14
15
  """Estimation of fidelity associated with experimental circuit executions."""
16
+
17
+ from __future__ import annotations
18
+
15
19
  import os
16
20
  import time
17
21
  import uuid
18
22
  from dataclasses import dataclass
19
- from typing import (
20
- Any,
21
- Callable,
22
- ContextManager,
23
- Dict,
24
- List,
25
- Optional,
26
- Sequence,
27
- Set,
28
- Tuple,
29
- TYPE_CHECKING,
30
- )
23
+ from typing import Any, Callable, ContextManager, Sequence, TYPE_CHECKING
31
24
 
32
25
  import numpy as np
33
26
  import pandas as pd
@@ -52,16 +45,16 @@ class _Sample2qXEBTask:
52
45
  cycle_depth: int
53
46
  layer_i: int
54
47
  combination_i: int
55
- prepared_circuit: 'cirq.AbstractCircuit'
56
- combination: List[int]
48
+ prepared_circuit: cirq.AbstractCircuit
49
+ combination: list[int]
57
50
 
58
51
 
59
52
  class _SampleInBatches:
60
53
  def __init__(
61
54
  self,
62
- sampler: 'cirq.Sampler',
55
+ sampler: cirq.Sampler,
63
56
  repetitions: int,
64
- combinations_by_layer: List[CircuitLibraryCombination],
57
+ combinations_by_layer: list[CircuitLibraryCombination],
65
58
  ):
66
59
  """This closure will execute a list of `tasks` with one call to
67
60
  `run_batch` on the provided sampler for a given number of repetitions.
@@ -76,7 +69,7 @@ class _SampleInBatches:
76
69
  self.repetitions = repetitions
77
70
  self.combinations_by_layer = combinations_by_layer
78
71
 
79
- def __call__(self, tasks: List[_Sample2qXEBTask]) -> List[Dict[str, Any]]:
72
+ def __call__(self, tasks: list[_Sample2qXEBTask]) -> list[dict[str, Any]]:
80
73
  prepared_circuits = [task.prepared_circuit for task in tasks]
81
74
  results = self.sampler.run_batch(prepared_circuits, repetitions=self.repetitions)
82
75
  timestamp = time.time()
@@ -107,9 +100,9 @@ class _SampleInBatches:
107
100
  return records
108
101
 
109
102
 
110
- def _verify_and_get_two_qubits_from_circuits(circuits: Sequence['cirq.Circuit']):
103
+ def _verify_and_get_two_qubits_from_circuits(circuits: Sequence[cirq.Circuit]):
111
104
  """Make sure each of the provided circuits uses the same two qubits and return them."""
112
- all_qubits_set: Set['cirq.Qid'] = set()
105
+ all_qubits_set: set[cirq.Qid] = set()
113
106
  all_qubits_set = all_qubits_set.union(*(circuit.all_qubits() for circuit in circuits))
114
107
  all_qubits_list = sorted(all_qubits_set)
115
108
  if len(all_qubits_list) != 2:
@@ -119,7 +112,7 @@ def _verify_and_get_two_qubits_from_circuits(circuits: Sequence['cirq.Circuit'])
119
112
  return all_qubits_list
120
113
 
121
114
 
122
- def _verify_two_line_qubits_from_circuits(circuits: Sequence['cirq.Circuit']):
115
+ def _verify_two_line_qubits_from_circuits(circuits: Sequence[cirq.Circuit]):
123
116
  if _verify_and_get_two_qubits_from_circuits(circuits) != devices.LineQubit.range(2):
124
117
  raise ValueError(
125
118
  "`circuits` should be a sequence of circuits each operating "
@@ -165,16 +158,16 @@ class _ZippedCircuit:
165
158
  any behavior. It is propagated to the output result object.
166
159
  """
167
160
 
168
- wide_circuit: 'cirq.Circuit'
169
- pairs: List[Tuple['cirq.Qid', 'cirq.Qid']]
170
- combination: List[int]
161
+ wide_circuit: cirq.Circuit
162
+ pairs: list[tuple[cirq.Qid, cirq.Qid]]
163
+ combination: list[int]
171
164
  layer_i: int
172
165
  combination_i: int
173
166
 
174
167
 
175
168
  def _get_combinations_by_layer_for_isolated_xeb(
176
- circuits: Sequence['cirq.Circuit'],
177
- ) -> Tuple[List[CircuitLibraryCombination], List['cirq.Circuit']]:
169
+ circuits: Sequence[cirq.Circuit],
170
+ ) -> tuple[list[CircuitLibraryCombination], list[cirq.Circuit]]:
178
171
  """Helper function used in `sample_2q_xeb_circuits`.
179
172
 
180
173
  This creates a CircuitLibraryCombination object for isolated XEB. First, the qubits
@@ -195,8 +188,8 @@ def _get_combinations_by_layer_for_isolated_xeb(
195
188
 
196
189
 
197
190
  def _zip_circuits(
198
- circuits: Sequence['cirq.Circuit'], combinations_by_layer: List[CircuitLibraryCombination]
199
- ) -> List[_ZippedCircuit]:
191
+ circuits: Sequence[cirq.Circuit], combinations_by_layer: list[CircuitLibraryCombination]
192
+ ) -> list[_ZippedCircuit]:
200
193
  """Helper function used in `sample_2q_xeb_circuits` to zip together circuits.
201
194
 
202
195
  This takes a sequence of narrow `circuits` and "zips" them together according to the
@@ -210,7 +203,7 @@ def _zip_circuits(
210
203
  ):
211
204
  raise ValueError("`combinations_by_layer` has invalid indices.")
212
205
 
213
- zipped_circuits: List[_ZippedCircuit] = []
206
+ zipped_circuits: list[_ZippedCircuit] = []
214
207
  for layer_i, layer_combinations in enumerate(combinations_by_layer):
215
208
  for combination_i, combination in enumerate(layer_combinations.combinations):
216
209
  wide_circuit = Circuit.zip(
@@ -232,10 +225,10 @@ def _zip_circuits(
232
225
 
233
226
 
234
227
  def _generate_sample_2q_xeb_tasks(
235
- zipped_circuits: List[_ZippedCircuit], cycle_depths: Sequence[int]
236
- ) -> List[_Sample2qXEBTask]:
228
+ zipped_circuits: list[_ZippedCircuit], cycle_depths: Sequence[int]
229
+ ) -> list[_Sample2qXEBTask]:
237
230
  """Helper function used in `sample_2q_xeb_circuits` to prepare circuits in sampling tasks."""
238
- tasks: List[_Sample2qXEBTask] = []
231
+ tasks: list[_Sample2qXEBTask] = []
239
232
  for cycle_depth in cycle_depths:
240
233
  for zipped_circuit in zipped_circuits:
241
234
  circuit_depth = cycle_depth * 2 + 1
@@ -259,14 +252,14 @@ def _generate_sample_2q_xeb_tasks(
259
252
 
260
253
 
261
254
  def _execute_sample_2q_xeb_tasks_in_batches(
262
- tasks: List[_Sample2qXEBTask],
263
- sampler: 'cirq.Sampler',
264
- combinations_by_layer: List[CircuitLibraryCombination],
255
+ tasks: list[_Sample2qXEBTask],
256
+ sampler: cirq.Sampler,
257
+ combinations_by_layer: list[CircuitLibraryCombination],
265
258
  repetitions: int,
266
259
  batch_size: int,
267
260
  progress_bar: Callable[..., ContextManager],
268
- dataset_directory: Optional[str] = None,
269
- ) -> List[Dict[str, Any]]:
261
+ dataset_directory: str | None = None,
262
+ ) -> list[dict[str, Any]]:
270
263
  """Helper function used in `sample_2q_xeb_circuits` to batch and execute sampling tasks."""
271
264
  n_tasks = len(tasks)
272
265
  batched_tasks = [tasks[i : i + batch_size] for i in range(0, n_tasks, batch_size)]
@@ -288,16 +281,16 @@ def _execute_sample_2q_xeb_tasks_in_batches(
288
281
 
289
282
 
290
283
  def sample_2q_xeb_circuits(
291
- sampler: 'cirq.Sampler',
292
- circuits: Sequence['cirq.Circuit'],
284
+ sampler: cirq.Sampler,
285
+ circuits: Sequence[cirq.Circuit],
293
286
  cycle_depths: Sequence[int],
294
287
  *,
295
288
  repetitions: int = 10_000,
296
289
  batch_size: int = 9,
297
- progress_bar: Optional[Callable[..., ContextManager]] = tqdm.tqdm,
298
- combinations_by_layer: Optional[List[CircuitLibraryCombination]] = None,
299
- shuffle: Optional['cirq.RANDOM_STATE_OR_SEED_LIKE'] = None,
300
- dataset_directory: Optional[str] = None,
290
+ progress_bar: Callable[..., ContextManager] | None = tqdm.tqdm,
291
+ combinations_by_layer: list[CircuitLibraryCombination] | None = None,
292
+ shuffle: cirq.RANDOM_STATE_OR_SEED_LIKE | None = None,
293
+ dataset_directory: str | None = None,
301
294
  ):
302
295
  """Sample two-qubit XEB circuits given a sampler.
303
296
 
@@ -348,8 +341,8 @@ def sample_2q_xeb_circuits(
348
341
  # Construct truncated-with-measurement circuits to run.
349
342
  tasks = _generate_sample_2q_xeb_tasks(zipped_circuits, cycle_depths)
350
343
  if shuffle is not None:
351
- shuffle = value.parse_random_state(shuffle)
352
- shuffle.shuffle(tasks)
344
+ prng = value.parse_random_state(shuffle)
345
+ prng.shuffle(tasks) # type: ignore[arg-type]
353
346
 
354
347
  # Batch and run tasks.
355
348
  records = _execute_sample_2q_xeb_tasks_in_batches(
@@ -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 glob
15
18
  import itertools
16
19
  from typing import Iterable
@@ -11,9 +11,13 @@
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
  """Estimation of fidelity associated with experimental circuit executions."""
16
+
17
+ from __future__ import annotations
18
+
15
19
  from dataclasses import dataclass
16
- from typing import Any, Dict, List, Optional, Sequence, TYPE_CHECKING
20
+ from typing import Any, Sequence, TYPE_CHECKING
17
21
 
18
22
  import numpy as np
19
23
  import pandas as pd
@@ -32,17 +36,17 @@ class _Simulate2qXEBTask:
32
36
 
33
37
  circuit_i: int
34
38
  cycle_depths: Sequence[int]
35
- circuit: 'cirq.Circuit'
36
- param_resolver: 'cirq.ParamResolverOrSimilarType'
39
+ circuit: cirq.Circuit
40
+ param_resolver: cirq.ParamResolverOrSimilarType
37
41
 
38
42
 
39
43
  class _Simulate_2q_XEB_Circuit:
40
44
  """Closure used in `simulate_2q_xeb_circuits` so it works with multiprocessing."""
41
45
 
42
- def __init__(self, simulator: 'cirq.SimulatesIntermediateState'):
46
+ def __init__(self, simulator: cirq.SimulatesIntermediateState):
43
47
  self.simulator = simulator
44
48
 
45
- def __call__(self, task: _Simulate2qXEBTask) -> List[Dict[str, Any]]:
49
+ def __call__(self, task: _Simulate2qXEBTask) -> list[dict[str, Any]]:
46
50
  """Helper function for simulating a given (circuit, cycle_depth)."""
47
51
  circuit_i = task.circuit_i
48
52
  cycle_depths = set(task.cycle_depths)
@@ -53,7 +57,7 @@ class _Simulate_2q_XEB_Circuit:
53
57
  if max(cycle_depths) > circuit_max_cycle_depth:
54
58
  raise ValueError("`circuit` was not long enough to compute all `cycle_depths`.")
55
59
 
56
- records: List[Dict[str, Any]] = []
60
+ records: list[dict[str, Any]] = []
57
61
  for moment_i, step_result in enumerate(
58
62
  self.simulator.simulate_moment_steps(circuit=circuit, param_resolver=param_resolver)
59
63
  ):
@@ -77,11 +81,11 @@ class _Simulate_2q_XEB_Circuit:
77
81
 
78
82
 
79
83
  def simulate_2q_xeb_circuits(
80
- circuits: Sequence['cirq.Circuit'],
84
+ circuits: Sequence[cirq.Circuit],
81
85
  cycle_depths: Sequence[int],
82
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
83
- pool: Optional['multiprocessing.pool.Pool'] = None,
84
- simulator: Optional['cirq.SimulatesIntermediateState'] = None,
86
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
87
+ pool: multiprocessing.pool.Pool | None = None,
88
+ simulator: cirq.SimulatesIntermediateState | None = None,
85
89
  ):
86
90
  """Simulate two-qubit XEB circuits.
87
91
 
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import multiprocessing
18
- from typing import Any, Dict, Iterator, Optional, Sequence
18
+ from typing import Any, Iterator, Sequence
19
19
 
20
20
  import numpy as np
21
21
  import pandas as pd
@@ -74,7 +74,7 @@ def test_simulate_circuit_length_validation():
74
74
  _ = simulate_2q_xeb_circuits(circuits=circuits, cycle_depths=cycle_depths)
75
75
 
76
76
 
77
- def _ref_simulate_2q_xeb_circuit(task: Dict[str, Any]):
77
+ def _ref_simulate_2q_xeb_circuit(task: dict[str, Any]):
78
78
  """Helper function for simulating a given (circuit, cycle_depth)."""
79
79
  circuit_i = task['circuit_i']
80
80
  cycle_depth = task['cycle_depth']
@@ -95,10 +95,10 @@ def _ref_simulate_2q_xeb_circuit(task: Dict[str, Any]):
95
95
 
96
96
 
97
97
  def _ref_simulate_2q_xeb_circuits(
98
- circuits: Sequence['cirq.Circuit'],
98
+ circuits: Sequence[cirq.Circuit],
99
99
  cycle_depths: Sequence[int],
100
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
101
- pool: Optional['multiprocessing.pool.Pool'] = None,
100
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
101
+ pool: multiprocessing.pool.Pool | None = None,
102
102
  ):
103
103
  """Reference implementation for `simulate_2q_xeb_circuits` that
104
104
  does each circuit independently instead of using intermediate states.
@@ -13,9 +13,12 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Provides a method to do z-phase calibration for excitation-preserving gates."""
16
+
17
+ from __future__ import annotations
18
+
16
19
  import multiprocessing
17
20
  import multiprocessing.pool
18
- from typing import Any, Dict, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union
21
+ from typing import Any, Sequence, TYPE_CHECKING
19
22
 
20
23
  import matplotlib.pyplot as plt
21
24
  import numpy as np
@@ -32,20 +35,20 @@ if TYPE_CHECKING:
32
35
 
33
36
 
34
37
  def z_phase_calibration_workflow(
35
- sampler: 'cirq.Sampler',
36
- qubits: Optional[Sequence['cirq.GridQubit']] = None,
37
- two_qubit_gate: 'cirq.Gate' = ops.CZ,
38
- options: Optional[xeb_fitting.XEBPhasedFSimCharacterizationOptions] = None,
38
+ sampler: cirq.Sampler,
39
+ qubits: Sequence[cirq.GridQubit] | None = None,
40
+ two_qubit_gate: cirq.Gate = ops.CZ,
41
+ options: xeb_fitting.XEBPhasedFSimCharacterizationOptions | None = None,
39
42
  n_repetitions: int = 10**4,
40
43
  n_combinations: int = 10,
41
44
  n_circuits: int = 20,
42
45
  cycle_depths: Sequence[int] = tuple(np.arange(3, 100, 20)),
43
- random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
46
+ random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
44
47
  atol: float = 1e-3,
45
- num_workers_or_pool: Union[int, 'multiprocessing.pool.Pool'] = -1,
46
- pairs: Optional[Sequence[Tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
48
+ num_workers_or_pool: int | multiprocessing.pool.Pool = -1,
49
+ pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
47
50
  tags: Sequence[Any] = (),
48
- ) -> Tuple[xeb_fitting.XEBCharacterizationResult, 'pd.DataFrame']:
51
+ ) -> tuple[xeb_fitting.XEBCharacterizationResult, pd.DataFrame]:
49
52
  """Perform z-phase calibration for excitation-preserving gates.
50
53
 
51
54
  For a given excitation-preserving two-qubit gate we assume an error model that can be described
@@ -88,7 +91,7 @@ def z_phase_calibration_workflow(
88
91
  - A `pd.DataFrame` comparing the before and after fidelities.
89
92
  """
90
93
 
91
- pool: Optional['multiprocessing.pool.Pool'] = None
94
+ pool: multiprocessing.pool.Pool | None = None
92
95
  local_pool = False
93
96
  if isinstance(num_workers_or_pool, multiprocessing.pool.Pool):
94
97
  pool = num_workers_or_pool # pragma: no cover
@@ -145,20 +148,20 @@ def z_phase_calibration_workflow(
145
148
 
146
149
 
147
150
  def calibrate_z_phases(
148
- sampler: 'cirq.Sampler',
149
- qubits: Optional[Sequence['cirq.GridQubit']] = None,
150
- two_qubit_gate: 'cirq.Gate' = ops.CZ,
151
- options: Optional[xeb_fitting.XEBPhasedFSimCharacterizationOptions] = None,
151
+ sampler: cirq.Sampler,
152
+ qubits: Sequence[cirq.GridQubit] | None = None,
153
+ two_qubit_gate: cirq.Gate = ops.CZ,
154
+ options: xeb_fitting.XEBPhasedFSimCharacterizationOptions | None = None,
152
155
  n_repetitions: int = 10**4,
153
156
  n_combinations: int = 10,
154
157
  n_circuits: int = 20,
155
158
  cycle_depths: Sequence[int] = tuple(np.arange(3, 100, 20)),
156
- random_state: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
159
+ random_state: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
157
160
  atol: float = 1e-3,
158
- num_workers_or_pool: Union[int, 'multiprocessing.pool.Pool'] = -1,
159
- pairs: Optional[Sequence[Tuple['cirq.GridQubit', 'cirq.GridQubit']]] = None,
161
+ num_workers_or_pool: int | multiprocessing.pool.Pool = -1,
162
+ pairs: Sequence[tuple[cirq.GridQubit, cirq.GridQubit]] | None = None,
160
163
  tags: Sequence[Any] = (),
161
- ) -> Dict[Tuple['cirq.Qid', 'cirq.Qid'], 'cirq.PhasedFSimGate']:
164
+ ) -> dict[tuple[cirq.Qid, cirq.Qid], cirq.PhasedFSimGate]:
162
165
  """Perform z-phase calibration for excitation-preserving gates.
163
166
 
164
167
  For a given excitation-preserving two-qubit gate we assume an error model that can be described
@@ -238,12 +241,12 @@ def calibrate_z_phases(
238
241
 
239
242
 
240
243
  def plot_z_phase_calibration_result(
241
- before_after_df: 'pd.DataFrame',
242
- axes: Optional[np.ndarray[Sequence[Sequence['plt.Axes']], np.dtype[np.object_]]] = None,
243
- pairs: Optional[Sequence[Tuple['cirq.Qid', 'cirq.Qid']]] = None,
244
+ before_after_df: pd.DataFrame,
245
+ axes: np.ndarray[tuple[int, int], np.dtype[np.object_]] | None = None,
246
+ pairs: Sequence[tuple[cirq.Qid, cirq.Qid]] | None = None,
244
247
  *,
245
248
  with_error_bars: bool = False,
246
- ) -> np.ndarray[Sequence[Sequence['plt.Axes']], np.dtype[np.object_]]:
249
+ ) -> np.ndarray[tuple[int, int], np.dtype[np.object_]]:
247
250
  """A helper method to plot the result of running z-phase calibration.
248
251
 
249
252
  Note that the plotted fidelity is a statistical estimate of the true fidelity and as a result
@@ -287,7 +290,7 @@ def plot_z_phase_calibration_result(
287
290
  return axes
288
291
 
289
292
 
290
- def _z_angles(old: ops.PhasedFSimGate, new: ops.PhasedFSimGate) -> Tuple[float, float, float]:
293
+ def _z_angles(old: ops.PhasedFSimGate, new: ops.PhasedFSimGate) -> tuple[float, float, float]:
291
294
  """Computes a set of possible 3 z-phases that result in the change in gamma, zeta, and chi."""
292
295
  # This procedure is the inverse of PhasedFSimGate.from_fsim_rz
293
296
  delta_gamma = new.gamma - old.gamma
@@ -301,8 +304,8 @@ class CalibrationTransformer:
301
304
 
302
305
  def __init__(
303
306
  self,
304
- target: 'cirq.Gate',
305
- calibration_map: Dict[Tuple['cirq.Qid', 'cirq.Qid'], 'cirq.PhasedFSimGate'],
307
+ target: cirq.Gate,
308
+ calibration_map: dict[tuple[cirq.Qid, cirq.Qid], cirq.PhasedFSimGate],
306
309
  ):
307
310
  """Create a CalibrationTransformer.
308
311
 
@@ -327,10 +330,10 @@ class CalibrationTransformer:
327
330
 
328
331
  def __call__(
329
332
  self,
330
- circuit: 'cirq.AbstractCircuit',
333
+ circuit: cirq.AbstractCircuit,
331
334
  *,
332
- context: Optional[transformer_api.TransformerContext] = None,
333
- ) -> 'cirq.Circuit':
335
+ context: transformer_api.TransformerContext | None = None,
336
+ ) -> cirq.Circuit:
334
337
  """Adds 3 ZPowGates around each calibrated gate to cancel the effect of Z phases.
335
338
 
336
339
  Args:
@@ -340,7 +343,7 @@ class CalibrationTransformer:
340
343
  Returns:
341
344
  New circuit with the extra ZPowGates.
342
345
  """
343
- new_moments: List[Union[List[cirq.Operation], 'cirq.Moment']] = []
346
+ new_moments: list[list[cirq.Operation] | cirq.Moment] = []
344
347
  for moment in circuit:
345
348
  before = []
346
349
  after = []