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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,447 @@
1
+ # Copyright 2025 The Cirq Developers
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import itertools
18
+ from concurrent import futures
19
+ from typing import Iterator
20
+
21
+ import networkx as nx
22
+ import numpy as np
23
+ import pytest
24
+
25
+ import cirq
26
+ import cirq.experiments.random_quantum_circuit_generation as rqcg
27
+ from cirq.experiments.benchmarking import parallel_xeb as xeb
28
+
29
+ _QUBITS = cirq.LineQubit.range(2)
30
+ _CIRCUIT_TEMPLATES = [
31
+ cirq.Circuit(cirq.X.on_each(_QUBITS), cirq.CZ(*_QUBITS), cirq.Y.on_each(_QUBITS)),
32
+ cirq.Circuit(cirq.Y.on_each(_QUBITS), cirq.CX(*_QUBITS), cirq.Z.on_each(_QUBITS)),
33
+ cirq.Circuit(cirq.Z.on_each(_QUBITS), cirq.CZ(*_QUBITS), cirq.X.on_each(_QUBITS)),
34
+ ]
35
+ _PAIRS = ((cirq.q(0, 0), cirq.q(0, 1)), (cirq.q(0, 2), cirq.q(0, 3)), (cirq.q(0, 4), cirq.q(0, 5)))
36
+
37
+
38
+ class TestXEBWideCircuitInfo:
39
+
40
+ def test_from_circuit(self):
41
+ permutation = [1, 2, 0]
42
+ target = cirq.CircuitOperation(cirq.FrozenCircuit(cirq.CNOT(*_QUBITS)))
43
+ wide_circuit = xeb.XEBWideCircuitInfo.from_narrow_circuits(
44
+ _CIRCUIT_TEMPLATES, permutation=permutation, pairs=_PAIRS, target=target
45
+ )
46
+ assert wide_circuit == xeb.XEBWideCircuitInfo(
47
+ wide_circuit=cirq.Circuit.from_moments(
48
+ [
49
+ cirq.Y.on_each(*_PAIRS[0]),
50
+ cirq.Z.on_each(*_PAIRS[1]),
51
+ cirq.X.on_each(*_PAIRS[2]),
52
+ ],
53
+ cirq.CircuitOperation(
54
+ cirq.FrozenCircuit(
55
+ cirq.CNOT(*_PAIRS[0]), cirq.CNOT(*_PAIRS[1]), cirq.CNOT(*_PAIRS[2])
56
+ )
57
+ ),
58
+ [
59
+ cirq.Z.on_each(*_PAIRS[0]),
60
+ cirq.X.on_each(*_PAIRS[1]),
61
+ cirq.Y.on_each(*_PAIRS[2]),
62
+ ],
63
+ ),
64
+ pairs=_PAIRS,
65
+ narrow_template_indices=permutation,
66
+ )
67
+
68
+ def test_sliced_circuit(self):
69
+ wid_circuit = xeb.XEBWideCircuitInfo(
70
+ wide_circuit=cirq.Circuit.from_moments(
71
+ [
72
+ cirq.Y.on_each(*_PAIRS[0]),
73
+ cirq.Z.on_each(*_PAIRS[1]),
74
+ cirq.X.on_each(*_PAIRS[2]),
75
+ ],
76
+ cirq.CircuitOperation(
77
+ cirq.FrozenCircuit(
78
+ cirq.CNOT(*_PAIRS[0]), cirq.CNOT(*_PAIRS[1]), cirq.CNOT(*_PAIRS[2])
79
+ )
80
+ ),
81
+ [
82
+ cirq.Z.on_each(*_PAIRS[0]),
83
+ cirq.X.on_each(*_PAIRS[1]),
84
+ cirq.Y.on_each(*_PAIRS[2]),
85
+ ],
86
+ ),
87
+ pairs=_PAIRS,
88
+ narrow_template_indices=[1, 2, 0],
89
+ )
90
+ sliced_circuit = xeb.XEBWideCircuitInfo(
91
+ wide_circuit=cirq.Circuit.from_moments(
92
+ [
93
+ cirq.Y.on_each(*_PAIRS[0]),
94
+ cirq.Z.on_each(*_PAIRS[1]),
95
+ cirq.X.on_each(*_PAIRS[2]),
96
+ ],
97
+ cirq.CircuitOperation(
98
+ cirq.FrozenCircuit(
99
+ cirq.CNOT(*_PAIRS[0]), cirq.CNOT(*_PAIRS[1]), cirq.CNOT(*_PAIRS[2])
100
+ )
101
+ ),
102
+ [
103
+ cirq.Z.on_each(*_PAIRS[0]),
104
+ cirq.X.on_each(*_PAIRS[1]),
105
+ cirq.Y.on_each(*_PAIRS[2]),
106
+ ],
107
+ [cirq.measure(p, key=str(p)) for p in _PAIRS],
108
+ ),
109
+ pairs=_PAIRS,
110
+ narrow_template_indices=[1, 2, 0],
111
+ cycle_depth=1,
112
+ )
113
+
114
+ assert wid_circuit.sliced_circuits([1]) == [sliced_circuit]
115
+
116
+
117
+ def test_create_combination_circuits():
118
+ wide_circuits_info = xeb.create_combination_circuits(
119
+ _CIRCUIT_TEMPLATES,
120
+ [rqcg.CircuitLibraryCombination(layer=None, combinations=[[1, 2, 0]], pairs=_PAIRS)],
121
+ target=cirq.CNOT(*_QUBITS),
122
+ )
123
+
124
+ assert wide_circuits_info == [
125
+ xeb.XEBWideCircuitInfo(
126
+ wide_circuit=cirq.Circuit.from_moments(
127
+ [
128
+ cirq.Y.on_each(*_PAIRS[0]),
129
+ cirq.Z.on_each(*_PAIRS[1]),
130
+ cirq.X.on_each(*_PAIRS[2]),
131
+ ],
132
+ [cirq.CNOT(*_PAIRS[0]), cirq.CNOT(*_PAIRS[1]), cirq.CNOT(*_PAIRS[2])],
133
+ [
134
+ cirq.Z.on_each(*_PAIRS[0]),
135
+ cirq.X.on_each(*_PAIRS[1]),
136
+ cirq.Y.on_each(*_PAIRS[2]),
137
+ ],
138
+ ),
139
+ pairs=_PAIRS,
140
+ narrow_template_indices=[1, 2, 0],
141
+ )
142
+ ]
143
+
144
+
145
+ def test_create_combination_circuits_with_target_dict():
146
+ wide_circuits_info = xeb.create_combination_circuits(
147
+ _CIRCUIT_TEMPLATES,
148
+ [rqcg.CircuitLibraryCombination(layer=None, combinations=[[1, 2, 0]], pairs=_PAIRS)],
149
+ target={_PAIRS[0]: cirq.CNOT(*_QUBITS), _PAIRS[1]: cirq.CZ(*_QUBITS)},
150
+ )
151
+
152
+ # Wide circuit is created for the qubit pairs in the intersection between target.keys()
153
+ # and combination.pairs
154
+ assert wide_circuits_info == [
155
+ xeb.XEBWideCircuitInfo(
156
+ wide_circuit=cirq.Circuit.from_moments(
157
+ [cirq.Y.on_each(*_PAIRS[0]), cirq.Z.on_each(*_PAIRS[1])],
158
+ [cirq.CNOT(*_PAIRS[0]), cirq.CZ(*_PAIRS[1])],
159
+ [cirq.Z.on_each(*_PAIRS[0]), cirq.X.on_each(*_PAIRS[1])],
160
+ ),
161
+ pairs=_PAIRS,
162
+ narrow_template_indices=[1, 2, 0],
163
+ )
164
+ ]
165
+
166
+
167
+ def test_simulate_circuit():
168
+ sim = cirq.Simulator(seed=0)
169
+ circuit = cirq.Circuit.from_moments(
170
+ cirq.X.on_each(_QUBITS),
171
+ cirq.CNOT(*_QUBITS),
172
+ cirq.X.on_each(_QUBITS),
173
+ cirq.CNOT(*_QUBITS),
174
+ cirq.X.on_each(_QUBITS),
175
+ cirq.CNOT(*_QUBITS),
176
+ cirq.X.on_each(_QUBITS),
177
+ )
178
+
179
+ result = xeb.simulate_circuit(sim, circuit, [1, 3])
180
+ np.testing.assert_allclose(result, [[0, 1, 0, 0], [1, 0, 0, 0]]) # |01> # |00>
181
+
182
+
183
+ def test_simulate_circuit_library():
184
+ circuit_templates = [
185
+ cirq.Circuit.from_moments(
186
+ cirq.X.on_each(_QUBITS),
187
+ cirq.CNOT(*_QUBITS),
188
+ cirq.X.on_each(_QUBITS),
189
+ cirq.CNOT(*_QUBITS),
190
+ cirq.X.on_each(_QUBITS),
191
+ cirq.CNOT(*_QUBITS),
192
+ cirq.X.on_each(_QUBITS),
193
+ )
194
+ ]
195
+
196
+ result = xeb.simulate_circuit_library(
197
+ circuit_templates=circuit_templates, target_or_dict=cirq.CNOT(*_QUBITS), cycle_depths=(1, 3)
198
+ )
199
+ np.testing.assert_allclose(result, [[[0, 1, 0, 0], [1, 0, 0, 0]]]) # |01> # |00>
200
+
201
+
202
+ def test_simulate_circuit_library_with_target_dict():
203
+ circuit_templates = [
204
+ cirq.Circuit.from_moments(
205
+ [cirq.H(_QUBITS[0]), cirq.X(_QUBITS[1])],
206
+ cirq.CNOT(*_QUBITS),
207
+ [cirq.H(_QUBITS[0]), cirq.X(_QUBITS[1])],
208
+ cirq.CNOT(*_QUBITS),
209
+ [cirq.H(_QUBITS[0]), cirq.X(_QUBITS[1])],
210
+ cirq.CNOT(*_QUBITS),
211
+ [cirq.H(_QUBITS[0]), cirq.X(_QUBITS[1])],
212
+ )
213
+ ]
214
+
215
+ result = xeb.simulate_circuit_library(
216
+ circuit_templates=circuit_templates,
217
+ target_or_dict={_PAIRS[0]: cirq.CNOT(*_QUBITS), _PAIRS[1]: cirq.CZ(*_QUBITS)},
218
+ cycle_depths=(1, 3),
219
+ )
220
+
221
+ # First pair result.
222
+ np.testing.assert_allclose(result[_PAIRS[0]], [[[0.25, 0.25, 0.25, 0.25], [0, 1, 0, 0]]])
223
+
224
+ # Second pair result.
225
+ np.testing.assert_allclose(result[_PAIRS[1]], [[[0, 0, 1, 0], [1, 0, 0, 0]]]) # |10> # |00>
226
+
227
+
228
+ def test_sample_all_circuits():
229
+ wide_circuits = [
230
+ cirq.Circuit.from_moments(
231
+ [cirq.Y.on_each(*_PAIRS[0]), cirq.Z.on_each(*_PAIRS[1]), cirq.X.on_each(*_PAIRS[2])],
232
+ cirq.CircuitOperation(
233
+ cirq.FrozenCircuit(
234
+ cirq.CNOT(*_PAIRS[0]), cirq.CNOT(*_PAIRS[1]), cirq.CNOT(*_PAIRS[2])
235
+ )
236
+ ),
237
+ [cirq.Z.on_each(*_PAIRS[0]), cirq.X.on_each(*_PAIRS[1]), cirq.Y.on_each(*_PAIRS[2])],
238
+ [cirq.measure(p, key=str(p)) for p in _PAIRS],
239
+ )
240
+ ]
241
+ result = xeb.sample_all_circuits(cirq.Simulator(seed=0), circuits=wide_circuits, repetitions=10)
242
+ assert len(result) == len(wide_circuits)
243
+ assert result[0].keys() == {str(p) for p in _PAIRS}
244
+ np.testing.assert_allclose(
245
+ result[0]['(cirq.GridQubit(0, 0), cirq.GridQubit(0, 1))'], [0, 0, 1, 0]
246
+ ) # |10>
247
+ np.testing.assert_allclose(
248
+ result[0]['(cirq.GridQubit(0, 2), cirq.GridQubit(0, 3))'], [0, 0, 0, 1]
249
+ ) # |11>
250
+ np.testing.assert_allclose(
251
+ result[0]['(cirq.GridQubit(0, 4), cirq.GridQubit(0, 5))'], [0, 1, 0, 0]
252
+ ) # |01>
253
+
254
+
255
+ def test_estimate_fidelities():
256
+ sampling_result = [{str(_PAIRS[0]): np.array([0.15, 0.15, 0.35, 0.35])}]
257
+
258
+ simulation_results = [[np.array([0.1, 0.2, 0.3, 0.4])]]
259
+
260
+ result = xeb.estimate_fidelities(
261
+ sampling_results=sampling_result,
262
+ simulation_results=simulation_results,
263
+ cycle_depths=(1,),
264
+ num_templates=1,
265
+ pairs=_PAIRS[:1],
266
+ wide_circuits_info=[
267
+ xeb.XEBWideCircuitInfo(
268
+ wide_circuit=cirq.Circuit.from_moments(
269
+ [cirq.Y.on_each(*_PAIRS[0])],
270
+ cirq.CNOT(*_PAIRS[0]),
271
+ [cirq.Z.on_each(*_PAIRS[0])],
272
+ cirq.measure(_PAIRS[0], key=str(_PAIRS[0])),
273
+ ),
274
+ cycle_depth=1,
275
+ narrow_template_indices=(0,),
276
+ pairs=_PAIRS[:1],
277
+ )
278
+ ],
279
+ )
280
+
281
+ assert result == [
282
+ xeb.XEBFidelity(pair=_PAIRS[0], cycle_depth=1, fidelity=pytest.approx(0.785, abs=2e-4))
283
+ ]
284
+
285
+
286
+ def test_estimate_fidelities_with_dict_target():
287
+ sampling_result = [{str(_PAIRS[0]): np.array([0.15, 0.15, 0.35, 0.35])}]
288
+
289
+ simulation_results = {_PAIRS[0]: [[np.array([0.1, 0.2, 0.3, 0.4])]]}
290
+
291
+ result = xeb.estimate_fidelities(
292
+ sampling_results=sampling_result,
293
+ simulation_results=simulation_results,
294
+ cycle_depths=(1,),
295
+ num_templates=1,
296
+ pairs=_PAIRS[:1],
297
+ wide_circuits_info=[
298
+ xeb.XEBWideCircuitInfo(
299
+ wide_circuit=cirq.Circuit.from_moments(
300
+ [cirq.Y.on_each(*_PAIRS[0])],
301
+ cirq.CNOT(*_PAIRS[0]),
302
+ [cirq.Z.on_each(*_PAIRS[0])],
303
+ cirq.measure(_PAIRS[0], key=str(_PAIRS[0])),
304
+ ),
305
+ cycle_depth=1,
306
+ narrow_template_indices=(0,),
307
+ pairs=_PAIRS[:1],
308
+ )
309
+ ],
310
+ )
311
+
312
+ assert result == [
313
+ xeb.XEBFidelity(pair=_PAIRS[0], cycle_depth=1, fidelity=pytest.approx(0.785, abs=2e-4))
314
+ ]
315
+
316
+
317
+ def _assert_fidelities_approx_equal(fids, expected: float, atol: float):
318
+ fids = np.asarray(fids).tolist()
319
+ fids.sort(reverse=True)
320
+ fids.pop() # discard smallest to make the test robust to randomness
321
+ np.testing.assert_allclose(fids, expected, atol=atol)
322
+
323
+
324
+ @pytest.mark.parametrize('target', [cirq.CZ, cirq.Circuit(cirq.CZ(*_QUBITS)), cirq.CZ(*_QUBITS)])
325
+ @pytest.mark.parametrize('pairs', [_PAIRS[:1], _PAIRS[:2]])
326
+ def test_parallel_two_qubit_xeb(target, pairs):
327
+ sampler = cirq.DensityMatrixSimulator(noise=cirq.depolarize(0.03), seed=0)
328
+ result = xeb.parallel_two_qubit_xeb(
329
+ sampler=sampler,
330
+ target=target,
331
+ pairs=pairs,
332
+ parameters=xeb.XEBParameters(
333
+ n_circuits=10, n_combinations=10, n_repetitions=10, cycle_depths=range(1, 10, 2)
334
+ ),
335
+ )
336
+ _assert_fidelities_approx_equal(result.fidelities.layer_fid, 0.9, atol=0.3)
337
+
338
+
339
+ class ExampleDevice(cirq.Device):
340
+ @property
341
+ def metadata(self) -> cirq.DeviceMetadata:
342
+ qubits = cirq.GridQubit.rect(3, 2, 4, 3)
343
+ graph = nx.Graph(
344
+ pair
345
+ for pair in itertools.combinations(qubits, 2)
346
+ if abs(pair[0].row - pair[1].row) + abs(pair[0].col - pair[1].col) == 1
347
+ )
348
+ return cirq.DeviceMetadata(qubits, graph)
349
+
350
+
351
+ class ExampleProcessor:
352
+ def get_device(self):
353
+ return ExampleDevice()
354
+
355
+
356
+ class DensityMatrixSimulatorWithProcessor(cirq.DensityMatrixSimulator):
357
+ @property
358
+ def processor(self):
359
+ return ExampleProcessor()
360
+
361
+
362
+ def test_parallel_two_qubit_xeb_with_device():
363
+ target = cirq.CZ
364
+ sampler = DensityMatrixSimulatorWithProcessor(noise=cirq.depolarize(0.03), seed=0)
365
+ result = xeb.parallel_two_qubit_xeb(
366
+ sampler=sampler,
367
+ target=target,
368
+ parameters=xeb.XEBParameters(
369
+ n_circuits=10, n_combinations=10, n_repetitions=10, cycle_depths=range(1, 10, 2)
370
+ ),
371
+ )
372
+ _assert_fidelities_approx_equal(result.fidelities.layer_fid, 0.9, atol=0.3)
373
+ qubits = cirq.GridQubit.rect(3, 2, 4, 3)
374
+ pairs = tuple(
375
+ pair
376
+ for pair in itertools.combinations(qubits, 2)
377
+ if abs(pair[0].row - pair[1].row) + abs(pair[0].col - pair[1].col) == 1
378
+ and pair[0] < pair[1]
379
+ )
380
+ assert result.all_qubit_pairs == pairs
381
+
382
+
383
+ def test_parallel_two_qubit_xeb_with_dict_target():
384
+ target = {p: cirq.Circuit(cirq.CZ(*_QUBITS)) for p in _PAIRS[:2]}
385
+ target[_PAIRS[2]] = cirq.CZ(*_QUBITS)
386
+ sampler = cirq.DensityMatrixSimulator(noise=cirq.depolarize(0.03), seed=0)
387
+ result = xeb.parallel_two_qubit_xeb(
388
+ sampler=sampler,
389
+ target=target,
390
+ parameters=xeb.XEBParameters(
391
+ n_circuits=10, n_combinations=10, n_repetitions=10, cycle_depths=range(1, 10, 2)
392
+ ),
393
+ )
394
+ _assert_fidelities_approx_equal(result.fidelities.layer_fid, 0.9, atol=0.3)
395
+ assert result.all_qubit_pairs == _PAIRS
396
+
397
+
398
+ def test_parallel_two_qubit_xeb_with_ideal_target():
399
+ target = {p: cirq.Circuit(cirq.CZ(*_QUBITS)) for p in _PAIRS[:2]}
400
+ target[_PAIRS[2]] = cirq.CZ(*_QUBITS)
401
+ sampler = cirq.DensityMatrixSimulator(noise=cirq.depolarize(0.03), seed=0)
402
+ result = xeb.parallel_two_qubit_xeb(
403
+ sampler=sampler,
404
+ target=target,
405
+ ideal_target=cirq.CZ,
406
+ parameters=xeb.XEBParameters(
407
+ n_circuits=10, n_combinations=10, n_repetitions=10, cycle_depths=range(1, 10, 2)
408
+ ),
409
+ )
410
+ _assert_fidelities_approx_equal(result.fidelities.layer_fid, 0.9, atol=0.3)
411
+ assert result.all_qubit_pairs == _PAIRS
412
+
413
+
414
+ @pytest.fixture
415
+ def threading_pool() -> Iterator[futures.Executor]:
416
+ with futures.ThreadPoolExecutor(1) as pool:
417
+ yield pool
418
+
419
+
420
+ def test_parallel_two_qubit_xeb_with_dict_target_and_pool(threading_pool):
421
+ target = {p: cirq.Circuit(cirq.CZ(*_QUBITS)) for p in _PAIRS}
422
+ sampler = cirq.DensityMatrixSimulator(noise=cirq.depolarize(0.03), seed=0)
423
+ result = xeb.parallel_two_qubit_xeb(
424
+ sampler=sampler,
425
+ target=target,
426
+ parameters=xeb.XEBParameters(
427
+ n_circuits=10, n_combinations=10, n_repetitions=10, cycle_depths=range(1, 10, 2)
428
+ ),
429
+ pool=threading_pool,
430
+ )
431
+ _assert_fidelities_approx_equal(result.fidelities.layer_fid, 0.9, atol=0.3)
432
+ assert result.all_qubit_pairs == _PAIRS
433
+
434
+
435
+ def test_parallel_two_qubit_xeb_with_invalid_input_raises():
436
+ with pytest.raises(AssertionError):
437
+ _ = xeb.parallel_two_qubit_xeb(
438
+ sampler=cirq.Simulator(seed=0), target={_PAIRS[0]: cirq.CZ}, pairs=_PAIRS
439
+ )
440
+
441
+ with pytest.raises(AssertionError):
442
+ _ = xeb.parallel_two_qubit_xeb(
443
+ sampler=cirq.Simulator(seed=0),
444
+ target=cirq.CZ,
445
+ ideal_target={_PAIRS[0]: cirq.CZ},
446
+ pairs=_PAIRS,
447
+ )
@@ -11,16 +11,22 @@
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."""
15
- from typing import Callable, Mapping, Optional, Sequence
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import Callable, Mapping, Sequence, TYPE_CHECKING
16
20
 
17
21
  import numpy as np
18
22
 
19
- from cirq.circuits import Circuit
20
23
  from cirq.ops import QubitOrder, QubitOrderOrList
21
24
  from cirq.sim import final_state_vector
22
25
  from cirq.value import state_vector_to_probabilities
23
26
 
27
+ if TYPE_CHECKING:
28
+ import cirq
29
+
24
30
 
25
31
  def linear_xeb_fidelity_from_probabilities(
26
32
  hilbert_space_dimension: int, probabilities: Sequence[float]
@@ -132,10 +138,10 @@ def hog_score_xeb_fidelity_from_probabilities(
132
138
 
133
139
 
134
140
  def xeb_fidelity(
135
- circuit: Circuit,
141
+ circuit: cirq.Circuit,
136
142
  bitstrings: Sequence[int],
137
143
  qubit_order: QubitOrderOrList = QubitOrder.DEFAULT,
138
- amplitudes: Optional[Mapping[int, complex]] = None,
144
+ amplitudes: Mapping[int, complex] | None = None,
139
145
  estimator: Callable[[int, Sequence[float]], float] = linear_xeb_fidelity_from_probabilities,
140
146
  ) -> float:
141
147
  """Estimates XEB fidelity from one circuit using user-supplied estimator.
@@ -197,10 +203,10 @@ def xeb_fidelity(
197
203
 
198
204
 
199
205
  def linear_xeb_fidelity(
200
- circuit: Circuit,
206
+ circuit: cirq.Circuit,
201
207
  bitstrings: Sequence[int],
202
208
  qubit_order: QubitOrderOrList = QubitOrder.DEFAULT,
203
- amplitudes: Optional[Mapping[int, complex]] = None,
209
+ amplitudes: Mapping[int, complex] | None = None,
204
210
  ) -> float:
205
211
  """Estimates XEB fidelity from one circuit using linear estimator."""
206
212
  return xeb_fidelity(
@@ -213,10 +219,10 @@ def linear_xeb_fidelity(
213
219
 
214
220
 
215
221
  def log_xeb_fidelity(
216
- circuit: Circuit,
222
+ circuit: cirq.Circuit,
217
223
  bitstrings: Sequence[int],
218
224
  qubit_order: QubitOrderOrList = QubitOrder.DEFAULT,
219
- amplitudes: Optional[Mapping[int, complex]] = None,
225
+ amplitudes: Mapping[int, complex] | None = None,
220
226
  ) -> float:
221
227
  """Estimates XEB fidelity from one circuit using logarithmic estimator."""
222
228
  return xeb_fidelity(
@@ -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 itertools
15
18
  from typing import Sequence
16
19
 
@@ -17,7 +17,10 @@ different pre-measurement rotations.
17
17
  The code is designed to be modular with regards to data collection
18
18
  so that occurs outside of the StateTomographyExperiment class.
19
19
  """
20
- from typing import List, Optional, Sequence, Tuple, TYPE_CHECKING
20
+
21
+ from __future__ import annotations
22
+
23
+ from typing import Sequence, TYPE_CHECKING
21
24
 
22
25
  import numpy as np
23
26
  import sympy
@@ -48,9 +51,7 @@ class StateTomographyExperiment:
48
51
  """
49
52
 
50
53
  def __init__(
51
- self,
52
- qubits: Sequence['cirq.Qid'],
53
- prerotations: Optional[Sequence[Tuple[float, float]]] = None,
54
+ self, qubits: Sequence[cirq.Qid], prerotations: Sequence[tuple[float, float]] | None = None
54
55
  ):
55
56
  """Initializes the rotation protocol and matrix for system.
56
57
 
@@ -69,8 +70,8 @@ class StateTomographyExperiment:
69
70
 
70
71
  phase_exp_vals, exp_vals = zip(*prerotations)
71
72
 
72
- operations: List['cirq.Operation'] = []
73
- sweeps: List['cirq.Sweep'] = []
73
+ operations: list[cirq.Operation] = []
74
+ sweeps: list[cirq.Sweep] = []
74
75
  for i, qubit in enumerate(qubits):
75
76
  phase_exp = sympy.Symbol(f'phase_exp_{i}')
76
77
  exp = sympy.Symbol(f'exp_{i}')
@@ -82,7 +83,7 @@ class StateTomographyExperiment:
82
83
  self.rot_sweep = study.Product(*sweeps)
83
84
  self.mat = self._make_state_tomography_matrix(qubits)
84
85
 
85
- def _make_state_tomography_matrix(self, qubits: Sequence['cirq.Qid']) -> np.ndarray:
86
+ def _make_state_tomography_matrix(self, qubits: Sequence[cirq.Qid]) -> np.ndarray:
86
87
  """Gets the matrix used for solving the linear system of the tomography.
87
88
 
88
89
  Args:
@@ -130,11 +131,11 @@ class StateTomographyExperiment:
130
131
 
131
132
 
132
133
  def state_tomography(
133
- sampler: 'cirq.Sampler',
134
- qubits: Sequence['cirq.Qid'],
135
- circuit: 'cirq.Circuit',
134
+ sampler: cirq.Sampler,
135
+ qubits: Sequence[cirq.Qid],
136
+ circuit: cirq.Circuit,
136
137
  repetitions: int = 1000,
137
- prerotations: Optional[Sequence[Tuple[float, float]]] = None,
138
+ prerotations: Sequence[tuple[float, float]] | None = None,
138
139
  ) -> TomographyResult:
139
140
  """This performs n qubit tomography on a cirq circuit
140
141
 
@@ -166,11 +167,11 @@ def state_tomography(
166
167
 
167
168
 
168
169
  def get_state_tomography_data(
169
- sampler: 'cirq.Sampler',
170
- qubits: Sequence['cirq.Qid'],
171
- circuit: 'cirq.Circuit',
172
- rot_circuit: 'cirq.Circuit',
173
- rot_sweep: 'cirq.Sweep',
170
+ sampler: cirq.Sampler,
171
+ qubits: Sequence[cirq.Qid],
172
+ circuit: cirq.Circuit,
173
+ rot_circuit: cirq.Circuit,
174
+ rot_sweep: cirq.Sweep,
174
175
  repetitions: int = 1000,
175
176
  ) -> np.ndarray:
176
177
  """Gets the data for each rotation string added to the circuit.
@@ -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
  from typing import Sequence
15
18
 
16
19
  import numpy as np
@@ -21,7 +24,7 @@ import cirq
21
24
  Q0, Q1, Q2, Q3 = cirq.LineQubit.range(4)
22
25
 
23
26
 
24
- def test_state_tomography_diagonal():
27
+ def test_state_tomography_diagonal() -> None:
25
28
  n = 2
26
29
  qubits = cirq.LineQubit.range(n)
27
30
  for state in range(2**n):
@@ -42,7 +45,7 @@ def test_state_tomography_diagonal():
42
45
  assert np.allclose(res.data, should_be, atol=0.05)
43
46
 
44
47
 
45
- def test_state_tomography_ghz_state():
48
+ def test_state_tomography_ghz_state() -> None:
46
49
  circuit = cirq.Circuit()
47
50
  circuit.append(cirq.H(cirq.LineQubit(0)))
48
51
  circuit.append(cirq.CNOT(cirq.LineQubit(0), cirq.LineQubit(1)))
@@ -61,7 +64,7 @@ def test_state_tomography_ghz_state():
61
64
  assert np.allclose(res.data, should_be, atol=0.05)
62
65
 
63
66
 
64
- def test_make_experiment_no_rots():
67
+ def test_make_experiment_no_rots() -> None:
65
68
  exp = cirq.experiments.StateTomographyExperiment(
66
69
  [cirq.LineQubit(0), cirq.LineQubit(1), cirq.LineQubit(2)]
67
70
  )
@@ -97,7 +100,7 @@ def compute_density_matrix(circuit: cirq.Circuit, qubits: Sequence[cirq.Qid]) ->
97
100
  ),
98
101
  ),
99
102
  )
100
- def test_density_matrix_from_state_tomography_is_correct(circuit, qubits):
103
+ def test_density_matrix_from_state_tomography_is_correct(circuit, qubits) -> None:
101
104
  sim = cirq.Simulator(seed=87539319)
102
105
  tomography_result = cirq.experiments.state_tomography(sim, qubits, circuit, repetitions=5000)
103
106
  actual_rho = tomography_result.data
@@ -115,7 +118,7 @@ def test_density_matrix_from_state_tomography_is_correct(circuit, qubits):
115
118
  cirq.Circuit(cirq.X(Q0) ** 0.25, cirq.ISWAP(Q0, Q1)),
116
119
  ),
117
120
  )
118
- def test_agrees_with_two_qubit_state_tomography(circuit):
121
+ def test_agrees_with_two_qubit_state_tomography(circuit) -> None:
119
122
  qubits = (Q0, Q1)
120
123
  sim = cirq.Simulator(seed=87539319)
121
124
  tomography_result = cirq.experiments.state_tomography(sim, qubits, circuit, repetitions=5000)
@@ -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
  from typing import Sequence
16
18
 
17
19
  import numpy as np
@@ -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
 
17
19
  from cirq.experiments import purity_from_probabilities