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,9 +11,11 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import itertools
15
18
  import random
16
- from typing import Type, Union
17
19
  from unittest import mock
18
20
 
19
21
  import numpy as np
@@ -30,7 +32,7 @@ def test_invalid_dtype():
30
32
 
31
33
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
32
34
  @pytest.mark.parametrize('split', [True, False])
33
- def test_run_no_measurements(dtype: Type[np.complexfloating], split: bool):
35
+ def test_run_no_measurements(dtype: type[np.complexfloating], split: bool):
34
36
  q0, q1 = cirq.LineQubit.range(2)
35
37
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
36
38
 
@@ -41,7 +43,7 @@ def test_run_no_measurements(dtype: Type[np.complexfloating], split: bool):
41
43
 
42
44
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
43
45
  @pytest.mark.parametrize('split', [True, False])
44
- def test_run_no_results(dtype: Type[np.complexfloating], split: bool):
46
+ def test_run_no_results(dtype: type[np.complexfloating], split: bool):
45
47
  q0, q1 = cirq.LineQubit.range(2)
46
48
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
47
49
 
@@ -52,7 +54,7 @@ def test_run_no_results(dtype: Type[np.complexfloating], split: bool):
52
54
 
53
55
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
54
56
  @pytest.mark.parametrize('split', [True, False])
55
- def test_run_empty_circuit(dtype: Type[np.complexfloating], split: bool):
57
+ def test_run_empty_circuit(dtype: type[np.complexfloating], split: bool):
56
58
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
57
59
  with pytest.raises(ValueError, match="no measurements"):
58
60
  simulator.run(cirq.Circuit())
@@ -60,7 +62,7 @@ def test_run_empty_circuit(dtype: Type[np.complexfloating], split: bool):
60
62
 
61
63
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
62
64
  @pytest.mark.parametrize('split', [True, False])
63
- def test_run_reset(dtype: Type[np.complexfloating], split: bool):
65
+ def test_run_reset(dtype: type[np.complexfloating], split: bool):
64
66
  q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
65
67
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
66
68
  circuit = cirq.Circuit(
@@ -80,7 +82,7 @@ def test_run_reset(dtype: Type[np.complexfloating], split: bool):
80
82
 
81
83
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
82
84
  @pytest.mark.parametrize('split', [True, False])
83
- def test_run_bit_flips(dtype: Type[np.complexfloating], split: bool):
85
+ def test_run_bit_flips(dtype: type[np.complexfloating], split: bool):
84
86
  q0, q1 = cirq.LineQubit.range(2)
85
87
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
86
88
  for b0 in [0, 1]:
@@ -94,7 +96,7 @@ def test_run_bit_flips(dtype: Type[np.complexfloating], split: bool):
94
96
 
95
97
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
96
98
  @pytest.mark.parametrize('split', [True, False])
97
- def test_run_measure_at_end_no_repetitions(dtype: Type[np.complexfloating], split: bool):
99
+ def test_run_measure_at_end_no_repetitions(dtype: type[np.complexfloating], split: bool):
98
100
  q0, q1 = cirq.LineQubit.range(2)
99
101
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
100
102
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -120,7 +122,7 @@ def test_run_repetitions_terminal_measurement_stochastic():
120
122
 
121
123
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
122
124
  @pytest.mark.parametrize('split', [True, False])
123
- def test_run_repetitions_measure_at_end(dtype: Type[np.complexfloating], split: bool):
125
+ def test_run_repetitions_measure_at_end(dtype: type[np.complexfloating], split: bool):
124
126
  q0, q1 = cirq.LineQubit.range(2)
125
127
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
126
128
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -140,7 +142,7 @@ def test_run_repetitions_measure_at_end(dtype: Type[np.complexfloating], split:
140
142
 
141
143
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
142
144
  @pytest.mark.parametrize('split', [True, False])
143
- def test_run_invert_mask_measure_not_terminal(dtype: Type[np.complexfloating], split: bool):
145
+ def test_run_invert_mask_measure_not_terminal(dtype: type[np.complexfloating], split: bool):
144
146
  q0, q1 = cirq.LineQubit.range(2)
145
147
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
146
148
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -161,7 +163,7 @@ def test_run_invert_mask_measure_not_terminal(dtype: Type[np.complexfloating], s
161
163
 
162
164
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
163
165
  @pytest.mark.parametrize('split', [True, False])
164
- def test_run_partial_invert_mask_measure_not_terminal(dtype: Type[np.complexfloating], split: bool):
166
+ def test_run_partial_invert_mask_measure_not_terminal(dtype: type[np.complexfloating], split: bool):
165
167
  q0, q1 = cirq.LineQubit.range(2)
166
168
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
167
169
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -182,7 +184,7 @@ def test_run_partial_invert_mask_measure_not_terminal(dtype: Type[np.complexfloa
182
184
 
183
185
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
184
186
  @pytest.mark.parametrize('split', [True, False])
185
- def test_run_measurement_not_terminal_no_repetitions(dtype: Type[np.complexfloating], split: bool):
187
+ def test_run_measurement_not_terminal_no_repetitions(dtype: type[np.complexfloating], split: bool):
186
188
  q0, q1 = cirq.LineQubit.range(2)
187
189
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
188
190
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -206,7 +208,7 @@ def test_run_measurement_not_terminal_no_repetitions(dtype: Type[np.complexfloat
206
208
 
207
209
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
208
210
  @pytest.mark.parametrize('split', [True, False])
209
- def test_run_repetitions_measurement_not_terminal(dtype: Type[np.complexfloating], split: bool):
211
+ def test_run_repetitions_measurement_not_terminal(dtype: type[np.complexfloating], split: bool):
210
212
  q0, q1 = cirq.LineQubit.range(2)
211
213
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
212
214
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -231,7 +233,7 @@ def test_run_repetitions_measurement_not_terminal(dtype: Type[np.complexfloating
231
233
 
232
234
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
233
235
  @pytest.mark.parametrize('split', [True, False])
234
- def test_run_param_resolver(dtype: Type[np.complexfloating], split: bool):
236
+ def test_run_param_resolver(dtype: type[np.complexfloating], split: bool):
235
237
  q0, q1 = cirq.LineQubit.range(2)
236
238
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
237
239
  for b0 in [0, 1]:
@@ -250,7 +252,7 @@ def test_run_param_resolver(dtype: Type[np.complexfloating], split: bool):
250
252
 
251
253
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
252
254
  @pytest.mark.parametrize('split', [True, False])
253
- def test_run_mixture(dtype: Type[np.complexfloating], split: bool):
255
+ def test_run_mixture(dtype: type[np.complexfloating], split: bool):
254
256
  q0 = cirq.LineQubit(0)
255
257
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
256
258
  circuit = cirq.Circuit(cirq.bit_flip(0.5)(q0), cirq.measure(q0))
@@ -260,7 +262,7 @@ def test_run_mixture(dtype: Type[np.complexfloating], split: bool):
260
262
 
261
263
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
262
264
  @pytest.mark.parametrize('split', [True, False])
263
- def test_run_mixture_with_gates(dtype: Type[np.complexfloating], split: bool):
265
+ def test_run_mixture_with_gates(dtype: type[np.complexfloating], split: bool):
264
266
  q0 = cirq.LineQubit(0)
265
267
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split, seed=23)
266
268
  circuit = cirq.Circuit(cirq.H(q0), cirq.phase_flip(0.5)(q0), cirq.H(q0), cirq.measure(q0))
@@ -271,7 +273,7 @@ def test_run_mixture_with_gates(dtype: Type[np.complexfloating], split: bool):
271
273
 
272
274
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
273
275
  @pytest.mark.parametrize('split', [True, False])
274
- def test_run_correlations(dtype: Type[np.complexfloating], split: bool):
276
+ def test_run_correlations(dtype: type[np.complexfloating], split: bool):
275
277
  q0, q1 = cirq.LineQubit.range(2)
276
278
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
277
279
  circuit = cirq.Circuit(cirq.H(q0), cirq.CNOT(q0, q1), cirq.measure(q0, q1))
@@ -283,7 +285,7 @@ def test_run_correlations(dtype: Type[np.complexfloating], split: bool):
283
285
 
284
286
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
285
287
  @pytest.mark.parametrize('split', [True, False])
286
- def test_run_measure_multiple_qubits(dtype: Type[np.complexfloating], split: bool):
288
+ def test_run_measure_multiple_qubits(dtype: type[np.complexfloating], split: bool):
287
289
  q0, q1 = cirq.LineQubit.range(2)
288
290
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
289
291
  for b0 in [0, 1]:
@@ -295,7 +297,7 @@ def test_run_measure_multiple_qubits(dtype: Type[np.complexfloating], split: boo
295
297
 
296
298
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
297
299
  @pytest.mark.parametrize('split', [True, False])
298
- def test_run_sweeps_param_resolvers(dtype: Type[np.complexfloating], split: bool):
300
+ def test_run_sweeps_param_resolvers(dtype: type[np.complexfloating], split: bool):
299
301
  q0, q1 = cirq.LineQubit.range(2)
300
302
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
301
303
  for b0 in [0, 1]:
@@ -321,7 +323,7 @@ def test_run_sweeps_param_resolvers(dtype: Type[np.complexfloating], split: bool
321
323
 
322
324
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
323
325
  @pytest.mark.parametrize('split', [True, False])
324
- def test_simulate_random_unitary(dtype: Type[np.complexfloating], split: bool):
326
+ def test_simulate_random_unitary(dtype: type[np.complexfloating], split: bool):
325
327
  q0, q1 = cirq.LineQubit.range(2)
326
328
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
327
329
  for _ in range(10):
@@ -339,7 +341,7 @@ def test_simulate_random_unitary(dtype: Type[np.complexfloating], split: bool):
339
341
 
340
342
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
341
343
  @pytest.mark.parametrize('split', [True, False])
342
- def test_simulate_no_circuit(dtype: Type[np.complexfloating], split: bool):
344
+ def test_simulate_no_circuit(dtype: type[np.complexfloating], split: bool):
343
345
  q0, q1 = cirq.LineQubit.range(2)
344
346
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
345
347
  circuit = cirq.Circuit()
@@ -350,7 +352,7 @@ def test_simulate_no_circuit(dtype: Type[np.complexfloating], split: bool):
350
352
 
351
353
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
352
354
  @pytest.mark.parametrize('split', [True, False])
353
- def test_simulate(dtype: Type[np.complexfloating], split: bool):
355
+ def test_simulate(dtype: type[np.complexfloating], split: bool):
354
356
  q0, q1 = cirq.LineQubit.range(2)
355
357
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
356
358
  circuit = cirq.Circuit(cirq.H(q0), cirq.H(q1))
@@ -372,7 +374,7 @@ class _TestMixture(cirq.Gate):
372
374
 
373
375
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
374
376
  @pytest.mark.parametrize('split', [True, False])
375
- def test_simulate_qudits(dtype: Type[np.complexfloating], split: bool):
377
+ def test_simulate_qudits(dtype: type[np.complexfloating], split: bool):
376
378
  q0, q1 = cirq.LineQid.for_qid_shape((3, 4))
377
379
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
378
380
  circuit = cirq.Circuit(cirq.XPowGate(dimension=3)(q0), cirq.XPowGate(dimension=4)(q1) ** 3)
@@ -385,7 +387,7 @@ def test_simulate_qudits(dtype: Type[np.complexfloating], split: bool):
385
387
 
386
388
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
387
389
  @pytest.mark.parametrize('split', [True, False])
388
- def test_simulate_mixtures(dtype: Type[np.complexfloating], split: bool):
390
+ def test_simulate_mixtures(dtype: type[np.complexfloating], split: bool):
389
391
  q0 = cirq.LineQubit(0)
390
392
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
391
393
  circuit = cirq.Circuit(cirq.bit_flip(0.5)(q0), cirq.measure(q0))
@@ -403,7 +405,7 @@ def test_simulate_mixtures(dtype: Type[np.complexfloating], split: bool):
403
405
  @pytest.mark.parametrize(
404
406
  'dtype, split', itertools.product([np.complex64, np.complex128], [True, False])
405
407
  )
406
- def test_simulate_qudit_mixtures(dtype: Type[np.complexfloating], split: bool):
408
+ def test_simulate_qudit_mixtures(dtype: type[np.complexfloating], split: bool):
407
409
  q0 = cirq.LineQid(0, 3)
408
410
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
409
411
  mixture = _TestMixture(
@@ -429,7 +431,7 @@ def test_simulate_qudit_mixtures(dtype: Type[np.complexfloating], split: bool):
429
431
 
430
432
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
431
433
  @pytest.mark.parametrize('split', [True, False])
432
- def test_simulate_bit_flips(dtype: Type[np.complexfloating], split: bool):
434
+ def test_simulate_bit_flips(dtype: type[np.complexfloating], split: bool):
433
435
  q0, q1 = cirq.LineQubit.range(2)
434
436
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
435
437
  for b0 in [0, 1]:
@@ -451,9 +453,9 @@ def test_simulate_bit_flips(dtype: Type[np.complexfloating], split: bool):
451
453
  [1, cirq.StateVectorSimulationState(initial_state=1, qubits=cirq.LineQubit.range(2))],
452
454
  )
453
455
  def test_simulate_initial_state(
454
- dtype: Type[np.complexfloating],
456
+ dtype: type[np.complexfloating],
455
457
  split: bool,
456
- initial_state: Union[int, cirq.StateVectorSimulationState],
458
+ initial_state: int | cirq.StateVectorSimulationState,
457
459
  ):
458
460
  q0, q1 = cirq.LineQubit.range(2)
459
461
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
@@ -468,7 +470,7 @@ def test_simulate_initial_state(
468
470
 
469
471
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
470
472
  @pytest.mark.parametrize('split', [True, False])
471
- def test_simulation_state(dtype: Type[np.complexfloating], split: bool):
473
+ def test_simulation_state(dtype: type[np.complexfloating], split: bool):
472
474
  q0, q1 = cirq.LineQubit.range(2)
473
475
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
474
476
  for b0 in [0, 1]:
@@ -483,7 +485,7 @@ def test_simulation_state(dtype: Type[np.complexfloating], split: bool):
483
485
 
484
486
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
485
487
  @pytest.mark.parametrize('split', [True, False])
486
- def test_simulate_qubit_order(dtype: Type[np.complexfloating], split: bool):
488
+ def test_simulate_qubit_order(dtype: type[np.complexfloating], split: bool):
487
489
  q0, q1 = cirq.LineQubit.range(2)
488
490
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
489
491
  for b0 in [0, 1]:
@@ -497,7 +499,7 @@ def test_simulate_qubit_order(dtype: Type[np.complexfloating], split: bool):
497
499
 
498
500
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
499
501
  @pytest.mark.parametrize('split', [True, False])
500
- def test_simulate_param_resolver(dtype: Type[np.complexfloating], split: bool):
502
+ def test_simulate_param_resolver(dtype: type[np.complexfloating], split: bool):
501
503
  q0, q1 = cirq.LineQubit.range(2)
502
504
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
503
505
  for b0 in [0, 1]:
@@ -516,7 +518,7 @@ def test_simulate_param_resolver(dtype: Type[np.complexfloating], split: bool):
516
518
 
517
519
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
518
520
  @pytest.mark.parametrize('split', [True, False])
519
- def test_simulate_measure_multiple_qubits(dtype: Type[np.complexfloating], split: bool):
521
+ def test_simulate_measure_multiple_qubits(dtype: type[np.complexfloating], split: bool):
520
522
  q0, q1 = cirq.LineQubit.range(2)
521
523
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
522
524
  for b0 in [0, 1]:
@@ -528,7 +530,7 @@ def test_simulate_measure_multiple_qubits(dtype: Type[np.complexfloating], split
528
530
 
529
531
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
530
532
  @pytest.mark.parametrize('split', [True, False])
531
- def test_simulate_sweeps_param_resolver(dtype: Type[np.complexfloating], split: bool):
533
+ def test_simulate_sweeps_param_resolver(dtype: type[np.complexfloating], split: bool):
532
534
  q0, q1 = cirq.LineQubit.range(2)
533
535
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
534
536
  for b0 in [0, 1]:
@@ -555,7 +557,7 @@ def test_simulate_sweeps_param_resolver(dtype: Type[np.complexfloating], split:
555
557
 
556
558
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
557
559
  @pytest.mark.parametrize('split', [True, False])
558
- def test_simulate_moment_steps(dtype: Type[np.complexfloating], split: bool):
560
+ def test_simulate_moment_steps(dtype: type[np.complexfloating], split: bool):
559
561
  q0, q1 = cirq.LineQubit.range(2)
560
562
  circuit = cirq.Circuit(cirq.H(q0), cirq.H(q1), cirq.H(q0), cirq.H(q1))
561
563
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
@@ -568,10 +570,9 @@ def test_simulate_moment_steps(dtype: Type[np.complexfloating], split: bool):
568
570
 
569
571
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
570
572
  @pytest.mark.parametrize('split', [True, False])
571
- def test_simulate_moment_steps_empty_circuit(dtype: Type[np.complexfloating], split: bool):
573
+ def test_simulate_moment_steps_empty_circuit(dtype: type[np.complexfloating], split: bool):
572
574
  circuit = cirq.Circuit()
573
575
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
574
- step = None
575
576
  for step in simulator.simulate_moment_steps(circuit):
576
577
  pass
577
578
  assert np.allclose(step.state_vector(copy=True), np.array([1]))
@@ -580,7 +581,7 @@ def test_simulate_moment_steps_empty_circuit(dtype: Type[np.complexfloating], sp
580
581
 
581
582
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
582
583
  @pytest.mark.parametrize('split', [True, False])
583
- def test_simulate_moment_steps_sample(dtype: Type[np.complexfloating], split: bool):
584
+ def test_simulate_moment_steps_sample(dtype: type[np.complexfloating], split: bool):
584
585
  q0, q1 = cirq.LineQubit.range(2)
585
586
  circuit = cirq.Circuit(cirq.H(q0), cirq.CNOT(q0, q1))
586
587
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
@@ -602,7 +603,7 @@ def test_simulate_moment_steps_sample(dtype: Type[np.complexfloating], split: bo
602
603
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
603
604
  @pytest.mark.parametrize('split', [True, False])
604
605
  def test_simulate_moment_steps_intermediate_measurement(
605
- dtype: Type[np.complexfloating], split: bool
606
+ dtype: type[np.complexfloating], split: bool
606
607
  ):
607
608
  q0 = cirq.LineQubit(0)
608
609
  circuit = cirq.Circuit(cirq.H(q0), cirq.measure(q0), cirq.H(q0))
@@ -620,7 +621,7 @@ def test_simulate_moment_steps_intermediate_measurement(
620
621
 
621
622
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
622
623
  @pytest.mark.parametrize('split', [True, False])
623
- def test_simulate_expectation_values(dtype: Type[np.complexfloating], split: bool):
624
+ def test_simulate_expectation_values(dtype: type[np.complexfloating], split: bool):
624
625
  # Compare with test_expectation_from_state_vector_two_qubit_states
625
626
  # in file: cirq/ops/linear_combinations_test.py
626
627
  q0, q1 = cirq.LineQubit.range(2)
@@ -645,7 +646,7 @@ def test_simulate_expectation_values(dtype: Type[np.complexfloating], split: boo
645
646
 
646
647
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
647
648
  @pytest.mark.parametrize('split', [True, False])
648
- def test_simulate_expectation_values_terminal_measure(dtype: Type[np.complexfloating], split: bool):
649
+ def test_simulate_expectation_values_terminal_measure(dtype: type[np.complexfloating], split: bool):
649
650
  q0 = cirq.LineQubit(0)
650
651
  circuit = cirq.Circuit(cirq.H(q0), cirq.measure(q0))
651
652
  obs = cirq.Z(q0)
@@ -683,7 +684,7 @@ def test_simulate_expectation_values_terminal_measure(dtype: Type[np.complexfloa
683
684
 
684
685
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
685
686
  @pytest.mark.parametrize('split', [True, False])
686
- def test_simulate_expectation_values_qubit_order(dtype: Type[np.complexfloating], split: bool):
687
+ def test_simulate_expectation_values_qubit_order(dtype: type[np.complexfloating], split: bool):
687
688
  q0, q1, q2 = cirq.LineQubit.range(3)
688
689
  circuit = cirq.Circuit(cirq.H(q0), cirq.H(q1), cirq.X(q2))
689
690
  obs = cirq.X(q0) + cirq.X(q1) - cirq.Z(q2)
cirq/sim/state_vector.py CHANGED
@@ -11,10 +11,13 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
14
15
  """Helpers for handling quantum state vectors."""
15
16
 
17
+ from __future__ import annotations
18
+
16
19
  import abc
17
- from typing import List, Mapping, Optional, Sequence, Tuple, TYPE_CHECKING
20
+ from typing import Mapping, Sequence, TYPE_CHECKING
18
21
 
19
22
  import numpy as np
20
23
 
@@ -31,7 +34,7 @@ if TYPE_CHECKING:
31
34
  class StateVectorMixin:
32
35
  """A mixin that provide methods for objects that have a state vector."""
33
36
 
34
- def __init__(self, qubit_map: Optional[Mapping['cirq.Qid', int]] = None, *args, **kwargs):
37
+ def __init__(self, qubit_map: Mapping[cirq.Qid, int] | None = None, *args, **kwargs):
35
38
  """Inits StateVectorMixin.
36
39
 
37
40
  Args:
@@ -47,10 +50,10 @@ class StateVectorMixin:
47
50
  self._qid_shape = None if qubit_map is None else qid_shape
48
51
 
49
52
  @property
50
- def qubit_map(self) -> Mapping['cirq.Qid', int]:
53
+ def qubit_map(self) -> Mapping[cirq.Qid, int]:
51
54
  return self._qubit_map
52
55
 
53
- def _qid_shape_(self) -> Tuple[int, ...]:
56
+ def _qid_shape_(self) -> tuple[int, ...]:
54
57
  if self._qid_shape is None:
55
58
  return NotImplemented
56
59
  return self._qid_shape
@@ -102,7 +105,7 @@ class StateVectorMixin:
102
105
  and non-zero floats of the specified accuracy."""
103
106
  return qis.dirac_notation(self.state_vector(), decimals, qid_shape=self._qid_shape)
104
107
 
105
- def density_matrix_of(self, qubits: Optional[List['cirq.Qid']] = None) -> np.ndarray:
108
+ def density_matrix_of(self, qubits: list[cirq.Qid] | None = None) -> np.ndarray:
106
109
  r"""Returns the density matrix of the state.
107
110
 
108
111
  Calculate the density matrix for the system on the qubits provided.
@@ -141,7 +144,7 @@ class StateVectorMixin:
141
144
  qid_shape=self._qid_shape,
142
145
  )
143
146
 
144
- def bloch_vector_of(self, qubit: 'cirq.Qid') -> np.ndarray:
147
+ def bloch_vector_of(self, qubit: cirq.Qid) -> np.ndarray:
145
148
  """Returns the bloch vector of a qubit in the state.
146
149
 
147
150
  Calculates the bloch vector of the given qubit
@@ -169,9 +172,9 @@ def sample_state_vector(
169
172
  state_vector: np.ndarray,
170
173
  indices: Sequence[int],
171
174
  *, # Force keyword args
172
- qid_shape: Optional[Tuple[int, ...]] = None,
175
+ qid_shape: tuple[int, ...] | None = None,
173
176
  repetitions: int = 1,
174
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
177
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
175
178
  ) -> np.ndarray:
176
179
  """Samples repeatedly from measurements in the computational basis.
177
180
 
@@ -234,10 +237,10 @@ def measure_state_vector(
234
237
  state_vector: np.ndarray,
235
238
  indices: Sequence[int],
236
239
  *, # Force keyword args
237
- qid_shape: Optional[Tuple[int, ...]] = None,
238
- out: Optional[np.ndarray] = None,
239
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
240
- ) -> Tuple[List[int], np.ndarray]:
240
+ qid_shape: tuple[int, ...] | None = None,
241
+ out: np.ndarray | None = None,
242
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
243
+ ) -> tuple[list[int], np.ndarray]:
241
244
  """Performs a measurement of the state in the computational basis.
242
245
 
243
246
  This does not modify `state` unless the optional `out` is `state`.
@@ -13,7 +13,10 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Objects and methods for acting efficiently on a state vector."""
16
- from typing import Any, Callable, List, Optional, Sequence, Tuple, Type, TYPE_CHECKING, Union
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Callable, Sequence, TYPE_CHECKING
17
20
 
18
21
  import numpy as np
19
22
 
@@ -29,7 +32,7 @@ if TYPE_CHECKING:
29
32
  class _BufferedStateVector(qis.QuantumStateRepresentation):
30
33
  """Contains the state vector and buffer for efficient state evolution."""
31
34
 
32
- def __init__(self, state_vector: np.ndarray, buffer: Optional[np.ndarray] = None):
35
+ def __init__(self, state_vector: np.ndarray, buffer: np.ndarray | None = None):
33
36
  """Initializes the object with the inputs.
34
37
 
35
38
  This initializer creates the buffer if necessary.
@@ -50,10 +53,10 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
50
53
  def create(
51
54
  cls,
52
55
  *,
53
- initial_state: Union[np.ndarray, 'cirq.STATE_VECTOR_LIKE'] = 0,
54
- qid_shape: Optional[Tuple[int, ...]] = None,
55
- dtype: Optional[Type[np.complexfloating]] = None,
56
- buffer: Optional[np.ndarray] = None,
56
+ initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE = 0,
57
+ qid_shape: tuple[int, ...] | None = None,
58
+ dtype: type[np.complexfloating] | None = None,
59
+ buffer: np.ndarray | None = None,
57
60
  ):
58
61
  """Initializes the object with the inputs.
59
62
 
@@ -85,7 +88,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
85
88
  state_vector = state_vector.astype(dtype, copy=False)
86
89
  return cls(state_vector, buffer)
87
90
 
88
- def copy(self, deep_copy_buffers: bool = True) -> '_BufferedStateVector':
91
+ def copy(self, deep_copy_buffers: bool = True) -> _BufferedStateVector:
89
92
  """Copies the object.
90
93
 
91
94
  Args:
@@ -98,7 +101,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
98
101
  buffer=self._buffer.copy() if deep_copy_buffers else self._buffer,
99
102
  )
100
103
 
101
- def kron(self, other: '_BufferedStateVector') -> '_BufferedStateVector':
104
+ def kron(self, other: _BufferedStateVector) -> _BufferedStateVector:
102
105
  """Creates the Kronecker product with the other state vector.
103
106
 
104
107
  Args:
@@ -113,7 +116,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
113
116
 
114
117
  def factor(
115
118
  self, axes: Sequence[int], *, validate=True, atol=1e-07
116
- ) -> Tuple['_BufferedStateVector', '_BufferedStateVector']:
119
+ ) -> tuple[_BufferedStateVector, _BufferedStateVector]:
117
120
  """Factors a state vector into two independent state vectors.
118
121
 
119
122
  This function should only be called on state vectors that are known to be separable, such
@@ -143,7 +146,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
143
146
  )
144
147
  return extracted, remainder
145
148
 
146
- def reindex(self, axes: Sequence[int]) -> '_BufferedStateVector':
149
+ def reindex(self, axes: Sequence[int]) -> _BufferedStateVector:
147
150
  """Transposes the axes of a state vector to a specified order.
148
151
 
149
152
  Args:
@@ -176,7 +179,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
176
179
  self._swap_target_tensor_for(new_target_tensor)
177
180
  return True
178
181
 
179
- def apply_mixture(self, action: Any, axes: Sequence[int], prng) -> Optional[int]:
182
+ def apply_mixture(self, action: Any, axes: Sequence[int], prng) -> int | None:
180
183
  """Apply mixture to state.
181
184
 
182
185
  Args:
@@ -198,7 +201,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
198
201
  self._swap_target_tensor_for(self._buffer)
199
202
  return index
200
203
 
201
- def apply_channel(self, action: Any, axes: Sequence[int], prng) -> Optional[int]:
204
+ def apply_channel(self, action: Any, axes: Sequence[int], prng) -> int | None:
202
205
  """Apply channel to state.
203
206
 
204
207
  Args:
@@ -253,8 +256,8 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
253
256
  return index
254
257
 
255
258
  def measure(
256
- self, axes: Sequence[int], seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None
257
- ) -> List[int]:
259
+ self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
260
+ ) -> list[int]:
258
261
  """Measures the state vector.
259
262
 
260
263
  Args:
@@ -269,10 +272,7 @@ class _BufferedStateVector(qis.QuantumStateRepresentation):
269
272
  return bits
270
273
 
271
274
  def sample(
272
- self,
273
- axes: Sequence[int],
274
- repetitions: int = 1,
275
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
275
+ self, axes: Sequence[int], repetitions: int = 1, seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
276
276
  ) -> np.ndarray:
277
277
  """Samples the state vector.
278
278
 
@@ -320,12 +320,12 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
320
320
  def __init__(
321
321
  self,
322
322
  *,
323
- available_buffer: Optional[np.ndarray] = None,
324
- prng: Optional[np.random.RandomState] = None,
325
- qubits: Optional[Sequence['cirq.Qid']] = None,
326
- initial_state: Union[np.ndarray, 'cirq.STATE_VECTOR_LIKE'] = 0,
327
- dtype: Type[np.complexfloating] = np.complex64,
328
- classical_data: Optional['cirq.ClassicalDataStore'] = None,
323
+ available_buffer: np.ndarray | None = None,
324
+ prng: np.random.RandomState | None = None,
325
+ qubits: Sequence[cirq.Qid] | None = None,
326
+ initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE = 0,
327
+ dtype: type[np.complexfloating] = np.complex64,
328
+ classical_data: cirq.ClassicalDataStore | None = None,
329
329
  ):
330
330
  """Inits StateVectorSimulationState.
331
331
 
@@ -356,7 +356,7 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
356
356
  )
357
357
  super().__init__(state=state, prng=prng, qubits=qubits, classical_data=classical_data)
358
358
 
359
- def add_qubits(self, qubits: Sequence['cirq.Qid']):
359
+ def add_qubits(self, qubits: Sequence[cirq.Qid]):
360
360
  ret = super().add_qubits(qubits)
361
361
  return (
362
362
  self.kronecker_product(type(self)(qubits=qubits), inplace=True)
@@ -364,7 +364,7 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
364
364
  else ret
365
365
  )
366
366
 
367
- def remove_qubits(self, qubits: Sequence['cirq.Qid']):
367
+ def remove_qubits(self, qubits: Sequence[cirq.Qid]):
368
368
  ret = super().remove_qubits(qubits)
369
369
  if ret is not NotImplemented:
370
370
  return ret
@@ -373,9 +373,9 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
373
373
  return remainder
374
374
 
375
375
  def _act_on_fallback_(
376
- self, action: Any, qubits: Sequence['cirq.Qid'], allow_decompose: bool = True
376
+ self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
377
377
  ) -> bool:
378
- strats: List[Callable[[Any, Any, Sequence['cirq.Qid']], bool]] = [
378
+ strats: list[Callable[[Any, Any, Sequence[cirq.Qid]], bool]] = [
379
379
  _strat_act_on_state_vector_from_apply_unitary,
380
380
  _strat_act_on_state_vector_from_mixture,
381
381
  _strat_act_on_state_vector_from_channel,
@@ -415,7 +415,7 @@ class StateVectorSimulationState(SimulationState[_BufferedStateVector]):
415
415
 
416
416
 
417
417
  def _strat_act_on_state_vector_from_apply_unitary(
418
- action: Any, args: 'cirq.StateVectorSimulationState', qubits: Sequence['cirq.Qid']
418
+ action: Any, args: cirq.StateVectorSimulationState, qubits: Sequence[cirq.Qid]
419
419
  ) -> bool:
420
420
  if not args._state.apply_unitary(action, args.get_axes(qubits)):
421
421
  return NotImplemented
@@ -423,7 +423,7 @@ def _strat_act_on_state_vector_from_apply_unitary(
423
423
 
424
424
 
425
425
  def _strat_act_on_state_vector_from_mixture(
426
- action: Any, args: 'cirq.StateVectorSimulationState', qubits: Sequence['cirq.Qid']
426
+ action: Any, args: cirq.StateVectorSimulationState, qubits: Sequence[cirq.Qid]
427
427
  ) -> bool:
428
428
  index = args._state.apply_mixture(action, args.get_axes(qubits), args.prng)
429
429
  if index is None:
@@ -435,7 +435,7 @@ def _strat_act_on_state_vector_from_mixture(
435
435
 
436
436
 
437
437
  def _strat_act_on_state_vector_from_channel(
438
- action: Any, args: 'cirq.StateVectorSimulationState', qubits: Sequence['cirq.Qid']
438
+ action: Any, args: cirq.StateVectorSimulationState, qubits: Sequence[cirq.Qid]
439
439
  ) -> bool:
440
440
  index = args._state.apply_channel(action, args.get_axes(qubits), args.prng)
441
441
  if index is None: