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
@@ -14,7 +14,9 @@
14
14
 
15
15
  """Code to handle density matrices."""
16
16
 
17
- from typing import List, Optional, Sequence, Tuple, TYPE_CHECKING
17
+ from __future__ import annotations
18
+
19
+ from typing import Sequence, TYPE_CHECKING
18
20
 
19
21
  import numpy as np
20
22
 
@@ -29,9 +31,9 @@ def sample_density_matrix(
29
31
  density_matrix: np.ndarray,
30
32
  indices: Sequence[int],
31
33
  *, # Force keyword arguments
32
- qid_shape: Optional[Tuple[int, ...]] = None,
34
+ qid_shape: tuple[int, ...] | None = None,
33
35
  repetitions: int = 1,
34
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
36
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
35
37
  ) -> np.ndarray:
36
38
  """Samples repeatedly from measurements in the computational basis.
37
39
 
@@ -94,10 +96,10 @@ def sample_density_matrix(
94
96
  def measure_density_matrix(
95
97
  density_matrix: np.ndarray,
96
98
  indices: Sequence[int],
97
- qid_shape: Optional[Tuple[int, ...]] = None,
98
- out: Optional[np.ndarray] = None,
99
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
100
- ) -> Tuple[List[int], np.ndarray]:
99
+ qid_shape: tuple[int, ...] | None = None,
100
+ out: np.ndarray | None = None,
101
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
102
+ ) -> tuple[list[int], np.ndarray]:
101
103
  """Performs a measurement of the density matrix in the computational basis.
102
104
 
103
105
  This does not modify `density_matrix` unless the optional `out` is
@@ -185,7 +187,7 @@ def measure_density_matrix(
185
187
 
186
188
 
187
189
  def _probs(
188
- density_matrix: np.ndarray, indices: Sequence[int], qid_shape: Tuple[int, ...]
190
+ density_matrix: np.ndarray, indices: Sequence[int], qid_shape: tuple[int, ...]
189
191
  ) -> np.ndarray:
190
192
  """Returns the probabilities for a measurement on the given indices."""
191
193
  # Only diagonal elements matter.
@@ -195,8 +197,8 @@ def _probs(
195
197
 
196
198
 
197
199
  def _validate_density_matrix_qid_shape(
198
- density_matrix: np.ndarray, qid_shape: Tuple[int, ...]
199
- ) -> Tuple[int, ...]:
200
+ density_matrix: np.ndarray, qid_shape: tuple[int, ...]
201
+ ) -> tuple[int, ...]:
200
202
  """Validates that a tensor's shape is a valid shape for qids and returns the
201
203
  qid shape.
202
204
  """
@@ -242,7 +244,7 @@ def _validate_num_qubits(density_matrix: np.ndarray) -> int:
242
244
  return int(row_size).bit_length() - 1
243
245
 
244
246
 
245
- def _indices_shape(qid_shape: Tuple[int, ...], indices: Sequence[int]) -> Tuple[int, ...]:
247
+ def _indices_shape(qid_shape: tuple[int, ...], indices: Sequence[int]) -> tuple[int, ...]:
246
248
  """Validates that the indices have values within range of `len(qid_shape)`."""
247
249
  if any(index < 0 for index in indices):
248
250
  raise IndexError(f'Negative index in indices: {indices}')
@@ -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 itertools
16
18
 
17
19
  import numpy as np
@@ -21,7 +23,7 @@ import cirq
21
23
  import cirq.testing
22
24
 
23
25
 
24
- def test_sample_density_matrix_big_endian():
26
+ def test_sample_density_matrix_big_endian() -> None:
25
27
  results = []
26
28
  for x in range(8):
27
29
  matrix = cirq.to_valid_density_matrix(x, 3)
@@ -32,7 +34,7 @@ def test_sample_density_matrix_big_endian():
32
34
  np.testing.assert_equal(result, expected)
33
35
 
34
36
 
35
- def test_sample_density_matrix_partial_indices():
37
+ def test_sample_density_matrix_partial_indices() -> None:
36
38
  for index in range(3):
37
39
  for x in range(8):
38
40
  matrix = cirq.to_valid_density_matrix(x, 3)
@@ -41,14 +43,14 @@ def test_sample_density_matrix_partial_indices():
41
43
  )
42
44
 
43
45
 
44
- def test_sample_density_matrix_partial_indices_oder():
46
+ def test_sample_density_matrix_partial_indices_oder() -> None:
45
47
  for x in range(8):
46
48
  matrix = cirq.to_valid_density_matrix(x, 3)
47
49
  expected = [[bool(1 & (x >> 0)), bool(1 & (x >> 1))]]
48
50
  np.testing.assert_equal(cirq.sample_density_matrix(matrix, [2, 1]), expected)
49
51
 
50
52
 
51
- def test_sample_density_matrix_partial_indices_all_orders():
53
+ def test_sample_density_matrix_partial_indices_all_orders() -> None:
52
54
  for perm in itertools.permutations([0, 1, 2]):
53
55
  for x in range(8):
54
56
  matrix = cirq.to_valid_density_matrix(x, 3)
@@ -56,7 +58,7 @@ def test_sample_density_matrix_partial_indices_all_orders():
56
58
  np.testing.assert_equal(cirq.sample_density_matrix(matrix, perm), expected)
57
59
 
58
60
 
59
- def test_sample_density_matrix():
61
+ def test_sample_density_matrix() -> None:
60
62
  state = np.zeros(8, dtype=np.complex64)
61
63
  state[0] = 1 / np.sqrt(2)
62
64
  state[2] = 1 / np.sqrt(2)
@@ -72,7 +74,7 @@ def test_sample_density_matrix():
72
74
  np.testing.assert_equal(cirq.sample_density_matrix(matrix, [0]), [[False]])
73
75
 
74
76
 
75
- def test_sample_density_matrix_seed():
77
+ def test_sample_density_matrix_seed() -> None:
76
78
  density_matrix = 0.5 * np.eye(2)
77
79
 
78
80
  samples = cirq.sample_density_matrix(density_matrix, [0], repetitions=10, seed=1234)
@@ -90,12 +92,12 @@ def test_sample_density_matrix_seed():
90
92
  )
91
93
 
92
94
 
93
- def test_sample_empty_density_matrix():
95
+ def test_sample_empty_density_matrix() -> None:
94
96
  matrix = np.zeros(shape=())
95
97
  np.testing.assert_almost_equal(cirq.sample_density_matrix(matrix, []), [[]])
96
98
 
97
99
 
98
- def test_sample_density_matrix_no_repetitions():
100
+ def test_sample_density_matrix_no_repetitions() -> None:
99
101
  matrix = cirq.to_valid_density_matrix(0, 3)
100
102
  np.testing.assert_almost_equal(
101
103
  cirq.sample_density_matrix(matrix, [1], repetitions=0), np.zeros(shape=(0, 1))
@@ -105,7 +107,7 @@ def test_sample_density_matrix_no_repetitions():
105
107
  )
106
108
 
107
109
 
108
- def test_sample_density_matrix_repetitions():
110
+ def test_sample_density_matrix_repetitions() -> None:
109
111
  for perm in itertools.permutations([0, 1, 2]):
110
112
  for x in range(8):
111
113
  matrix = cirq.to_valid_density_matrix(x, 3)
@@ -115,30 +117,30 @@ def test_sample_density_matrix_repetitions():
115
117
  np.testing.assert_equal(result, expected)
116
118
 
117
119
 
118
- def test_sample_density_matrix_negative_repetitions():
120
+ def test_sample_density_matrix_negative_repetitions() -> None:
119
121
  matrix = cirq.to_valid_density_matrix(0, 3)
120
122
  with pytest.raises(ValueError, match='-1'):
121
123
  cirq.sample_density_matrix(matrix, [1], repetitions=-1)
122
124
 
123
125
 
124
- def test_sample_density_matrix_not_square():
126
+ def test_sample_density_matrix_not_square() -> None:
125
127
  with pytest.raises(ValueError, match='not square'):
126
128
  cirq.sample_density_matrix(np.array([1, 0, 0]), [1])
127
129
 
128
130
 
129
- def test_sample_density_matrix_not_power_of_two():
131
+ def test_sample_density_matrix_not_power_of_two() -> None:
130
132
  with pytest.raises(ValueError, match='power of two'):
131
133
  cirq.sample_density_matrix(np.ones((3, 3)) / 3, [1])
132
134
  with pytest.raises(ValueError, match='power of two'):
133
135
  cirq.sample_density_matrix(np.ones((2, 3, 2, 3)) / 6, [1])
134
136
 
135
137
 
136
- def test_sample_density_matrix_higher_powers_of_two():
138
+ def test_sample_density_matrix_higher_powers_of_two() -> None:
137
139
  with pytest.raises(ValueError, match='powers of two'):
138
140
  cirq.sample_density_matrix(np.ones((2, 4, 2, 4)) / 8, [1])
139
141
 
140
142
 
141
- def test_sample_density_matrix_out_of_range():
143
+ def test_sample_density_matrix_out_of_range() -> None:
142
144
  matrix = cirq.to_valid_density_matrix(0, 3)
143
145
  with pytest.raises(IndexError, match='-2'):
144
146
  cirq.sample_density_matrix(matrix, [-2])
@@ -146,13 +148,13 @@ def test_sample_density_matrix_out_of_range():
146
148
  cirq.sample_density_matrix(matrix, [3])
147
149
 
148
150
 
149
- def test_sample_density_matrix_no_indices():
151
+ def test_sample_density_matrix_no_indices() -> None:
150
152
  matrix = cirq.to_valid_density_matrix(0, 3)
151
153
  bits = cirq.sample_density_matrix(matrix, [])
152
154
  np.testing.assert_almost_equal(bits, np.zeros(shape=(1, 0)))
153
155
 
154
156
 
155
- def test_sample_density_matrix_validate_qid_shape():
157
+ def test_sample_density_matrix_validate_qid_shape() -> None:
156
158
  matrix = cirq.to_valid_density_matrix(0, 3)
157
159
  cirq.sample_density_matrix(matrix, [], qid_shape=(2, 2, 2))
158
160
  with pytest.raises(ValueError, match='Matrix size does not match qid shape'):
@@ -163,7 +165,7 @@ def test_sample_density_matrix_validate_qid_shape():
163
165
  cirq.sample_density_matrix(matrix2, [], qid_shape=(2, 2, 2))
164
166
 
165
167
 
166
- def test_measure_density_matrix_computational_basis():
168
+ def test_measure_density_matrix_computational_basis() -> None:
167
169
  results = []
168
170
  for x in range(8):
169
171
  matrix = cirq.to_valid_density_matrix(x, 3)
@@ -174,7 +176,7 @@ def test_measure_density_matrix_computational_basis():
174
176
  assert results == expected
175
177
 
176
178
 
177
- def test_measure_density_matrix_computational_basis_reversed():
179
+ def test_measure_density_matrix_computational_basis_reversed() -> None:
178
180
  results = []
179
181
  for x in range(8):
180
182
  matrix = cirq.to_valid_density_matrix(x, 3)
@@ -185,7 +187,7 @@ def test_measure_density_matrix_computational_basis_reversed():
185
187
  assert results == expected
186
188
 
187
189
 
188
- def test_measure_density_matrix_computational_basis_reshaped():
190
+ def test_measure_density_matrix_computational_basis_reshaped() -> None:
189
191
  results = []
190
192
  for x in range(8):
191
193
  matrix = np.reshape(cirq.to_valid_density_matrix(x, 3), (2,) * 6)
@@ -196,7 +198,7 @@ def test_measure_density_matrix_computational_basis_reshaped():
196
198
  assert results == expected
197
199
 
198
200
 
199
- def test_measure_density_matrix_partial_indices():
201
+ def test_measure_density_matrix_partial_indices() -> None:
200
202
  for index in range(3):
201
203
  for x in range(8):
202
204
  matrix = cirq.to_valid_density_matrix(x, 3)
@@ -205,7 +207,7 @@ def test_measure_density_matrix_partial_indices():
205
207
  assert bits == [bool(1 & (x >> (2 - index)))]
206
208
 
207
209
 
208
- def test_measure_density_matrix_partial_indices_all_orders():
210
+ def test_measure_density_matrix_partial_indices_all_orders() -> None:
209
211
  for perm in itertools.permutations([0, 1, 2]):
210
212
  for x in range(8):
211
213
  matrix = cirq.to_valid_density_matrix(x, 3)
@@ -221,7 +223,7 @@ def matrix_000_plus_010():
221
223
  return cirq.to_valid_density_matrix(state, num_qubits=3)
222
224
 
223
225
 
224
- def test_measure_density_matrix_collapse():
226
+ def test_measure_density_matrix_collapse() -> None:
225
227
  matrix = matrix_000_plus_010()
226
228
  for _ in range(10):
227
229
  bits, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0])
@@ -246,7 +248,7 @@ def test_measure_density_matrix_collapse():
246
248
  assert bits == [False]
247
249
 
248
250
 
249
- def test_measure_density_matrix_seed():
251
+ def test_measure_density_matrix_seed() -> None:
250
252
  n = 5
251
253
  matrix = np.eye(2**n) / 2**n
252
254
 
@@ -261,7 +263,7 @@ def test_measure_density_matrix_seed():
261
263
  np.testing.assert_allclose(out_matrix1, out_matrix2)
262
264
 
263
265
 
264
- def test_measure_density_matrix_out_is_matrix():
266
+ def test_measure_density_matrix_out_is_matrix() -> None:
265
267
  matrix = matrix_000_plus_010()
266
268
  bits, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0], out=matrix)
267
269
  expected_state = np.zeros(8, dtype=np.complex64)
@@ -271,7 +273,7 @@ def test_measure_density_matrix_out_is_matrix():
271
273
  assert out_matrix is matrix
272
274
 
273
275
 
274
- def test_measure_state_out_is_not_matrix():
276
+ def test_measure_state_out_is_not_matrix() -> None:
275
277
  matrix = matrix_000_plus_010()
276
278
  out = np.zeros_like(matrix)
277
279
  _, out_matrix = cirq.measure_density_matrix(matrix, [2, 1, 0], out=out)
@@ -279,7 +281,7 @@ def test_measure_state_out_is_not_matrix():
279
281
  assert out is out_matrix
280
282
 
281
283
 
282
- def test_measure_density_matrix_not_square():
284
+ def test_measure_density_matrix_not_square() -> None:
283
285
  with pytest.raises(ValueError, match='not square'):
284
286
  cirq.measure_density_matrix(np.array([1, 0, 0]), [1])
285
287
  with pytest.raises(ValueError, match='not square'):
@@ -288,26 +290,26 @@ def test_measure_density_matrix_not_square():
288
290
  )
289
291
 
290
292
 
291
- def test_measure_density_matrix_not_power_of_two():
293
+ def test_measure_density_matrix_not_power_of_two() -> None:
292
294
  with pytest.raises(ValueError, match='power of two'):
293
295
  cirq.measure_density_matrix(np.ones((3, 3)) / 3, [1])
294
296
  with pytest.raises(ValueError, match='power of two'):
295
297
  cirq.measure_density_matrix(np.ones((2, 3, 2, 3)) / 6, [1])
296
298
 
297
299
 
298
- def test_measure_density_matrix_higher_powers_of_two():
300
+ def test_measure_density_matrix_higher_powers_of_two() -> None:
299
301
  with pytest.raises(ValueError, match='powers of two'):
300
302
  cirq.measure_density_matrix(np.ones((2, 4, 2, 4)) / 8, [1])
301
303
 
302
304
 
303
- def test_measure_density_matrix_tensor_different_left_right_shape():
305
+ def test_measure_density_matrix_tensor_different_left_right_shape() -> None:
304
306
  with pytest.raises(ValueError, match='not equal'):
305
307
  cirq.measure_density_matrix(
306
308
  np.array([1, 0, 0, 0]).reshape((2, 2, 1, 1)), [1], qid_shape=(2, 1)
307
309
  )
308
310
 
309
311
 
310
- def test_measure_density_matrix_out_of_range():
312
+ def test_measure_density_matrix_out_of_range() -> None:
311
313
  matrix = cirq.to_valid_density_matrix(0, 3)
312
314
  with pytest.raises(IndexError, match='-2'):
313
315
  cirq.measure_density_matrix(matrix, [-2])
@@ -315,14 +317,14 @@ def test_measure_density_matrix_out_of_range():
315
317
  cirq.measure_density_matrix(matrix, [3])
316
318
 
317
319
 
318
- def test_measure_state_no_indices():
320
+ def test_measure_state_no_indices() -> None:
319
321
  matrix = cirq.to_valid_density_matrix(0, 3)
320
322
  bits, out_matrix = cirq.measure_density_matrix(matrix, [])
321
323
  assert [] == bits
322
324
  np.testing.assert_almost_equal(out_matrix, matrix)
323
325
 
324
326
 
325
- def test_measure_state_no_indices_out_is_matrix():
327
+ def test_measure_state_no_indices_out_is_matrix() -> None:
326
328
  matrix = cirq.to_valid_density_matrix(0, 3)
327
329
  bits, out_matrix = cirq.measure_density_matrix(matrix, [], out=matrix)
328
330
  assert [] == bits
@@ -330,7 +332,7 @@ def test_measure_state_no_indices_out_is_matrix():
330
332
  assert out_matrix is matrix
331
333
 
332
334
 
333
- def test_measure_state_no_indices_out_is_not_matrix():
335
+ def test_measure_state_no_indices_out_is_not_matrix() -> None:
334
336
  matrix = cirq.to_valid_density_matrix(0, 3)
335
337
  out = np.zeros_like(matrix)
336
338
  bits, out_matrix = cirq.measure_density_matrix(matrix, [], out=out)
@@ -340,7 +342,7 @@ def test_measure_state_no_indices_out_is_not_matrix():
340
342
  assert out is not matrix
341
343
 
342
344
 
343
- def test_measure_state_empty_density_matrix():
345
+ def test_measure_state_empty_density_matrix() -> None:
344
346
  matrix = np.zeros(shape=())
345
347
  bits, out_matrix = cirq.measure_density_matrix(matrix, [])
346
348
  assert [] == bits
@@ -350,14 +352,14 @@ def test_measure_state_empty_density_matrix():
350
352
  @pytest.mark.parametrize('seed', [17, 35, 48])
351
353
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
352
354
  @pytest.mark.parametrize('split', [False, True])
353
- def test_to_valid_density_matrix_on_simulator_output(seed, dtype, split):
355
+ def test_to_valid_density_matrix_on_simulator_output(seed, dtype, split) -> None:
354
356
  circuit = cirq.testing.random_circuit(qubits=5, n_moments=20, op_density=0.9, random_state=seed)
355
357
  simulator = cirq.DensityMatrixSimulator(split_untangled_states=split, dtype=dtype)
356
358
  result = simulator.simulate(circuit)
357
359
  _ = cirq.to_valid_density_matrix(result.final_density_matrix, num_qubits=5, atol=1e-6)
358
360
 
359
361
 
360
- def test_factor_validation():
362
+ def test_factor_validation() -> None:
361
363
  args = cirq.DensityMatrixSimulator()._create_simulation_state(0, qubits=cirq.LineQubit.range(2))
362
364
  args.apply_operation(cirq.H(cirq.LineQubit(0)))
363
365
  t = args.create_merged_state().target_tensor
cirq/sim/mux.py CHANGED
@@ -17,7 +17,9 @@
17
17
  Filename is a reference to multiplexing.
18
18
  """
19
19
 
20
- from typing import List, Optional, Sequence, Type, TYPE_CHECKING, Union
20
+ from __future__ import annotations
21
+
22
+ from typing import Sequence, TYPE_CHECKING
21
23
 
22
24
  import numpy as np
23
25
 
@@ -30,7 +32,7 @@ from cirq.transformers import measurement_transformers
30
32
  if TYPE_CHECKING:
31
33
  import cirq
32
34
 
33
- CIRCUIT_LIKE = Union[circuits.Circuit, ops.Gate, ops.OP_TREE]
35
+ CIRCUIT_LIKE = circuits.Circuit | ops.Gate | ops.OP_TREE
34
36
  document(
35
37
  CIRCUIT_LIKE,
36
38
  """A `circuits.Circuit` or a value that can be trivially converted into it:
@@ -39,7 +41,7 @@ document(
39
41
  )
40
42
 
41
43
 
42
- def _is_clifford_circuit(program: 'cirq.Circuit') -> bool:
44
+ def _is_clifford_circuit(program: cirq.Circuit) -> bool:
43
45
  return all(
44
46
  clifford_simulator.CliffordSimulator.is_supported_operation(op)
45
47
  for op in program.all_operations()
@@ -47,14 +49,14 @@ def _is_clifford_circuit(program: 'cirq.Circuit') -> bool:
47
49
 
48
50
 
49
51
  def sample(
50
- program: 'cirq.Circuit',
52
+ program: cirq.Circuit,
51
53
  *,
52
- noise: 'cirq.NOISE_MODEL_LIKE' = None,
53
- param_resolver: Optional['cirq.ParamResolver'] = None,
54
+ noise: cirq.NOISE_MODEL_LIKE = None,
55
+ param_resolver: cirq.ParamResolver | None = None,
54
56
  repetitions: int = 1,
55
- dtype: Type[np.complexfloating] = np.complex64,
56
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
57
- ) -> 'cirq.Result':
57
+ dtype: type[np.complexfloating] = np.complex64,
58
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
59
+ ) -> cirq.Result:
58
60
  """Simulates sampling from the given circuit.
59
61
 
60
62
  Args:
@@ -90,7 +92,7 @@ def sample(
90
92
  ).run(program=program, param_resolver=param_resolver, repetitions=repetitions)
91
93
 
92
94
 
93
- def _to_circuit(program: 'cirq.CIRCUIT_LIKE') -> 'cirq.Circuit':
95
+ def _to_circuit(program: cirq.CIRCUIT_LIKE) -> cirq.Circuit:
94
96
  if isinstance(program, circuits.Circuit):
95
97
  # No change needed.
96
98
  result = program
@@ -103,14 +105,14 @@ def _to_circuit(program: 'cirq.CIRCUIT_LIKE') -> 'cirq.Circuit':
103
105
 
104
106
 
105
107
  def final_state_vector(
106
- program: 'cirq.CIRCUIT_LIKE',
108
+ program: cirq.CIRCUIT_LIKE,
107
109
  *,
108
- initial_state: 'cirq.STATE_VECTOR_LIKE' = 0,
109
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
110
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
110
+ initial_state: cirq.STATE_VECTOR_LIKE = 0,
111
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
112
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
111
113
  ignore_terminal_measurements: bool = False,
112
- dtype: Type[np.complexfloating] = np.complex64,
113
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
114
+ dtype: type[np.complexfloating] = np.complex64,
115
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
114
116
  ) -> np.ndarray:
115
117
  """Returns the state vector resulting from acting operations on a state.
116
118
 
@@ -174,14 +176,14 @@ def final_state_vector(
174
176
 
175
177
 
176
178
  def sample_sweep(
177
- program: 'cirq.Circuit',
178
- params: 'cirq.Sweepable',
179
+ program: cirq.Circuit,
180
+ params: cirq.Sweepable,
179
181
  *,
180
- noise: 'cirq.NOISE_MODEL_LIKE' = None,
182
+ noise: cirq.NOISE_MODEL_LIKE = None,
181
183
  repetitions: int = 1,
182
- dtype: Type[np.complexfloating] = np.complex64,
183
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
184
- ) -> Sequence['cirq.Result']:
184
+ dtype: type[np.complexfloating] = np.complex64,
185
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
186
+ ) -> Sequence[cirq.Result]:
185
187
  """Runs the supplied Circuit, mimicking quantum hardware.
186
188
 
187
189
  In contrast to run, this allows for sweeping over different parameter
@@ -204,7 +206,7 @@ def sample_sweep(
204
206
  """
205
207
  prng = value.parse_random_state(seed)
206
208
 
207
- trial_results: List[study.Result] = []
209
+ trial_results: list[study.Result] = []
208
210
  for param_resolver in study.to_resolvers(params):
209
211
  measurements = sample(
210
212
  program,
@@ -219,16 +221,16 @@ def sample_sweep(
219
221
 
220
222
 
221
223
  def final_density_matrix(
222
- program: 'cirq.CIRCUIT_LIKE',
224
+ program: cirq.CIRCUIT_LIKE,
223
225
  *,
224
- noise: 'cirq.NOISE_MODEL_LIKE' = None,
225
- initial_state: 'cirq.STATE_VECTOR_LIKE' = 0,
226
- param_resolver: 'cirq.ParamResolverOrSimilarType' = None,
227
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
228
- dtype: Type[np.complexfloating] = np.complex64,
229
- seed: Optional[Union[int, np.random.RandomState]] = None,
226
+ noise: cirq.NOISE_MODEL_LIKE = None,
227
+ initial_state: cirq.STATE_VECTOR_LIKE = 0,
228
+ param_resolver: cirq.ParamResolverOrSimilarType = None,
229
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
230
+ dtype: type[np.complexfloating] = np.complex64,
231
+ seed: int | np.random.RandomState | None = None,
230
232
  ignore_measurement_results: bool = True,
231
- ) -> 'np.ndarray':
233
+ ) -> np.ndarray:
232
234
  """Returns the density matrix resulting from simulating the circuit.
233
235
 
234
236
  Note that, unlike `cirq.final_state_vector`, terminal measurements
cirq/sim/mux_test.py CHANGED
@@ -13,6 +13,9 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Tests sampling/simulation methods that delegate to appropriate simulators."""
16
+
17
+ from __future__ import annotations
18
+
16
19
  import collections
17
20
 
18
21
  import numpy as np
@@ -12,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from collections import abc
16
- from typing import Any, Dict, Generic, Iterator, List, Mapping, Optional, Sequence, TYPE_CHECKING
18
+ from typing import Any, Generic, Iterator, Mapping, Sequence, TYPE_CHECKING
17
19
 
18
20
  import numpy as np
19
21
 
@@ -32,10 +34,10 @@ class SimulationProductState(
32
34
 
33
35
  def __init__(
34
36
  self,
35
- sim_states: Dict[Optional['cirq.Qid'], TSimulationState],
36
- qubits: Sequence['cirq.Qid'],
37
+ sim_states: dict[cirq.Qid | None, TSimulationState],
38
+ qubits: Sequence[cirq.Qid],
37
39
  split_untangled_states: bool,
38
- classical_data: Optional['cirq.ClassicalDataStore'] = None,
40
+ classical_data: cirq.ClassicalDataStore | None = None,
39
41
  ):
40
42
  """Initializes the class.
41
43
 
@@ -55,7 +57,7 @@ class SimulationProductState(
55
57
  self._split_untangled_states = split_untangled_states
56
58
 
57
59
  @property
58
- def sim_states(self) -> Mapping[Optional['cirq.Qid'], TSimulationState]:
60
+ def sim_states(self) -> Mapping[cirq.Qid | None, TSimulationState]:
59
61
  return self._sim_states
60
62
 
61
63
  @property
@@ -78,7 +80,7 @@ class SimulationProductState(
78
80
  return merged_state.transpose_to_qubit_order(self.qubits, inplace=True)
79
81
 
80
82
  def _act_on_fallback_(
81
- self, action: Any, qubits: Sequence['cirq.Qid'], allow_decompose: bool = True
83
+ self, action: Any, qubits: Sequence[cirq.Qid], allow_decompose: bool = True
82
84
  ) -> bool:
83
85
  gate_opt = (
84
86
  action
@@ -106,7 +108,7 @@ class SimulationProductState(
106
108
 
107
109
  # Go through the op's qubits and join any disparate SimulationState states
108
110
  # into a new combined state.
109
- op_args_opt: Optional[TSimulationState] = None
111
+ op_args_opt: TSimulationState | None = None
110
112
  for q in qubits:
111
113
  if op_args_opt is None:
112
114
  op_args_opt = self.sim_states[q]
@@ -136,9 +138,7 @@ class SimulationProductState(
136
138
  self._sim_states[q] = op_args
137
139
  return True
138
140
 
139
- def copy(
140
- self, deep_copy_buffers: bool = True
141
- ) -> 'cirq.SimulationProductState[TSimulationState]':
141
+ def copy(self, deep_copy_buffers: bool = True) -> cirq.SimulationProductState[TSimulationState]:
142
142
  classical_data = self._classical_data.copy()
143
143
  copies = {}
144
144
  for sim_state in set(self.sim_states.values()):
@@ -152,12 +152,12 @@ class SimulationProductState(
152
152
 
153
153
  def sample(
154
154
  self,
155
- qubits: List['cirq.Qid'],
155
+ qubits: list[cirq.Qid],
156
156
  repetitions: int = 1,
157
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
157
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
158
158
  ) -> np.ndarray:
159
159
  columns = []
160
- selected_order: List[ops.Qid] = []
160
+ selected_order: list[ops.Qid] = []
161
161
  q_set = set(qubits)
162
162
  for v in dict.fromkeys(self.sim_states.values()):
163
163
  qs = [q for q in v.qubits if q in q_set]
@@ -170,11 +170,11 @@ class SimulationProductState(
170
170
  index_order = [qubit_map[q] for q in qubits]
171
171
  return stacked[:, index_order]
172
172
 
173
- def __getitem__(self, item: Optional['cirq.Qid']) -> TSimulationState:
173
+ def __getitem__(self, item: cirq.Qid | None) -> TSimulationState:
174
174
  return self.sim_states[item]
175
175
 
176
176
  def __len__(self) -> int:
177
177
  return len(self.sim_states)
178
178
 
179
- def __iter__(self) -> Iterator[Optional['cirq.Qid']]:
179
+ def __iter__(self) -> Iterator[cirq.Qid | None]:
180
180
  return iter(self.sim_states)