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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,13 +12,15 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
 
18
20
  import cirq
19
21
 
20
22
 
21
- def test_default_parameter():
23
+ def test_default_parameter() -> None:
22
24
  qid_shape = (2,)
23
25
  tensor = cirq.to_valid_density_matrix(
24
26
  0, len(qid_shape), qid_shape=qid_shape, dtype=np.complex64
@@ -32,13 +34,13 @@ def test_default_parameter():
32
34
  assert args.qid_shape == qid_shape
33
35
 
34
36
 
35
- def test_shallow_copy_buffers():
37
+ def test_shallow_copy_buffers() -> None:
36
38
  args = cirq.DensityMatrixSimulationState(qubits=cirq.LineQubit.range(1), initial_state=0)
37
39
  copy = args.copy(deep_copy_buffers=False)
38
40
  assert copy.available_buffer is args.available_buffer
39
41
 
40
42
 
41
- def test_decomposed_fallback():
43
+ def test_decomposed_fallback() -> None:
42
44
  class Composite(cirq.Gate):
43
45
  def num_qubits(self) -> int:
44
46
  return 1
@@ -59,7 +61,7 @@ def test_decomposed_fallback():
59
61
  )
60
62
 
61
63
 
62
- def test_cannot_act():
64
+ def test_cannot_act() -> None:
63
65
  class NoDetails:
64
66
  pass
65
67
 
@@ -73,12 +75,12 @@ def test_cannot_act():
73
75
  cirq.act_on(NoDetails(), args, qubits=())
74
76
 
75
77
 
76
- def test_qid_shape_error():
78
+ def test_qid_shape_error() -> None:
77
79
  with pytest.raises(ValueError, match="qid_shape must be provided"):
78
80
  cirq.sim.density_matrix_simulation_state._BufferedDensityMatrix.create(initial_state=0)
79
81
 
80
82
 
81
- def test_initial_state_vector():
83
+ def test_initial_state_vector() -> None:
82
84
  qubits = cirq.LineQubit.range(3)
83
85
  args = cirq.DensityMatrixSimulationState(
84
86
  qubits=qubits, initial_state=np.full((8,), 1 / np.sqrt(8)), dtype=np.complex64
@@ -91,7 +93,7 @@ def test_initial_state_vector():
91
93
  assert args2.target_tensor.shape == (2, 2, 2, 2, 2, 2)
92
94
 
93
95
 
94
- def test_initial_state_matrix():
96
+ def test_initial_state_matrix() -> None:
95
97
  qubits = cirq.LineQubit.range(3)
96
98
  args = cirq.DensityMatrixSimulationState(
97
99
  qubits=qubits, initial_state=np.full((8, 8), 1 / 8), dtype=np.complex64
@@ -104,7 +106,7 @@ def test_initial_state_matrix():
104
106
  assert args2.target_tensor.shape == (2, 2, 2, 2, 2, 2)
105
107
 
106
108
 
107
- def test_initial_state_bad_shape():
109
+ def test_initial_state_bad_shape() -> None:
108
110
  qubits = cirq.LineQubit.range(3)
109
111
  with pytest.raises(ValueError, match="Invalid quantum state"):
110
112
  cirq.DensityMatrixSimulationState(
@@ -11,8 +11,12 @@
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
  """Simulator for density matrices that simulates noisy quantum circuits."""
15
- from typing import Any, Dict, List, Optional, Sequence, Type, TYPE_CHECKING, Union
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Sequence, TYPE_CHECKING
16
20
 
17
21
  import numpy as np
18
22
 
@@ -115,9 +119,9 @@ class DensityMatrixSimulator(
115
119
  def __init__(
116
120
  self,
117
121
  *,
118
- dtype: Type[np.complexfloating] = np.complex64,
119
- noise: 'cirq.NOISE_MODEL_LIKE' = None,
120
- seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
122
+ dtype: type[np.complexfloating] = np.complex64,
123
+ noise: cirq.NOISE_MODEL_LIKE = None,
124
+ seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None,
121
125
  split_untangled_states: bool = True,
122
126
  ):
123
127
  """Density matrix simulator.
@@ -147,12 +151,10 @@ class DensityMatrixSimulator(
147
151
 
148
152
  def _create_partial_simulation_state(
149
153
  self,
150
- initial_state: Union[
151
- np.ndarray, 'cirq.STATE_VECTOR_LIKE', 'cirq.DensityMatrixSimulationState'
152
- ],
153
- qubits: Sequence['cirq.Qid'],
154
- classical_data: 'cirq.ClassicalDataStore',
155
- ) -> 'cirq.DensityMatrixSimulationState':
154
+ initial_state: np.ndarray | cirq.STATE_VECTOR_LIKE | cirq.DensityMatrixSimulationState,
155
+ qubits: Sequence[cirq.Qid],
156
+ classical_data: cirq.ClassicalDataStore,
157
+ ) -> cirq.DensityMatrixSimulationState:
156
158
  """Creates the DensityMatrixSimulationState for a circuit.
157
159
 
158
160
  Args:
@@ -183,16 +185,16 @@ class DensityMatrixSimulator(
183
185
  return not protocols.measurement_keys_touched(val)
184
186
 
185
187
  def _create_step_result(
186
- self, sim_state: 'cirq.SimulationStateBase[cirq.DensityMatrixSimulationState]'
188
+ self, sim_state: cirq.SimulationStateBase[cirq.DensityMatrixSimulationState]
187
189
  ):
188
190
  return DensityMatrixStepResult(sim_state=sim_state, dtype=self._dtype)
189
191
 
190
192
  def _create_simulator_trial_result(
191
193
  self,
192
- params: 'cirq.ParamResolver',
193
- measurements: Dict[str, np.ndarray],
194
- final_simulator_state: 'cirq.SimulationStateBase[cirq.DensityMatrixSimulationState]',
195
- ) -> 'cirq.DensityMatrixTrialResult':
194
+ params: cirq.ParamResolver,
195
+ measurements: dict[str, np.ndarray],
196
+ final_simulator_state: cirq.SimulationStateBase[cirq.DensityMatrixSimulationState],
197
+ ) -> cirq.DensityMatrixTrialResult:
196
198
  return DensityMatrixTrialResult(
197
199
  params=params, measurements=measurements, final_simulator_state=final_simulator_state
198
200
  )
@@ -200,13 +202,13 @@ class DensityMatrixSimulator(
200
202
  # TODO(#4209): Deduplicate with identical code in sparse_simulator.
201
203
  def simulate_expectation_values_sweep(
202
204
  self,
203
- program: 'cirq.AbstractCircuit',
204
- observables: Union['cirq.PauliSumLike', List['cirq.PauliSumLike']],
205
- params: 'cirq.Sweepable',
206
- qubit_order: 'cirq.QubitOrderOrList' = ops.QubitOrder.DEFAULT,
205
+ program: cirq.AbstractCircuit,
206
+ observables: cirq.PauliSumLike | list[cirq.PauliSumLike],
207
+ params: cirq.Sweepable,
208
+ qubit_order: cirq.QubitOrderOrList = ops.QubitOrder.DEFAULT,
207
209
  initial_state: Any = None,
208
210
  permit_terminal_measurements: bool = False,
209
- ) -> List[List[float]]:
211
+ ) -> list[list[float]]:
210
212
  if not permit_terminal_measurements and program.are_any_measurements_terminal():
211
213
  raise ValueError(
212
214
  'Provided circuit has terminal measurements, which may '
@@ -216,7 +218,7 @@ class DensityMatrixSimulator(
216
218
  swept_evs = []
217
219
  qubit_order = ops.QubitOrder.as_qubit_order(qubit_order)
218
220
  qmap = {q: i for i, q in enumerate(qubit_order.order_for(program.all_qubits()))}
219
- if not isinstance(observables, List):
221
+ if not isinstance(observables, list):
220
222
  observables = [observables]
221
223
  pslist = [ops.PauliSum.wrap(pslike) for pslike in observables]
222
224
  for param_resolver in study.to_resolvers(params):
@@ -242,8 +244,8 @@ class DensityMatrixStepResult(simulator_base.StepResultBase['cirq.DensityMatrixS
242
244
 
243
245
  def __init__(
244
246
  self,
245
- sim_state: 'cirq.SimulationStateBase[cirq.DensityMatrixSimulationState]',
246
- dtype: Type[np.complexfloating] = np.complex64,
247
+ sim_state: cirq.SimulationStateBase[cirq.DensityMatrixSimulationState],
248
+ dtype: type[np.complexfloating] = np.complex64,
247
249
  ):
248
250
  """DensityMatrixStepResult.
249
251
 
@@ -254,7 +256,7 @@ class DensityMatrixStepResult(simulator_base.StepResultBase['cirq.DensityMatrixS
254
256
  """
255
257
  super().__init__(sim_state)
256
258
  self._dtype = dtype
257
- self._density_matrix: Optional[np.ndarray] = None
259
+ self._density_matrix: np.ndarray | None = None
258
260
 
259
261
  def density_matrix(self, copy=True):
260
262
  """Returns the density matrix at this step in the simulation.
@@ -353,14 +355,14 @@ class DensityMatrixTrialResult(
353
355
 
354
356
  def __init__(
355
357
  self,
356
- params: 'cirq.ParamResolver',
357
- measurements: Dict[str, np.ndarray],
358
- final_simulator_state: 'cirq.SimulationStateBase[cirq.DensityMatrixSimulationState]',
358
+ params: cirq.ParamResolver,
359
+ measurements: dict[str, np.ndarray],
360
+ final_simulator_state: cirq.SimulationStateBase[cirq.DensityMatrixSimulationState],
359
361
  ) -> None:
360
362
  super().__init__(
361
363
  params=params, measurements=measurements, final_simulator_state=final_simulator_state
362
364
  )
363
- self._final_density_matrix: Optional[np.ndarray] = None
365
+ self._final_density_matrix: np.ndarray | None = None
364
366
 
365
367
  @property
366
368
  def final_density_matrix(self) -> np.ndarray:
@@ -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
@@ -53,7 +55,7 @@ def test_invalid_dtype():
53
55
 
54
56
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
55
57
  @pytest.mark.parametrize('split', [True, False])
56
- def test_run_no_measurements(dtype: Type[np.complexfloating], split: bool):
58
+ def test_run_no_measurements(dtype: type[np.complexfloating], split: bool):
57
59
  q0, q1 = cirq.LineQubit.range(2)
58
60
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
59
61
 
@@ -64,7 +66,7 @@ def test_run_no_measurements(dtype: Type[np.complexfloating], split: bool):
64
66
 
65
67
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
66
68
  @pytest.mark.parametrize('split', [True, False])
67
- def test_run_no_results(dtype: Type[np.complexfloating], split: bool):
69
+ def test_run_no_results(dtype: type[np.complexfloating], split: bool):
68
70
  q0, q1 = cirq.LineQubit.range(2)
69
71
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
70
72
 
@@ -75,7 +77,7 @@ def test_run_no_results(dtype: Type[np.complexfloating], split: bool):
75
77
 
76
78
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
77
79
  @pytest.mark.parametrize('split', [True, False])
78
- def test_run_empty_circuit(dtype: Type[np.complexfloating], split: bool):
80
+ def test_run_empty_circuit(dtype: type[np.complexfloating], split: bool):
79
81
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
80
82
  with pytest.raises(ValueError, match="no measurements"):
81
83
  simulator.run(cirq.Circuit())
@@ -83,7 +85,7 @@ def test_run_empty_circuit(dtype: Type[np.complexfloating], split: bool):
83
85
 
84
86
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
85
87
  @pytest.mark.parametrize('split', [True, False])
86
- def test_run_bit_flips(dtype: Type[np.complexfloating], split: bool):
88
+ def test_run_bit_flips(dtype: type[np.complexfloating], split: bool):
87
89
  q0, q1 = cirq.LineQubit.range(2)
88
90
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
89
91
  for b0 in [0, 1]:
@@ -97,7 +99,7 @@ def test_run_bit_flips(dtype: Type[np.complexfloating], split: bool):
97
99
 
98
100
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
99
101
  @pytest.mark.parametrize('split', [True, False])
100
- def test_run_bit_flips_with_dephasing(dtype: Type[np.complexfloating], split: bool):
102
+ def test_run_bit_flips_with_dephasing(dtype: type[np.complexfloating], split: bool):
101
103
  q0, q1 = cirq.LineQubit.range(2)
102
104
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
103
105
  for b0 in [0, 1]:
@@ -111,7 +113,7 @@ def test_run_bit_flips_with_dephasing(dtype: Type[np.complexfloating], split: bo
111
113
 
112
114
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
113
115
  @pytest.mark.parametrize('split', [True, False])
114
- def test_run_qudit_increments(dtype: Type[np.complexfloating], split: bool):
116
+ def test_run_qudit_increments(dtype: type[np.complexfloating], split: bool):
115
117
  q0, q1 = cirq.LineQid.for_qid_shape((3, 4))
116
118
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
117
119
  for b0 in [0, 1, 2]:
@@ -130,7 +132,7 @@ def test_run_qudit_increments(dtype: Type[np.complexfloating], split: bool):
130
132
 
131
133
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
132
134
  @pytest.mark.parametrize('split', [True, False])
133
- def test_run_not_channel_op(dtype: Type[np.complexfloating], split: bool):
135
+ def test_run_not_channel_op(dtype: type[np.complexfloating], split: bool):
134
136
  class BadOp(cirq.Operation):
135
137
  def __init__(self, qubits):
136
138
  self._qubits = qubits
@@ -151,7 +153,7 @@ def test_run_not_channel_op(dtype: Type[np.complexfloating], split: bool):
151
153
 
152
154
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
153
155
  @pytest.mark.parametrize('split', [True, False])
154
- def test_run_mixture(dtype: Type[np.complexfloating], split: bool):
156
+ def test_run_mixture(dtype: type[np.complexfloating], split: bool):
155
157
  q0, q1 = cirq.LineQubit.range(2)
156
158
  circuit = cirq.Circuit(cirq.bit_flip(0.5)(q0), cirq.measure(q0), cirq.measure(q1))
157
159
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
@@ -165,7 +167,7 @@ def test_run_mixture(dtype: Type[np.complexfloating], split: bool):
165
167
 
166
168
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
167
169
  @pytest.mark.parametrize('split', [True, False])
168
- def test_run_qudit_mixture(dtype: Type[np.complexfloating], split: bool):
170
+ def test_run_qudit_mixture(dtype: type[np.complexfloating], split: bool):
169
171
  q0, q1 = cirq.LineQid.for_qid_shape((3, 2))
170
172
  mixture = _TestMixture(
171
173
  [
@@ -186,7 +188,7 @@ def test_run_qudit_mixture(dtype: Type[np.complexfloating], split: bool):
186
188
 
187
189
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
188
190
  @pytest.mark.parametrize('split', [True, False])
189
- def test_run_channel(dtype: Type[np.complexfloating], split: bool):
191
+ def test_run_channel(dtype: type[np.complexfloating], split: bool):
190
192
  q0, q1 = cirq.LineQubit.range(2)
191
193
  circuit = cirq.Circuit(
192
194
  cirq.X(q0), cirq.amplitude_damp(0.5)(q0), cirq.measure(q0), cirq.measure(q1)
@@ -203,7 +205,7 @@ def test_run_channel(dtype: Type[np.complexfloating], split: bool):
203
205
 
204
206
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
205
207
  @pytest.mark.parametrize('split', [True, False])
206
- def test_run_decomposable_channel(dtype: Type[np.complexfloating], split: bool):
208
+ def test_run_decomposable_channel(dtype: type[np.complexfloating], split: bool):
207
209
  q0, q1 = cirq.LineQubit.range(2)
208
210
 
209
211
  circuit = cirq.Circuit(
@@ -224,7 +226,7 @@ def test_run_decomposable_channel(dtype: Type[np.complexfloating], split: bool):
224
226
 
225
227
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
226
228
  @pytest.mark.parametrize('split', [True, False])
227
- def test_run_qudit_channel(dtype: Type[np.complexfloating], split: bool):
229
+ def test_run_qudit_channel(dtype: type[np.complexfloating], split: bool):
228
230
  class TestChannel(cirq.Gate):
229
231
  def _qid_shape_(self):
230
232
  return (3,)
@@ -256,7 +258,7 @@ def test_run_qudit_channel(dtype: Type[np.complexfloating], split: bool):
256
258
 
257
259
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
258
260
  @pytest.mark.parametrize('split', [True, False])
259
- def test_run_measure_at_end_no_repetitions(dtype: Type[np.complexfloating], split: bool):
261
+ def test_run_measure_at_end_no_repetitions(dtype: type[np.complexfloating], split: bool):
260
262
  q0, q1 = cirq.LineQubit.range(2)
261
263
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
262
264
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -275,7 +277,7 @@ def test_run_measure_at_end_no_repetitions(dtype: Type[np.complexfloating], spli
275
277
 
276
278
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
277
279
  @pytest.mark.parametrize('split', [True, False])
278
- def test_run_repetitions_measure_at_end(dtype: Type[np.complexfloating], split: bool):
280
+ def test_run_repetitions_measure_at_end(dtype: type[np.complexfloating], split: bool):
279
281
  q0, q1 = cirq.LineQubit.range(2)
280
282
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
281
283
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -294,7 +296,7 @@ def test_run_repetitions_measure_at_end(dtype: Type[np.complexfloating], split:
294
296
 
295
297
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
296
298
  @pytest.mark.parametrize('split', [True, False])
297
- def test_run_qudits_repetitions_measure_at_end(dtype: Type[np.complexfloating], split: bool):
299
+ def test_run_qudits_repetitions_measure_at_end(dtype: type[np.complexfloating], split: bool):
298
300
  q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
299
301
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
300
302
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -316,7 +318,7 @@ def test_run_qudits_repetitions_measure_at_end(dtype: Type[np.complexfloating],
316
318
 
317
319
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
318
320
  @pytest.mark.parametrize('split', [True, False])
319
- def test_run_measurement_not_terminal_no_repetitions(dtype: Type[np.complexfloating], split: bool):
321
+ def test_run_measurement_not_terminal_no_repetitions(dtype: type[np.complexfloating], split: bool):
320
322
  q0, q1 = cirq.LineQubit.range(2)
321
323
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
322
324
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -340,7 +342,7 @@ def test_run_measurement_not_terminal_no_repetitions(dtype: Type[np.complexfloat
340
342
 
341
343
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
342
344
  @pytest.mark.parametrize('split', [True, False])
343
- def test_run_repetitions_measurement_not_terminal(dtype: Type[np.complexfloating], split: bool):
345
+ def test_run_repetitions_measurement_not_terminal(dtype: type[np.complexfloating], split: bool):
344
346
  q0, q1 = cirq.LineQubit.range(2)
345
347
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
346
348
  with mock.patch.object(simulator, '_core_iterator', wraps=simulator._core_iterator) as mock_sim:
@@ -365,7 +367,7 @@ def test_run_repetitions_measurement_not_terminal(dtype: Type[np.complexfloating
365
367
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
366
368
  @pytest.mark.parametrize('split', [True, False])
367
369
  def test_run_qudits_repetitions_measurement_not_terminal(
368
- dtype: Type[np.complexfloating], split: bool
370
+ dtype: type[np.complexfloating], split: bool
369
371
  ):
370
372
  q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
371
373
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
@@ -390,7 +392,7 @@ def test_run_qudits_repetitions_measurement_not_terminal(
390
392
 
391
393
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
392
394
  @pytest.mark.parametrize('split', [True, False])
393
- def test_run_param_resolver(dtype: Type[np.complexfloating], split: bool):
395
+ def test_run_param_resolver(dtype: type[np.complexfloating], split: bool):
394
396
  q0, q1 = cirq.LineQubit.range(2)
395
397
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
396
398
  for b0 in [0, 1]:
@@ -404,13 +406,12 @@ def test_run_param_resolver(dtype: Type[np.complexfloating], split: bool):
404
406
  param_resolver = {'b0': b0, 'b1': b1}
405
407
  result = simulator.run(circuit, param_resolver=param_resolver)
406
408
  np.testing.assert_equal(result.measurements, {'q(0)': [[b0]], 'q(1)': [[b1]]})
407
- # pylint: disable=line-too-long
408
409
  np.testing.assert_equal(result.params, cirq.ParamResolver(param_resolver))
409
410
 
410
411
 
411
412
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
412
413
  @pytest.mark.parametrize('split', [True, False])
413
- def test_run_correlations(dtype: Type[np.complexfloating], split: bool):
414
+ def test_run_correlations(dtype: type[np.complexfloating], split: bool):
414
415
  q0, q1 = cirq.LineQubit.range(2)
415
416
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
416
417
  circuit = cirq.Circuit(cirq.H(q0), cirq.CNOT(q0, q1), cirq.measure(q0, q1))
@@ -422,7 +423,7 @@ def test_run_correlations(dtype: Type[np.complexfloating], split: bool):
422
423
 
423
424
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
424
425
  @pytest.mark.parametrize('split', [True, False])
425
- def test_run_measure_multiple_qubits(dtype: Type[np.complexfloating], split: bool):
426
+ def test_run_measure_multiple_qubits(dtype: type[np.complexfloating], split: bool):
426
427
  q0, q1 = cirq.LineQubit.range(2)
427
428
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
428
429
  for b0 in [0, 1]:
@@ -434,7 +435,7 @@ def test_run_measure_multiple_qubits(dtype: Type[np.complexfloating], split: boo
434
435
 
435
436
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
436
437
  @pytest.mark.parametrize('split', [True, False])
437
- def test_run_measure_multiple_qudits(dtype: Type[np.complexfloating], split: bool):
438
+ def test_run_measure_multiple_qudits(dtype: type[np.complexfloating], split: bool):
438
439
  q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
439
440
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
440
441
  for b0 in [0, 1]:
@@ -448,7 +449,7 @@ def test_run_measure_multiple_qudits(dtype: Type[np.complexfloating], split: boo
448
449
 
449
450
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
450
451
  @pytest.mark.parametrize('split', [True, False])
451
- def test_run_sweeps_param_resolvers(dtype: Type[np.complexfloating], split: bool):
452
+ def test_run_sweeps_param_resolvers(dtype: type[np.complexfloating], split: bool):
452
453
  q0, q1 = cirq.LineQubit.range(2)
453
454
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
454
455
  for b0 in [0, 1]:
@@ -474,7 +475,7 @@ def test_run_sweeps_param_resolvers(dtype: Type[np.complexfloating], split: bool
474
475
 
475
476
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
476
477
  @pytest.mark.parametrize('split', [True, False])
477
- def test_simulate_no_circuit(dtype: Type[np.complexfloating], split: bool):
478
+ def test_simulate_no_circuit(dtype: type[np.complexfloating], split: bool):
478
479
  q0, q1 = cirq.LineQubit.range(2)
479
480
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
480
481
  circuit = cirq.Circuit()
@@ -487,7 +488,7 @@ def test_simulate_no_circuit(dtype: Type[np.complexfloating], split: bool):
487
488
 
488
489
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
489
490
  @pytest.mark.parametrize('split', [True, False])
490
- def test_simulate(dtype: Type[np.complexfloating], split: bool):
491
+ def test_simulate(dtype: type[np.complexfloating], split: bool):
491
492
  q0, q1 = cirq.LineQubit.range(2)
492
493
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
493
494
  circuit = cirq.Circuit(cirq.H(q0), cirq.H(q1))
@@ -498,7 +499,7 @@ def test_simulate(dtype: Type[np.complexfloating], split: bool):
498
499
 
499
500
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
500
501
  @pytest.mark.parametrize('split', [True, False])
501
- def test_simulate_qudits(dtype: Type[np.complexfloating], split: bool):
502
+ def test_simulate_qudits(dtype: type[np.complexfloating], split: bool):
502
503
  q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
503
504
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
504
505
  circuit = cirq.Circuit(cirq.H(q0), cirq.XPowGate(dimension=3)(q1) ** 2)
@@ -512,7 +513,7 @@ def test_simulate_qudits(dtype: Type[np.complexfloating], split: bool):
512
513
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
513
514
  @pytest.mark.parametrize('split', [True, False])
514
515
  def test_reset_one_qubit_does_not_affect_partial_trace_of_other_qubits(
515
- dtype: Type[np.complexfloating], split: bool
516
+ dtype: type[np.complexfloating], split: bool
516
517
  ):
517
518
  q0, q1 = cirq.LineQubit.range(2)
518
519
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
@@ -531,7 +532,7 @@ def test_reset_one_qubit_does_not_affect_partial_trace_of_other_qubits(
531
532
  [cirq.testing.random_circuit(cirq.LineQubit.range(4), 5, 0.9) for _ in range(20)],
532
533
  ),
533
534
  )
534
- def test_simulate_compare_to_state_vector_simulator(dtype: Type[np.complexfloating], circuit):
535
+ def test_simulate_compare_to_state_vector_simulator(dtype: type[np.complexfloating], circuit):
535
536
  qubits = cirq.LineQubit.range(4)
536
537
  pure_result = (
537
538
  cirq.Simulator(dtype=dtype).simulate(circuit, qubit_order=qubits).density_matrix_of()
@@ -547,7 +548,7 @@ def test_simulate_compare_to_state_vector_simulator(dtype: Type[np.complexfloati
547
548
 
548
549
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
549
550
  @pytest.mark.parametrize('split', [True, False])
550
- def test_simulate_bit_flips(dtype: Type[np.complexfloating], split: bool):
551
+ def test_simulate_bit_flips(dtype: type[np.complexfloating], split: bool):
551
552
  q0, q1 = cirq.LineQubit.range(2)
552
553
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
553
554
  for b0 in [0, 1]:
@@ -564,7 +565,7 @@ def test_simulate_bit_flips(dtype: Type[np.complexfloating], split: bool):
564
565
 
565
566
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
566
567
  @pytest.mark.parametrize('split', [True, False])
567
- def test_simulate_qudit_increments(dtype: Type[np.complexfloating], split: bool):
568
+ def test_simulate_qudit_increments(dtype: type[np.complexfloating], split: bool):
568
569
  q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
569
570
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
570
571
  for b0 in [0, 1]:
@@ -589,9 +590,9 @@ def test_simulate_qudit_increments(dtype: Type[np.complexfloating], split: bool)
589
590
  [1, cirq.DensityMatrixSimulationState(initial_state=1, qubits=cirq.LineQubit.range(2))],
590
591
  )
591
592
  def test_simulate_initial_state(
592
- dtype: Type[np.complexfloating],
593
+ dtype: type[np.complexfloating],
593
594
  split: bool,
594
- initial_state: Union[int, cirq.DensityMatrixSimulationState],
595
+ initial_state: int | cirq.DensityMatrixSimulationState,
595
596
  ):
596
597
  q0, q1 = cirq.LineQubit.range(2)
597
598
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
@@ -606,7 +607,7 @@ def test_simulate_initial_state(
606
607
 
607
608
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
608
609
  @pytest.mark.parametrize('split', [True, False])
609
- def test_simulation_state(dtype: Type[np.complexfloating], split: bool):
610
+ def test_simulation_state(dtype: type[np.complexfloating], split: bool):
610
611
  q0, q1 = cirq.LineQubit.range(2)
611
612
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
612
613
  for b0 in [0, 1]:
@@ -633,7 +634,7 @@ def test_simulate_tps_initial_state():
633
634
 
634
635
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
635
636
  @pytest.mark.parametrize('split', [True, False])
636
- def test_simulate_initial_qudit_state(dtype: Type[np.complexfloating], split: bool):
637
+ def test_simulate_initial_qudit_state(dtype: type[np.complexfloating], split: bool):
637
638
  q0, q1 = cirq.LineQid.for_qid_shape((3, 4))
638
639
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
639
640
  for b0 in [0, 1, 2]:
@@ -653,7 +654,7 @@ def test_simulate_initial_qudit_state(dtype: Type[np.complexfloating], split: bo
653
654
 
654
655
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
655
656
  @pytest.mark.parametrize('split', [True, False])
656
- def test_simulate_qubit_order(dtype: Type[np.complexfloating], split: bool):
657
+ def test_simulate_qubit_order(dtype: type[np.complexfloating], split: bool):
657
658
  q0, q1 = cirq.LineQubit.range(2)
658
659
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
659
660
  for b0 in [0, 1]:
@@ -667,7 +668,7 @@ def test_simulate_qubit_order(dtype: Type[np.complexfloating], split: bool):
667
668
 
668
669
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
669
670
  @pytest.mark.parametrize('split', [True, False])
670
- def test_simulate_param_resolver(dtype: Type[np.complexfloating], split: bool):
671
+ def test_simulate_param_resolver(dtype: type[np.complexfloating], split: bool):
671
672
  q0, q1 = cirq.LineQubit.range(2)
672
673
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
673
674
  for b0 in [0, 1]:
@@ -686,7 +687,7 @@ def test_simulate_param_resolver(dtype: Type[np.complexfloating], split: bool):
686
687
 
687
688
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
688
689
  @pytest.mark.parametrize('split', [True, False])
689
- def test_simulate_measure_multiple_qubits(dtype: Type[np.complexfloating], split: bool):
690
+ def test_simulate_measure_multiple_qubits(dtype: type[np.complexfloating], split: bool):
690
691
  q0, q1 = cirq.LineQubit.range(2)
691
692
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
692
693
  for b0 in [0, 1]:
@@ -698,7 +699,7 @@ def test_simulate_measure_multiple_qubits(dtype: Type[np.complexfloating], split
698
699
 
699
700
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
700
701
  @pytest.mark.parametrize('split', [True, False])
701
- def test_simulate_measure_multiple_qudits(dtype: Type[np.complexfloating], split: bool):
702
+ def test_simulate_measure_multiple_qudits(dtype: type[np.complexfloating], split: bool):
702
703
  q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
703
704
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
704
705
  for b0 in [0, 1]:
@@ -712,7 +713,7 @@ def test_simulate_measure_multiple_qudits(dtype: Type[np.complexfloating], split
712
713
 
713
714
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
714
715
  @pytest.mark.parametrize('split', [True, False])
715
- def test_simulate_sweeps_param_resolver(dtype: Type[np.complexfloating], split: bool):
716
+ def test_simulate_sweeps_param_resolver(dtype: type[np.complexfloating], split: bool):
716
717
  q0, q1 = cirq.LineQubit.range(2)
717
718
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
718
719
  for b0 in [0, 1]:
@@ -739,7 +740,7 @@ def test_simulate_sweeps_param_resolver(dtype: Type[np.complexfloating], split:
739
740
 
740
741
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
741
742
  @pytest.mark.parametrize('split', [True, False])
742
- def test_simulate_moment_steps(dtype: Type[np.complexfloating], split: bool):
743
+ def test_simulate_moment_steps(dtype: type[np.complexfloating], split: bool):
743
744
  q0, q1 = cirq.LineQubit.range(2)
744
745
  circuit = cirq.Circuit(cirq.H(q0), cirq.H(q1), cirq.H(q0), cirq.H(q1))
745
746
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
@@ -753,7 +754,7 @@ def test_simulate_moment_steps(dtype: Type[np.complexfloating], split: bool):
753
754
 
754
755
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
755
756
  @pytest.mark.parametrize('split', [True, False])
756
- def test_simulate_moment_steps_qudits(dtype: Type[np.complexfloating], split: bool):
757
+ def test_simulate_moment_steps_qudits(dtype: type[np.complexfloating], split: bool):
757
758
  q0, q1 = cirq.LineQid.for_qid_shape((2, 3))
758
759
  circuit = cirq.Circuit(
759
760
  cirq.XPowGate(dimension=2)(q0),
@@ -774,10 +775,9 @@ def test_simulate_moment_steps_qudits(dtype: Type[np.complexfloating], split: bo
774
775
 
775
776
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
776
777
  @pytest.mark.parametrize('split', [True, False])
777
- def test_simulate_moment_steps_empty_circuit(dtype: Type[np.complexfloating], split: bool):
778
+ def test_simulate_moment_steps_empty_circuit(dtype: type[np.complexfloating], split: bool):
778
779
  circuit = cirq.Circuit()
779
780
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
780
- step = None
781
781
  for step in simulator.simulate_moment_steps(circuit):
782
782
  pass
783
783
  assert np.allclose(step.density_matrix(), np.array([[1]]))
@@ -786,7 +786,7 @@ def test_simulate_moment_steps_empty_circuit(dtype: Type[np.complexfloating], sp
786
786
 
787
787
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
788
788
  @pytest.mark.parametrize('split', [True, False])
789
- def test_simulate_moment_steps_sample(dtype: Type[np.complexfloating], split: bool):
789
+ def test_simulate_moment_steps_sample(dtype: type[np.complexfloating], split: bool):
790
790
  q0, q1 = cirq.LineQubit.range(2)
791
791
  circuit = cirq.Circuit(cirq.H(q0), cirq.CNOT(q0, q1))
792
792
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
@@ -807,7 +807,7 @@ def test_simulate_moment_steps_sample(dtype: Type[np.complexfloating], split: bo
807
807
 
808
808
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
809
809
  @pytest.mark.parametrize('split', [True, False])
810
- def test_simulate_moment_steps_sample_qudits(dtype: Type[np.complexfloating], split: bool):
810
+ def test_simulate_moment_steps_sample_qudits(dtype: type[np.complexfloating], split: bool):
811
811
  class TestGate(cirq.Gate):
812
812
  """Swaps the 2nd qid |0> and |2> states when the 1st is |1>."""
813
813
 
@@ -837,7 +837,7 @@ def test_simulate_moment_steps_sample_qudits(dtype: Type[np.complexfloating], sp
837
837
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
838
838
  @pytest.mark.parametrize('split', [True, False])
839
839
  def test_simulate_moment_steps_intermediate_measurement(
840
- dtype: Type[np.complexfloating], split: bool
840
+ dtype: type[np.complexfloating], split: bool
841
841
  ):
842
842
  q0 = cirq.LineQubit(0)
843
843
  circuit = cirq.Circuit(cirq.H(q0), cirq.measure(q0), cirq.H(q0))