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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -11,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
 
16
19
  import numpy as np
@@ -273,7 +276,7 @@ def test_clifford_trial_result_repr_pretty():
273
276
  final_simulator_state=final_simulator_state,
274
277
  )
275
278
 
276
- cirq.testing.assert_repr_pretty(result, "measurements: m=1\n" "output state: |0⟩")
279
+ cirq.testing.assert_repr_pretty(result, "measurements: m=1\noutput state: |0⟩")
277
280
  cirq.testing.assert_repr_pretty(result, "cirq.CliffordTrialResult(...)", cycle=True)
278
281
 
279
282
 
@@ -282,7 +285,7 @@ def test_clifford_step_result_str():
282
285
  result = next(
283
286
  cirq.CliffordSimulator().simulate_moment_steps(cirq.Circuit(cirq.measure(q0, key='m')))
284
287
  )
285
- assert str(result) == "m=0\n" "|0⟩"
288
+ assert str(result) == "m=0\n|0⟩"
286
289
 
287
290
 
288
291
  def test_clifford_step_result_repr_pretty():
@@ -290,7 +293,7 @@ def test_clifford_step_result_repr_pretty():
290
293
  result = next(
291
294
  cirq.CliffordSimulator().simulate_moment_steps(cirq.Circuit(cirq.measure(q0, key='m')))
292
295
  )
293
- cirq.testing.assert_repr_pretty(result, "m=0\n" "|0⟩")
296
+ cirq.testing.assert_repr_pretty(result, "m=0\n|0⟩")
294
297
  cirq.testing.assert_repr_pretty(result, "cirq.CliffordSimulatorStateResult(...)", cycle=True)
295
298
 
296
299
 
@@ -567,7 +570,7 @@ def test_valid_apply_measurement():
567
570
  q0 = cirq.LineQubit(0)
568
571
  state = cirq.CliffordState(qubit_map={q0: 0}, initial_state=1)
569
572
  measurements = {}
570
- _ = state.apply_measurement(
573
+ state.apply_measurement(
571
574
  cirq.measure(q0), measurements, np.random.RandomState(), collapse_state_vector=False
572
575
  )
573
576
  assert measurements == {'q(0)': [1]}
@@ -11,17 +11,20 @@
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
  """A protocol for implementing high performance clifford tableau evolutions
15
16
  for Clifford Simulator."""
16
17
 
17
- from typing import Optional, Sequence, TYPE_CHECKING
18
+ from __future__ import annotations
18
19
 
19
- import numpy as np
20
+ from typing import Sequence, TYPE_CHECKING
20
21
 
21
22
  from cirq.qis import clifford_tableau
22
23
  from cirq.sim.clifford.stabilizer_simulation_state import StabilizerSimulationState
23
24
 
24
25
  if TYPE_CHECKING:
26
+ import numpy as np
27
+
25
28
  import cirq
26
29
 
27
30
 
@@ -30,10 +33,10 @@ class CliffordTableauSimulationState(StabilizerSimulationState[clifford_tableau.
30
33
 
31
34
  def __init__(
32
35
  self,
33
- tableau: 'cirq.CliffordTableau',
34
- prng: Optional[np.random.RandomState] = None,
35
- qubits: Optional[Sequence['cirq.Qid']] = None,
36
- classical_data: Optional['cirq.ClassicalDataStore'] = None,
36
+ tableau: cirq.CliffordTableau,
37
+ prng: np.random.RandomState | None = None,
38
+ qubits: Sequence[cirq.Qid] | None = None,
39
+ classical_data: cirq.ClassicalDataStore | None = None,
37
40
  ):
38
41
  """Inits CliffordTableauSimulationState.
39
42
 
@@ -51,5 +54,5 @@ class CliffordTableauSimulationState(StabilizerSimulationState[clifford_tableau.
51
54
  super().__init__(state=tableau, prng=prng, qubits=qubits, classical_data=classical_data)
52
55
 
53
56
  @property
54
- def tableau(self) -> 'cirq.CliffordTableau':
57
+ def tableau(self) -> cirq.CliffordTableau:
55
58
  return self.state
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Tuple
15
+ from __future__ import annotations
16
16
 
17
17
  import numpy as np
18
18
  import pytest
@@ -20,13 +20,13 @@ import pytest
20
20
  import cirq
21
21
 
22
22
 
23
- def test_unitary_fallback():
23
+ def test_unitary_fallback() -> None:
24
24
  class UnitaryXGate(cirq.testing.SingleQubitGate):
25
25
  def _unitary_(self):
26
26
  return np.array([[0, 1], [1, 0]])
27
27
 
28
28
  class UnitaryYGate(cirq.Gate):
29
- def _qid_shape_(self) -> Tuple[int, ...]:
29
+ def _qid_shape_(self) -> tuple[int, ...]:
30
30
  return (2,)
31
31
 
32
32
  def _unitary_(self):
@@ -57,7 +57,7 @@ def test_unitary_fallback():
57
57
  assert args.tableau == expected_args.tableau
58
58
 
59
59
 
60
- def test_cannot_act():
60
+ def test_cannot_act() -> None:
61
61
  class NoDetails:
62
62
  pass
63
63
 
@@ -77,7 +77,7 @@ def test_cannot_act():
77
77
  cirq.act_on(NoDetailsSingleQubitGate(), args, [cirq.LineQubit(1)])
78
78
 
79
79
 
80
- def test_copy():
80
+ def test_copy() -> None:
81
81
  args = cirq.CliffordTableauSimulationState(
82
82
  tableau=cirq.CliffordTableau(num_qubits=3),
83
83
  qubits=cirq.LineQubit.range(3),
@@ -12,15 +12,17 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Optional, Sequence, TYPE_CHECKING, Union
15
+ from __future__ import annotations
16
16
 
17
- import numpy as np
17
+ from typing import Sequence, TYPE_CHECKING
18
18
 
19
19
  from cirq._compat import proper_repr
20
20
  from cirq.sim.clifford import stabilizer_state_ch_form
21
21
  from cirq.sim.clifford.stabilizer_simulation_state import StabilizerSimulationState
22
22
 
23
23
  if TYPE_CHECKING:
24
+ import numpy as np
25
+
24
26
  import cirq
25
27
 
26
28
 
@@ -32,10 +34,10 @@ class StabilizerChFormSimulationState(
32
34
  def __init__(
33
35
  self,
34
36
  *,
35
- prng: Optional[np.random.RandomState] = None,
36
- qubits: Optional[Sequence['cirq.Qid']] = None,
37
- initial_state: Union[int, 'cirq.StabilizerStateChForm'] = 0,
38
- classical_data: Optional['cirq.ClassicalDataStore'] = None,
37
+ prng: np.random.RandomState | None = None,
38
+ qubits: Sequence[cirq.Qid] | None = None,
39
+ initial_state: int | cirq.StabilizerStateChForm = 0,
40
+ classical_data: cirq.ClassicalDataStore | None = None,
39
41
  ):
40
42
  """Initializes with the given state and the axes for the operation.
41
43
 
@@ -12,20 +12,22 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
 
18
20
  import cirq
19
21
 
20
22
 
21
- def test_init_state():
23
+ def test_init_state() -> None:
22
24
  args = cirq.StabilizerChFormSimulationState(qubits=cirq.LineQubit.range(1), initial_state=1)
23
25
  np.testing.assert_allclose(args.state.state_vector(), [0, 1])
24
26
  with pytest.raises(ValueError, match='Must specify qubits'):
25
27
  _ = cirq.StabilizerChFormSimulationState(initial_state=1)
26
28
 
27
29
 
28
- def test_cannot_act():
30
+ def test_cannot_act() -> None:
29
31
  class NoDetails(cirq.testing.SingleQubitGate):
30
32
  pass
31
33
 
@@ -35,7 +37,7 @@ def test_cannot_act():
35
37
  cirq.act_on(NoDetails(), args, qubits=())
36
38
 
37
39
 
38
- def test_gate_with_act_on():
40
+ def test_gate_with_act_on() -> None:
39
41
  class CustomGate(cirq.testing.SingleQubitGate):
40
42
  def _act_on_(self, sim_state, qubits):
41
43
  if isinstance(sim_state, cirq.StabilizerChFormSimulationState):
@@ -53,7 +55,7 @@ def test_gate_with_act_on():
53
55
  np.testing.assert_allclose(state.gamma, [0, 1, 0])
54
56
 
55
57
 
56
- def test_unitary_fallback_y():
58
+ def test_unitary_fallback_y() -> None:
57
59
  class UnitaryYGate(cirq.Gate):
58
60
  def num_qubits(self) -> int:
59
61
  return 1
@@ -72,7 +74,7 @@ def test_unitary_fallback_y():
72
74
  np.testing.assert_allclose(args.state.state_vector(), expected_args.state.state_vector())
73
75
 
74
76
 
75
- def test_unitary_fallback_h():
77
+ def test_unitary_fallback_h() -> None:
76
78
  class UnitaryHGate(cirq.Gate):
77
79
  def num_qubits(self) -> int:
78
80
  return 1
@@ -91,7 +93,7 @@ def test_unitary_fallback_h():
91
93
  np.testing.assert_allclose(args.state.state_vector(), expected_args.state.state_vector())
92
94
 
93
95
 
94
- def test_copy():
96
+ def test_copy() -> None:
95
97
  args = cirq.StabilizerChFormSimulationState(
96
98
  qubits=cirq.LineQubit.range(3), prng=np.random.RandomState()
97
99
  )
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Dict, List, Sequence
15
+ from __future__ import annotations
16
+
17
+ from typing import Sequence
16
18
 
17
19
  import numpy as np
18
20
 
@@ -26,7 +28,7 @@ from cirq.work import sampler
26
28
  class StabilizerSampler(sampler.Sampler):
27
29
  """An efficient sampler for stabilizer circuits."""
28
30
 
29
- def __init__(self, *, seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None):
31
+ def __init__(self, *, seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None):
30
32
  """Inits StabilizerSampler.
31
33
 
32
34
  Args:
@@ -36,18 +38,18 @@ class StabilizerSampler(sampler.Sampler):
36
38
  self._prng = value.parse_random_state(seed)
37
39
 
38
40
  def run_sweep(
39
- self, program: 'cirq.AbstractCircuit', params: 'cirq.Sweepable', repetitions: int = 1
40
- ) -> Sequence['cirq.Result']:
41
- results: List[cirq.Result] = []
41
+ self, program: cirq.AbstractCircuit, params: cirq.Sweepable, repetitions: int = 1
42
+ ) -> Sequence[cirq.Result]:
43
+ results: list[cirq.Result] = []
42
44
  for param_resolver in cirq.to_resolvers(params):
43
45
  resolved_circuit = cirq.resolve_parameters(program, param_resolver)
44
46
  measurements = self._run(resolved_circuit, repetitions=repetitions)
45
47
  results.append(cirq.ResultDict(params=param_resolver, measurements=measurements))
46
48
  return results
47
49
 
48
- def _run(self, circuit: 'cirq.AbstractCircuit', repetitions: int) -> Dict[str, np.ndarray]:
50
+ def _run(self, circuit: cirq.AbstractCircuit, repetitions: int) -> dict[str, np.ndarray]:
49
51
 
50
- measurements: Dict[str, List[np.ndarray]] = {
52
+ measurements: dict[str, list[np.ndarray]] = {
51
53
  key: [] for key in protocols.measurement_key_names(circuit)
52
54
  }
53
55
  qubits = circuit.all_qubits()
@@ -12,12 +12,14 @@
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
  import cirq
18
20
 
19
21
 
20
- def test_produces_samples():
22
+ def test_produces_samples() -> None:
21
23
  a, b = cirq.LineQubit.range(2)
22
24
  c = cirq.Circuit(cirq.H(a), cirq.CNOT(a, b), cirq.measure(a, key='a'), cirq.measure(b, key='b'))
23
25
 
@@ -26,7 +28,7 @@ def test_produces_samples():
26
28
  assert np.all(result['a'] ^ result['b'] == 0)
27
29
 
28
30
 
29
- def test_reset():
31
+ def test_reset() -> None:
30
32
  q = cirq.LineQubit(0)
31
33
  sampler = cirq.StabilizerSampler()
32
34
  c = cirq.Circuit(cirq.X(q), cirq.reset(q), cirq.measure(q))
@@ -12,11 +12,12 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import abc
16
18
  from types import NotImplementedType
17
- from typing import Any, cast, Generic, Optional, Sequence, TYPE_CHECKING, TypeVar, Union
19
+ from typing import Any, cast, Generic, Sequence, TYPE_CHECKING, TypeVar
18
20
 
19
- import numpy as np
20
21
  import sympy
21
22
 
22
23
  from cirq import linalg, ops, protocols
@@ -26,6 +27,8 @@ from cirq.protocols import has_unitary, num_qubits, unitary
26
27
  from cirq.sim.simulation_state import SimulationState
27
28
 
28
29
  if TYPE_CHECKING:
30
+ import numpy as np
31
+
29
32
  import cirq
30
33
 
31
34
 
@@ -41,9 +44,9 @@ class StabilizerSimulationState(
41
44
  self,
42
45
  *,
43
46
  state: TStabilizerState,
44
- prng: Optional[np.random.RandomState] = None,
45
- qubits: Optional[Sequence['cirq.Qid']] = None,
46
- classical_data: Optional['cirq.ClassicalDataStore'] = None,
47
+ prng: np.random.RandomState | None = None,
48
+ qubits: Sequence[cirq.Qid] | None = None,
49
+ classical_data: cirq.ClassicalDataStore | None = None,
47
50
  ):
48
51
  """Initializes the StabilizerSimulationState.
49
52
 
@@ -65,8 +68,8 @@ class StabilizerSimulationState(
65
68
  return self._state
66
69
 
67
70
  def _act_on_fallback_(
68
- self, action: Any, qubits: Sequence['cirq.Qid'], allow_decompose: bool = True
69
- ) -> Union[bool, NotImplementedType]:
71
+ self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
72
+ ) -> bool | NotImplementedType:
70
73
  strats = [self._strat_apply_gate, self._strat_apply_mixture]
71
74
  if allow_decompose:
72
75
  strats.append(self._strat_decompose)
@@ -89,7 +92,7 @@ class StabilizerSimulationState(
89
92
  self._state.apply_cx(target_axis, control_axis, exponent, global_shift)
90
93
  self._state.apply_cx(control_axis, target_axis)
91
94
 
92
- def _strat_apply_gate(self, val: Any, qubits: Sequence['cirq.Qid']) -> bool:
95
+ def _strat_apply_gate(self, val: Any, qubits: Sequence[cirq.Qid]) -> bool:
93
96
  if not protocols.has_stabilizer_effect(val):
94
97
  return NotImplemented
95
98
  gate = val.gate if isinstance(val, ops.Operation) else val
@@ -117,7 +120,7 @@ class StabilizerSimulationState(
117
120
  return NotImplemented
118
121
  return True
119
122
 
120
- def _strat_apply_mixture(self, val: Any, qubits: Sequence['cirq.Qid']) -> bool:
123
+ def _strat_apply_mixture(self, val: Any, qubits: Sequence[cirq.Qid]) -> bool:
121
124
  mixture = protocols.mixture(val, None)
122
125
  if mixture is None:
123
126
  return NotImplemented
@@ -129,9 +132,7 @@ class StabilizerSimulationState(
129
132
  matrix_gates.MatrixGate(unitaries[index]), qubits
130
133
  )
131
134
 
132
- def _strat_act_from_single_qubit_decompose(
133
- self, val: Any, qubits: Sequence['cirq.Qid']
134
- ) -> bool:
135
+ def _strat_act_from_single_qubit_decompose(self, val: Any, qubits: Sequence[cirq.Qid]) -> bool:
135
136
  if num_qubits(val) == 1:
136
137
  if not has_unitary(val):
137
138
  return NotImplemented
@@ -148,7 +149,7 @@ class StabilizerSimulationState(
148
149
 
149
150
  return NotImplemented
150
151
 
151
- def _strat_decompose(self, val: Any, qubits: Sequence['cirq.Qid']) -> bool:
152
+ def _strat_decompose(self, val: Any, qubits: Sequence[cirq.Qid]) -> bool:
152
153
  gate = val.gate if isinstance(val, ops.Operation) else val
153
154
  operations = protocols.decompose_once_with_qubits(gate, qubits, None)
154
155
  if operations is None or not all(protocols.has_stabilizer_effect(op) for op in operations):
@@ -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 unittest.mock as mock
16
18
 
17
19
  import numpy as np
@@ -20,7 +22,7 @@ import sympy
20
22
  import cirq
21
23
 
22
24
 
23
- def test_apply_gate():
25
+ def test_apply_gate() -> None:
24
26
  q0, q1 = cirq.LineQubit.range(2)
25
27
  state = mock.Mock()
26
28
  args = cirq.StabilizerSimulationState(state=state, qubits=[q0, q1])
@@ -89,7 +91,7 @@ def test_apply_gate():
89
91
  state.apply_x.assert_not_called()
90
92
 
91
93
 
92
- def test_apply_mixture():
94
+ def test_apply_mixture() -> None:
93
95
  q0 = cirq.LineQubit(0)
94
96
  state = mock.Mock()
95
97
  args = cirq.StabilizerSimulationState(state=state, qubits=[q0])
@@ -100,7 +102,7 @@ def test_apply_mixture():
100
102
  assert 10 < state.apply_x.call_count < 90
101
103
 
102
104
 
103
- def test_act_from_single_qubit_decompose():
105
+ def test_act_from_single_qubit_decompose() -> None:
104
106
  q0 = cirq.LineQubit(0)
105
107
  state = mock.Mock()
106
108
  args = cirq.StabilizerSimulationState(state=state, qubits=[q0])
@@ -113,7 +115,7 @@ def test_act_from_single_qubit_decompose():
113
115
  state.apply_x.assert_called_with(0, 1.0, 0.0)
114
116
 
115
117
 
116
- def test_decompose():
118
+ def test_decompose() -> None:
117
119
  class XContainer(cirq.Gate):
118
120
  def _decompose_(self, qs):
119
121
  return [cirq.X(*qs)]
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Any, Dict, List, Sequence
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Sequence
16
18
 
17
19
  import numpy as np
18
20
 
@@ -61,7 +63,7 @@ class StabilizerStateChForm(qis.StabilizerState):
61
63
  if val:
62
64
  self.apply_x(i)
63
65
 
64
- def _json_dict_(self) -> Dict[str, Any]:
66
+ def _json_dict_(self) -> dict[str, Any]:
65
67
  return protocols.obj_to_dict_helper(self, ['n', 'G', 'F', 'M', 'gamma', 'v', 's', 'omega'])
66
68
 
67
69
  @classmethod
@@ -81,7 +83,7 @@ class StabilizerStateChForm(qis.StabilizerState):
81
83
  def _value_equality_values_(self) -> Any:
82
84
  return (self.n, self.G, self.F, self.M, self.gamma, self.v, self.s, self.omega)
83
85
 
84
- def copy(self, deep_copy_buffers: bool = True) -> 'cirq.StabilizerStateChForm':
86
+ def copy(self, deep_copy_buffers: bool = True) -> cirq.StabilizerStateChForm:
85
87
  copy = StabilizerStateChForm(self.n)
86
88
 
87
89
  copy.G = self.G.copy()
@@ -267,7 +269,7 @@ class StabilizerStateChForm(qis.StabilizerState):
267
269
 
268
270
  self.update_sum(t, u, delta=delta)
269
271
 
270
- def kron(self, other: 'cirq.StabilizerStateChForm') -> 'cirq.StabilizerStateChForm':
272
+ def kron(self, other: cirq.StabilizerStateChForm) -> cirq.StabilizerStateChForm:
271
273
  n = self.n + other.n
272
274
  copy = StabilizerStateChForm(n)
273
275
  copy.G[: self.n, : self.n] = self.G
@@ -282,14 +284,14 @@ class StabilizerStateChForm(qis.StabilizerState):
282
284
  copy.omega = self.omega * other.omega
283
285
  return copy
284
286
 
285
- def reindex(self, axes: Sequence[int]) -> 'cirq.StabilizerStateChForm':
287
+ def reindex(self, axes: Sequence[int]) -> cirq.StabilizerStateChForm:
286
288
  copy = StabilizerStateChForm(self.n)
287
289
  copy.G = self.G[axes][:, axes]
288
290
  copy.F = self.F[axes][:, axes]
289
- copy.M = self.M[axes][:, axes]
290
- copy.gamma = self.gamma[axes]
291
- copy.v = self.v[axes]
292
- copy.s = self.s[axes]
291
+ copy.M = self.M[axes][:, axes] # type: ignore[assignment]
292
+ copy.gamma = self.gamma[axes] # type: ignore[assignment]
293
+ copy.v = self.v[axes] # type: ignore[assignment]
294
+ copy.s = self.s[axes] # type: ignore[assignment]
293
295
  copy.omega = self.omega
294
296
  return copy
295
297
 
@@ -387,8 +389,8 @@ class StabilizerStateChForm(qis.StabilizerState):
387
389
  self.omega *= coefficient
388
390
 
389
391
  def measure(
390
- self, axes: Sequence[int], seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None
391
- ) -> List[int]:
392
+ self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
393
+ ) -> list[int]:
392
394
  return [self._measure(axis, random_state.parse_random_state(seed)) for axis in axes]
393
395
 
394
396
 
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
 
@@ -22,7 +24,7 @@ import cirq.testing
22
24
  # Github issue: https://github.com/quantumlib/Cirq/issues/3021
23
25
 
24
26
 
25
- def test_initial_state():
27
+ def test_initial_state() -> None:
26
28
  with pytest.raises(ValueError, match='Out of range'):
27
29
  _ = cirq.StabilizerStateChForm(initial_state=-31, num_qubits=5)
28
30
  with pytest.raises(ValueError, match='Out of range'):
@@ -33,7 +35,7 @@ def test_initial_state():
33
35
  np.testing.assert_allclose(state.state_vector(), expected_state_vector)
34
36
 
35
37
 
36
- def test_run():
38
+ def test_run() -> None:
37
39
  (q0, q1, q2) = (cirq.LineQubit(0), cirq.LineQubit(1), cirq.LineQubit(2))
38
40
 
39
41
  """
@@ -14,7 +14,9 @@
14
14
 
15
15
  """Objects and methods for acting efficiently on a density matrix."""
16
16
 
17
- from typing import Any, Callable, List, Optional, Sequence, Tuple, Type, TYPE_CHECKING, Union
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Callable, Sequence, TYPE_CHECKING
18
20
 
19
21
  import numpy as np
20
22
 
@@ -30,7 +32,7 @@ if TYPE_CHECKING:
30
32
  class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
31
33
  """Contains the density matrix and buffers for efficient state evolution."""
32
34
 
33
- def __init__(self, density_matrix: np.ndarray, buffer: Optional[List[np.ndarray]] = None):
35
+ def __init__(self, density_matrix: np.ndarray, buffer: list[np.ndarray] | None = None):
34
36
  """Initializes the object with the inputs.
35
37
 
36
38
  This initializer creates the buffer if necessary.
@@ -55,10 +57,10 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
55
57
  def create(
56
58
  cls,
57
59
  *,
58
- initial_state: Union[np.ndarray, 'cirq.STATE_VECTOR_LIKE'] = 0,
59
- qid_shape: Optional[Tuple[int, ...]] = None,
60
- dtype: Optional[Type[np.complexfloating]] = None,
61
- buffer: Optional[List[np.ndarray]] = None,
60
+ initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE = 0,
61
+ qid_shape: tuple[int, ...] | None = None,
62
+ dtype: type[np.complexfloating] | None = None,
63
+ buffer: list[np.ndarray] | None = None,
62
64
  ):
63
65
  """Creates a buffered density matrix with the requested state.
64
66
 
@@ -91,7 +93,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
91
93
  density_matrix = density_matrix.astype(dtype, copy=False)
92
94
  return cls(density_matrix, buffer)
93
95
 
94
- def copy(self, deep_copy_buffers: bool = True) -> '_BufferedDensityMatrix':
96
+ def copy(self, deep_copy_buffers: bool = True) -> _BufferedDensityMatrix:
95
97
  """Copies the object.
96
98
 
97
99
  Args:
@@ -104,7 +106,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
104
106
  buffer=[b.copy() for b in self._buffer] if deep_copy_buffers else self._buffer,
105
107
  )
106
108
 
107
- def kron(self, other: '_BufferedDensityMatrix') -> '_BufferedDensityMatrix':
109
+ def kron(self, other: _BufferedDensityMatrix) -> _BufferedDensityMatrix:
108
110
  """Creates the Kronecker product with the other density matrix.
109
111
 
110
112
  Args:
@@ -119,7 +121,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
119
121
 
120
122
  def factor(
121
123
  self, axes: Sequence[int], *, validate=True, atol=1e-07
122
- ) -> Tuple['_BufferedDensityMatrix', '_BufferedDensityMatrix']:
124
+ ) -> tuple[_BufferedDensityMatrix, _BufferedDensityMatrix]:
123
125
  """Factors out the desired axes.
124
126
 
125
127
  Args:
@@ -141,7 +143,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
141
143
  remainder = _BufferedDensityMatrix(density_matrix=remainder_tensor)
142
144
  return extracted, remainder
143
145
 
144
- def reindex(self, axes: Sequence[int]) -> '_BufferedDensityMatrix':
146
+ def reindex(self, axes: Sequence[int]) -> _BufferedDensityMatrix:
145
147
  """Transposes the axes of a density matrix to a specified order.
146
148
 
147
149
  Args:
@@ -185,8 +187,8 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
185
187
  return True
186
188
 
187
189
  def measure(
188
- self, axes: Sequence[int], seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None
189
- ) -> List[int]:
190
+ self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
191
+ ) -> list[int]:
190
192
  """Measures the density matrix.
191
193
 
192
194
  Args:
@@ -205,10 +207,7 @@ class _BufferedDensityMatrix(qis.QuantumStateRepresentation):
205
207
  return bits
206
208
 
207
209
  def sample(
208
- self,
209
- axes: Sequence[int],
210
- repetitions: int = 1,
211
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
210
+ self, axes: Sequence[int], repetitions: int = 1, seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
212
211
  ) -> np.ndarray:
213
212
  """Samples the density matrix.
214
213
 
@@ -246,12 +245,12 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
246
245
  def __init__(
247
246
  self,
248
247
  *,
249
- available_buffer: Optional[List[np.ndarray]] = None,
250
- prng: Optional[np.random.RandomState] = None,
251
- qubits: Optional[Sequence['cirq.Qid']] = None,
252
- initial_state: Union[np.ndarray, 'cirq.STATE_VECTOR_LIKE'] = 0,
253
- dtype: Type[np.complexfloating] = np.complex64,
254
- classical_data: Optional['cirq.ClassicalDataStore'] = None,
248
+ available_buffer: list[np.ndarray] | None = None,
249
+ prng: np.random.RandomState | None = None,
250
+ qubits: Sequence[cirq.Qid] | None = None,
251
+ initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE = 0,
252
+ dtype: type[np.complexfloating] = np.complex64,
253
+ classical_data: cirq.ClassicalDataStore | None = None,
255
254
  ):
256
255
  """Inits DensityMatrixSimulationState.
257
256
 
@@ -285,7 +284,7 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
285
284
  )
286
285
  super().__init__(state=state, prng=prng, qubits=qubits, classical_data=classical_data)
287
286
 
288
- def add_qubits(self, qubits: Sequence['cirq.Qid']):
287
+ def add_qubits(self, qubits: Sequence[cirq.Qid]):
289
288
  ret = super().add_qubits(qubits)
290
289
  return (
291
290
  self.kronecker_product(type(self)(qubits=qubits), inplace=True)
@@ -293,7 +292,7 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
293
292
  else ret
294
293
  )
295
294
 
296
- def remove_qubits(self, qubits: Sequence['cirq.Qid']):
295
+ def remove_qubits(self, qubits: Sequence[cirq.Qid]):
297
296
  ret = super().remove_qubits(qubits)
298
297
  if ret is not NotImplemented:
299
298
  return ret
@@ -302,9 +301,9 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
302
301
  return remainder
303
302
 
304
303
  def _act_on_fallback_(
305
- self, action: Any, qubits: Sequence['cirq.Qid'], allow_decompose: bool = True
304
+ self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
306
305
  ) -> bool:
307
- strats: List[Callable[[Any, Any, Sequence['cirq.Qid']], bool]] = [
306
+ strats: list[Callable[[Any, Any, Sequence[cirq.Qid]], bool]] = [
308
307
  _strat_apply_channel_to_state
309
308
  ]
310
309
  if allow_decompose:
@@ -346,7 +345,7 @@ class DensityMatrixSimulationState(SimulationState[_BufferedDensityMatrix]):
346
345
 
347
346
 
348
347
  def _strat_apply_channel_to_state(
349
- action: Any, args: 'cirq.DensityMatrixSimulationState', qubits: Sequence['cirq.Qid']
348
+ action: Any, args: cirq.DensityMatrixSimulationState, qubits: Sequence[cirq.Qid]
350
349
  ) -> bool:
351
350
  """Apply channel to state."""
352
351
  if not args._state.apply_channel(action, args.get_axes(qubits)):