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
@@ -12,8 +12,11 @@
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
  import random
19
+ from typing import Iterable
17
20
 
18
21
  import pytest
19
22
 
@@ -21,27 +24,28 @@ import cirq
21
24
  import cirq.contrib.acquaintance as cca
22
25
 
23
26
 
24
- def test_bad_qubit_pairs():
27
+ def test_bad_qubit_pairs() -> None:
25
28
  a, b, c, d, e = cirq.LineQubit.range(5)
26
29
  bad_qubit_pairs = [(a, b), (c, d), (e,)]
27
30
  with pytest.raises(ValueError):
28
31
  cca.strategies.quartic_paired.qubit_pairs_to_qubit_order(bad_qubit_pairs)
29
32
 
30
33
 
31
- def random_index_pairs(n_pairs: int):
34
+ def random_index_pairs(n_pairs: int) -> tuple[tuple[int, int], ...]:
32
35
  indices = list(range(2 * n_pairs))
33
36
  random.shuffle(indices)
34
- return tuple(indices[2 * i : 2 * (i + 1)] for i in range(n_pairs))
37
+ return tuple(zip(indices[0::2], indices[1::2]))
35
38
 
36
39
 
37
40
  @pytest.mark.parametrize(
38
41
  'index_pairs', [random_index_pairs(n_pairs) for n_pairs in range(2, 7) for _ in range(2)]
39
42
  )
40
- def test_quartic_paired_acquaintances(index_pairs):
43
+ def test_quartic_paired_acquaintances(index_pairs) -> None:
41
44
  n_pairs = len(index_pairs)
42
- qubit_pairs = tuple(tuple(cirq.LineQubit(x) for x in index_pair) for index_pair in index_pairs)
45
+ qubit_pairs: Iterable[tuple[cirq.Qid, cirq.Qid]]
46
+ qubit_pairs = tuple((cirq.LineQubit(x), cirq.LineQubit(y)) for x, y in index_pairs)
43
47
  strategy, qubits = cca.quartic_paired_acquaintance_strategy(qubit_pairs)
44
- initial_mapping = {q: q.x for q in qubits}
48
+ initial_mapping = {q: q.x for q in qubits} # type: ignore[attr-defined]
45
49
  opps = cca.get_logical_acquaintance_opportunities(strategy, initial_mapping)
46
50
  assert set(len(opp) for opp in opps) == set([2, 4])
47
51
  quadratic_opps = set(opp for opp in opps if len(opp) == 2)
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from typing import cast, Sequence, TYPE_CHECKING
16
18
 
17
19
  from cirq import devices, ops, protocols
@@ -18,11 +18,11 @@ import operator
18
18
  import random
19
19
  from typing import Any, Callable, cast, Iterable, TYPE_CHECKING
20
20
 
21
- import networkx
22
-
23
21
  from cirq import ops
24
22
 
25
23
  if TYPE_CHECKING:
24
+ import networkx
25
+
26
26
  import cirq
27
27
 
28
28
 
@@ -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 pytest
16
18
 
17
19
  import cirq
@@ -29,7 +31,7 @@ import cirq.contrib.acquaintance as cca
29
31
  for _ in range(5)
30
32
  ],
31
33
  )
32
- def test_topological_sort(circuit_dag, sorted_nodes):
34
+ def test_topological_sort(circuit_dag, sorted_nodes) -> None:
33
35
  sorted_nodes = list(sorted_nodes)
34
36
  assert cca.is_topologically_sorted(circuit_dag, (node.val for node in sorted_nodes))
35
37
 
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import math
18
- from typing import Any, cast, Dict, Iterator, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union
18
+ from typing import Any, cast, Iterator, Sequence, TYPE_CHECKING
19
19
 
20
20
  from sympy.combinatorics import GrayCode
21
21
 
@@ -96,8 +96,8 @@ class BayesianNetworkGate(raw_types.Gate):
96
96
 
97
97
  def __init__(
98
98
  self,
99
- init_probs: List[Tuple[str, Optional[float]]],
100
- arc_probs: List[Tuple[str, Tuple[str], List[float]]],
99
+ init_probs: list[tuple[str, float | None]],
100
+ arc_probs: list[tuple[str, tuple[str, ...], list[float]]],
101
101
  ):
102
102
  """Builds a BayesianNetworkGate.
103
103
 
@@ -175,28 +175,27 @@ class BayesianNetworkGate(raw_types.Gate):
175
175
  def _has_unitary_(self) -> bool:
176
176
  return True
177
177
 
178
- def _qid_shape_(self) -> Tuple[int, ...]:
178
+ def _qid_shape_(self) -> tuple[int, ...]:
179
179
  return (2,) * len(self._init_probs)
180
180
 
181
181
  def _value_equality_values_(self):
182
182
  return self._init_probs, self._arc_probs
183
183
 
184
- def _json_dict_(self) -> Dict[str, Any]:
184
+ def _json_dict_(self) -> dict[str, Any]:
185
185
  return {'init_probs': self._init_probs, 'arc_probs': self._arc_probs}
186
186
 
187
187
  @classmethod
188
188
  def _from_json_dict_(
189
189
  cls,
190
- init_probs: List[List[Union[str, Optional[float]]]],
191
- arc_probs: List[List[Union[str, List[str], List[float]]]],
190
+ init_probs: list[list[str | float | None]],
191
+ arc_probs: list[list[str | list[str] | list[float]]],
192
192
  **kwargs,
193
193
  ) -> BayesianNetworkGate:
194
194
  converted_init_probs = cast(
195
- List[Tuple[str, Optional[float]]],
196
- [(param, init_prob) for param, init_prob in init_probs],
195
+ list[tuple[str, float | None]], [(param, init_prob) for param, init_prob in init_probs]
197
196
  )
198
197
  converted_cond_probs = cast(
199
- List[Tuple[str, Tuple[str], List[float]]],
198
+ list[tuple[str, tuple[str, ...], list[float]]],
200
199
  [(target, tuple(params), cond_probs) for target, params, cond_probs in arc_probs],
201
200
  )
202
201
  return cls(converted_init_probs, converted_cond_probs)
@@ -11,6 +11,9 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import numpy as np
15
18
  import pytest
16
19
 
@@ -18,14 +21,14 @@ import cirq
18
21
  import cirq.contrib.bayesian_network as ccb
19
22
 
20
23
 
21
- def test_basic_properties():
24
+ def test_basic_properties() -> None:
22
25
  gate = ccb.BayesianNetworkGate([('q0', None), ('q1', None), ('q2', None)], [])
23
26
 
24
27
  assert gate._has_unitary_()
25
28
  assert gate._qid_shape_() == (2, 2, 2)
26
29
 
27
30
 
28
- def test_incorrect_constructor():
31
+ def test_incorrect_constructor() -> None:
29
32
  # Success building.
30
33
  ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0',), [0.0, 0.0])])
31
34
 
@@ -34,7 +37,9 @@ def test_incorrect_constructor():
34
37
 
35
38
  # This is an easy mistake where the tuple for q0 doesn't have the comma at the end.
36
39
  with pytest.raises(ValueError, match='Conditional prob params must be a tuple.'):
37
- ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0'), [0.0, 0.0])])
40
+ ccb.BayesianNetworkGate(
41
+ [('q0', 0.0), ('q1', None)], [('q1', ('q0'), [0.0, 0.0])] # type: ignore
42
+ )
38
43
 
39
44
  with pytest.raises(ValueError, match='Incorrect number of conditional probs.'):
40
45
  ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0',), [0.0])])
@@ -43,17 +48,17 @@ def test_incorrect_constructor():
43
48
  ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0',), [2016.0913, 0.0])])
44
49
 
45
50
 
46
- def test_repr():
51
+ def test_repr() -> None:
47
52
  gate = ccb.BayesianNetworkGate([('q0', 0.0), ('q1', None)], [('q1', ('q0',), [0.0, 0.0])])
48
53
 
49
54
  assert repr(gate) == (
50
55
  "cirq.BayesianNetworkGate(init_probs=[('q0', 0.0), ('q1', None)],"
51
- + " arc_probs=[('q1', ('q0',), [0.0, 0.0])])"
56
+ " arc_probs=[('q1', ('q0',), [0.0, 0.0])])"
52
57
  )
53
58
 
54
59
 
55
60
  @pytest.mark.parametrize('input_prob', [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
56
- def test_prob_encoding(input_prob):
61
+ def test_prob_encoding(input_prob) -> None:
57
62
  q = cirq.NamedQubit('q')
58
63
  gate = ccb.BayesianNetworkGate([('q', input_prob)], [])
59
64
  circuit = cirq.Circuit(gate.on(q))
@@ -79,7 +84,7 @@ def test_prob_encoding(input_prob):
79
84
  ],
80
85
  )
81
86
  @pytest.mark.parametrize('decompose', [True, False])
82
- def test_initial_probs(p0, p1, p2, expected_probs, decompose):
87
+ def test_initial_probs(p0, p1, p2, expected_probs, decompose) -> None:
83
88
  q0, q1, q2 = cirq.LineQubit.range(3)
84
89
  gate = ccb.BayesianNetworkGate([('q0', p0), ('q1', p1), ('q2', p2)], [])
85
90
  if decompose:
@@ -99,7 +104,7 @@ def test_initial_probs(p0, p1, p2, expected_probs, decompose):
99
104
  [(0.0, 0.0, 0.1), (0.0, 1.0, 0.2), (1.0, 0.0, 0.3), (1.0, 1.0, 0.4)],
100
105
  )
101
106
  @pytest.mark.parametrize('decompose', [True, False])
102
- def test_arc_probs(input_prob_q0, input_prob_q1, expected_prob_q2, decompose):
107
+ def test_arc_probs(input_prob_q0, input_prob_q1, expected_prob_q2, decompose) -> None:
103
108
  q0, q1, q2 = cirq.LineQubit.range(3)
104
109
  gate = ccb.BayesianNetworkGate(
105
110
  [('q0', input_prob_q0), ('q1', input_prob_q1), ('q2', None)],
@@ -119,7 +124,7 @@ def test_arc_probs(input_prob_q0, input_prob_q1, expected_prob_q2, decompose):
119
124
  np.testing.assert_almost_equal(actual_prob_q2_is_one, expected_prob_q2, decimal=4)
120
125
 
121
126
 
122
- def test_repro_figure_10_of_paper():
127
+ def test_repro_figure_10_of_paper() -> None:
123
128
  # We try to create the network of figure 10 and check that the probabilities are the same as
124
129
  # the ones in table 10 of https://arxiv.org/abs/2004.14803.
125
130
  ir = cirq.NamedQubit('q4_IR')
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import functools
18
- from typing import Any, Callable, cast, Dict, Generic, Iterator, TypeVar
18
+ from typing import Any, Callable, cast, Generic, Iterator, TypeVar
19
19
 
20
20
  import networkx
21
21
 
@@ -44,7 +44,7 @@ class Unique(Generic[T]):
44
44
  def __repr__(self) -> str:
45
45
  return f'cirq.contrib.Unique({id(self)}, {self.val!r})'
46
46
 
47
- def __lt__(self, other):
47
+ def __lt__(self, other) -> bool:
48
48
  if not isinstance(other, type(self)):
49
49
  return NotImplemented
50
50
  return id(self) < id(other)
@@ -132,7 +132,7 @@ class CircuitDag(networkx.DiGraph):
132
132
  for node, attr in g2.nodes(data=True):
133
133
  attr['val'] = node.val
134
134
 
135
- def node_match(attr1: Dict[Any, Any], attr2: Dict[Any, Any]) -> bool:
135
+ def node_match(attr1: dict[Any, Any], attr2: dict[Any, Any]) -> bool:
136
136
  return attr1['val'] == attr2['val']
137
137
 
138
138
  return networkx.is_isomorphic(g1, g2, node_match=node_match)
@@ -176,7 +176,7 @@ class CircuitDag(networkx.DiGraph):
176
176
  def all_operations(self) -> Iterator[cirq.Operation]:
177
177
  return (node.val for node in self.ordered_nodes())
178
178
 
179
- def all_qubits(self):
179
+ def all_qubits(self) -> frozenset[cirq.Qid]:
180
180
  return frozenset(q for node in self.nodes for q in node.val.qubits)
181
181
 
182
182
  def to_circuit(self) -> cirq.Circuit:
@@ -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
  import random
17
19
 
@@ -25,7 +27,7 @@ class FakeDevice(cirq.Device):
25
27
  pass
26
28
 
27
29
 
28
- def test_wrapper_eq():
30
+ def test_wrapper_eq() -> None:
29
31
  q0, q1 = cirq.LineQubit.range(2)
30
32
  eq = cirq.testing.EqualsTester()
31
33
  eq.add_equality_group(cirq.contrib.CircuitDag.make_node(cirq.X(q0)))
@@ -34,7 +36,7 @@ def test_wrapper_eq():
34
36
  eq.add_equality_group(cirq.contrib.CircuitDag.make_node(cirq.X(q1)))
35
37
 
36
38
 
37
- def test_wrapper_cmp():
39
+ def test_wrapper_cmp() -> None:
38
40
  u0 = cirq.contrib.Unique(0)
39
41
  u1 = cirq.contrib.Unique(1)
40
42
  # The ordering of Unique instances is unpredictable
@@ -49,14 +51,14 @@ def test_wrapper_cmp():
49
51
  assert u1 >= u0
50
52
 
51
53
 
52
- def test_wrapper_cmp_failure():
54
+ def test_wrapper_cmp_failure() -> None:
53
55
  with pytest.raises(TypeError):
54
56
  _ = object() < cirq.contrib.Unique(1)
55
57
  with pytest.raises(TypeError):
56
58
  _ = cirq.contrib.Unique(1) < object()
57
59
 
58
60
 
59
- def test_wrapper_repr():
61
+ def test_wrapper_repr() -> None:
60
62
  q0 = cirq.LineQubit(0)
61
63
 
62
64
  node = cirq.contrib.CircuitDag.make_node(cirq.X(q0))
@@ -64,14 +66,14 @@ def test_wrapper_repr():
64
66
  assert repr(node) == expected
65
67
 
66
68
 
67
- def test_init():
69
+ def test_init() -> None:
68
70
  dag = cirq.contrib.CircuitDag()
69
71
  assert networkx.dag.is_directed_acyclic_graph(dag)
70
72
  assert list(dag.nodes()) == []
71
73
  assert list(dag.edges()) == []
72
74
 
73
75
 
74
- def test_append():
76
+ def test_append() -> None:
75
77
  q0 = cirq.LineQubit(0)
76
78
  dag = cirq.contrib.CircuitDag()
77
79
  dag.append(cirq.X(q0))
@@ -81,7 +83,7 @@ def test_append():
81
83
  assert [(n1.val, n2.val) for n1, n2 in dag.edges()] == [(cirq.X(q0), cirq.Y(q0))]
82
84
 
83
85
 
84
- def test_two_identical_ops():
86
+ def test_two_identical_ops() -> None:
85
87
  q0 = cirq.LineQubit(0)
86
88
  dag = cirq.contrib.CircuitDag()
87
89
  dag.append(cirq.X(q0))
@@ -96,7 +98,7 @@ def test_two_identical_ops():
96
98
  }
97
99
 
98
100
 
99
- def test_from_ops():
101
+ def test_from_ops() -> None:
100
102
  q0 = cirq.LineQubit(0)
101
103
  dag = cirq.contrib.CircuitDag.from_ops(cirq.X(q0), cirq.Y(q0))
102
104
  assert networkx.dag.is_directed_acyclic_graph(dag)
@@ -104,7 +106,7 @@ def test_from_ops():
104
106
  assert [(n1.val, n2.val) for n1, n2 in dag.edges()] == [(cirq.X(q0), cirq.Y(q0))]
105
107
 
106
108
 
107
- def test_from_circuit():
109
+ def test_from_circuit() -> None:
108
110
  q0 = cirq.LineQubit(0)
109
111
  circuit = cirq.Circuit(cirq.X(q0), cirq.Y(q0))
110
112
  dag = cirq.contrib.CircuitDag.from_circuit(circuit)
@@ -114,14 +116,14 @@ def test_from_circuit():
114
116
  assert sorted(circuit.all_qubits()) == sorted(dag.all_qubits())
115
117
 
116
118
 
117
- def test_to_empty_circuit():
119
+ def test_to_empty_circuit() -> None:
118
120
  circuit = cirq.Circuit()
119
121
  dag = cirq.contrib.CircuitDag.from_circuit(circuit)
120
122
  assert networkx.dag.is_directed_acyclic_graph(dag)
121
123
  assert circuit == dag.to_circuit()
122
124
 
123
125
 
124
- def test_to_circuit():
126
+ def test_to_circuit() -> None:
125
127
  q0 = cirq.LineQubit(0)
126
128
  circuit = cirq.Circuit(cirq.X(q0), cirq.Y(q0))
127
129
  dag = cirq.contrib.CircuitDag.from_circuit(circuit)
@@ -135,7 +137,7 @@ def test_to_circuit():
135
137
  )
136
138
 
137
139
 
138
- def test_equality():
140
+ def test_equality() -> None:
139
141
  q0, q1 = cirq.LineQubit.range(2)
140
142
  circuit1 = cirq.Circuit(
141
143
  cirq.X(q0), cirq.Y(q0), cirq.Z(q1), cirq.CZ(q0, q1), cirq.X(q1), cirq.Y(q1), cirq.Z(q0)
@@ -165,7 +167,7 @@ def test_equality():
165
167
  eq.add_equality_group(cirq.contrib.CircuitDag.from_circuit(circuit4))
166
168
 
167
169
 
168
- def test_larger_circuit():
170
+ def test_larger_circuit() -> None:
169
171
  q0, q1, q2, q3 = [
170
172
  cirq.GridQubit(0, 5),
171
173
  cirq.GridQubit(1, 5),
@@ -211,7 +213,7 @@ def test_larger_circuit():
211
213
 
212
214
 
213
215
  @pytest.mark.parametrize('circuit', [cirq.testing.random_circuit(10, 10, 0.5) for _ in range(3)])
214
- def test_is_maximalist(circuit):
216
+ def test_is_maximalist(circuit) -> None:
215
217
  dag = cirq.contrib.CircuitDag.from_circuit(circuit)
216
218
  transitive_closure = networkx.dag.transitive_closure(dag)
217
219
  assert cirq.contrib.CircuitDag(incoming_graph_data=transitive_closure) == dag
@@ -230,7 +232,7 @@ def _get_circuits_and_is_blockers():
230
232
 
231
233
 
232
234
  @pytest.mark.parametrize('circuit, is_blocker', _get_circuits_and_is_blockers())
233
- def test_findall_nodes_until_blocked(circuit, is_blocker):
235
+ def test_findall_nodes_until_blocked(circuit, is_blocker) -> None:
234
236
  dag = cirq.contrib.CircuitDag.from_circuit(circuit)
235
237
  all_nodes = list(dag.ordered_nodes())
236
238
  found_nodes = list(dag.findall_nodes_until_blocked(is_blocker))
@@ -14,14 +14,14 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Dict, Generic, Sequence, Type, TYPE_CHECKING
18
-
19
- import numpy as np
17
+ from typing import Any, Generic, Sequence, TYPE_CHECKING
20
18
 
21
19
  from cirq import sim
22
20
  from cirq.sim.simulation_state import TSimulationState
23
21
 
24
22
  if TYPE_CHECKING:
23
+ import numpy as np
24
+
25
25
  import cirq
26
26
 
27
27
 
@@ -47,7 +47,7 @@ class CustomStateSimulator(
47
47
 
48
48
  def __init__(
49
49
  self,
50
- state_type: Type[TSimulationState],
50
+ state_type: type[TSimulationState],
51
51
  *,
52
52
  noise: cirq.NOISE_MODEL_LIKE = None,
53
53
  split_untangled_states: bool = False,
@@ -66,7 +66,7 @@ class CustomStateSimulator(
66
66
  def _create_simulator_trial_result(
67
67
  self,
68
68
  params: cirq.ParamResolver,
69
- measurements: Dict[str, np.ndarray],
69
+ measurements: dict[str, np.ndarray],
70
70
  final_simulator_state: cirq.SimulationStateBase[TSimulationState],
71
71
  ) -> CustomStateTrialResult[TSimulationState]:
72
72
  return CustomStateTrialResult(
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import List, Sequence, Tuple
17
+ from typing import Sequence
18
18
 
19
19
  import numpy as np
20
20
  import sympy
@@ -24,13 +24,15 @@ from cirq.contrib.custom_simulators.custom_state_simulator import CustomStateSim
24
24
 
25
25
 
26
26
  class ComputationalBasisState(cirq.qis.QuantumStateRepresentation):
27
- def __init__(self, initial_state: List[int]):
27
+ def __init__(self, initial_state: list[int]):
28
28
  self.basis = initial_state
29
29
 
30
30
  def copy(self, deep_copy_buffers: bool = True) -> ComputationalBasisState:
31
31
  return ComputationalBasisState(self.basis) # pragma: no cover
32
32
 
33
- def measure(self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None):
33
+ def measure(
34
+ self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
35
+ ) -> list[int]:
34
36
  return [self.basis[i] for i in axes]
35
37
 
36
38
 
@@ -49,7 +51,7 @@ class ComputationalBasisSimState(cirq.SimulationState[ComputationalBasisState]):
49
51
  return True
50
52
 
51
53
 
52
- def create_test_circuit():
54
+ def create_test_circuit() -> cirq.Circuit:
53
55
  q0, q1 = cirq.LineQid.range(2, dimension=3)
54
56
  x = cirq.XPowGate(dimension=3)
55
57
  return cirq.Circuit(
@@ -64,26 +66,27 @@ def create_test_circuit():
64
66
  )
65
67
 
66
68
 
67
- def test_basis_state_simulator():
69
+ def test_basis_state_simulator() -> None:
68
70
  sim = CustomStateSimulator(ComputationalBasisSimState)
69
71
  circuit = create_test_circuit()
70
72
  r = sim.simulate(circuit)
71
73
  assert r.measurements == {'a': np.array([1]), 'b': np.array([2])}
72
- assert r._final_simulator_state._state.basis == [2, 2]
74
+ assert r._final_simulator_state._state.basis == [2, 2] # type: ignore[attr-defined]
73
75
 
74
76
 
75
- def test_built_in_states():
77
+ def test_built_in_states() -> None:
76
78
  # Verify this works for the built-in states too, you just lose the custom step/trial results.
77
79
  sim = CustomStateSimulator(cirq.StateVectorSimulationState)
78
80
  circuit = create_test_circuit()
79
81
  r = sim.simulate(circuit)
80
82
  assert r.measurements == {'a': np.array([1]), 'b': np.array([2])}
81
83
  assert np.allclose(
82
- r._final_simulator_state._state._state_vector, [[0, 0, 0], [0, 0, 0], [0, 0, 1]]
84
+ r._final_simulator_state._state._state_vector, # type: ignore[attr-defined]
85
+ [[0, 0, 0], [0, 0, 0], [0, 0, 1]],
83
86
  )
84
87
 
85
88
 
86
- def test_product_state_mode_built_in_state():
89
+ def test_product_state_mode_built_in_state() -> None:
87
90
  sim = CustomStateSimulator(cirq.StateVectorSimulationState, split_untangled_states=True)
88
91
  circuit = create_test_circuit()
89
92
  r = sim.simulate(circuit)
@@ -99,16 +102,16 @@ def test_product_state_mode_built_in_state():
99
102
  )
100
103
 
101
104
 
102
- def test_noise():
105
+ def test_noise() -> None:
103
106
  x = cirq.XPowGate(dimension=3)
104
107
  sim = CustomStateSimulator(ComputationalBasisSimState, noise=x**2)
105
108
  circuit = create_test_circuit()
106
109
  r = sim.simulate(circuit)
107
110
  assert r.measurements == {'a': np.array([2]), 'b': np.array([2])}
108
- assert r._final_simulator_state._state.basis == [1, 2]
111
+ assert r._final_simulator_state._state.basis == [1, 2] # type: ignore[attr-defined]
109
112
 
110
113
 
111
- def test_run():
114
+ def test_run() -> None:
112
115
  sim = CustomStateSimulator(ComputationalBasisSimState)
113
116
  circuit = create_test_circuit()
114
117
  r = sim.run(circuit)
@@ -116,7 +119,7 @@ def test_run():
116
119
  assert np.allclose(r.records['b'], np.array([[1], [2]]))
117
120
 
118
121
 
119
- def test_parameterized_repetitions():
122
+ def test_parameterized_repetitions() -> None:
120
123
  q = cirq.LineQid(0, dimension=5)
121
124
  x = cirq.XPowGate(dimension=5)
122
125
  circuit = cirq.Circuit(
@@ -136,13 +139,15 @@ def test_parameterized_repetitions():
136
139
 
137
140
 
138
141
  class ComputationalBasisProductState(cirq.qis.QuantumStateRepresentation):
139
- def __init__(self, initial_state: List[int]):
142
+ def __init__(self, initial_state: list[int]):
140
143
  self.basis = initial_state
141
144
 
142
145
  def copy(self, deep_copy_buffers: bool = True) -> ComputationalBasisProductState:
143
146
  return ComputationalBasisProductState(self.basis)
144
147
 
145
- def measure(self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None):
148
+ def measure(
149
+ self, axes: Sequence[int], seed: cirq.RANDOM_STATE_OR_SEED_LIKE = None
150
+ ) -> list[int]:
146
151
  return [self.basis[i] for i in axes]
147
152
 
148
153
  def kron(self, other: ComputationalBasisProductState) -> ComputationalBasisProductState:
@@ -150,7 +155,7 @@ class ComputationalBasisProductState(cirq.qis.QuantumStateRepresentation):
150
155
 
151
156
  def factor(
152
157
  self, axes: Sequence[int], *, validate=True, atol=1e-07
153
- ) -> Tuple[ComputationalBasisProductState, ComputationalBasisProductState]:
158
+ ) -> tuple[ComputationalBasisProductState, ComputationalBasisProductState]:
154
159
  extracted = ComputationalBasisProductState(
155
160
  [self.basis[i] for i in axes]
156
161
  ) # pragma: no cover
@@ -182,7 +187,7 @@ class ComputationalBasisSimProductState(cirq.SimulationState[ComputationalBasisP
182
187
  return True
183
188
 
184
189
 
185
- def test_product_state_mode():
190
+ def test_product_state_mode() -> None:
186
191
  sim = CustomStateSimulator(ComputationalBasisSimProductState, split_untangled_states=True)
187
192
  circuit = create_test_circuit()
188
193
  r = sim.simulate(circuit)
@@ -16,7 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import abc
18
18
  import itertools
19
- from typing import cast, Iterable, Optional, Tuple, TYPE_CHECKING
19
+ from typing import Any, cast, Hashable, Iterable, NoReturn, TYPE_CHECKING
20
20
 
21
21
  from cirq import devices, ops, value
22
22
  from cirq.contrib.graph_device.hypergraph import UndirectedHypergraph
@@ -98,7 +98,7 @@ def is_crosstalk_graph(graph: UndirectedHypergraph) -> bool:
98
98
  return True
99
99
 
100
100
 
101
- def raise_crosstalk_error(*ops: ops.Operation):
101
+ def raise_crosstalk_error(*ops: ops.Operation) -> NoReturn:
102
102
  raise ValueError(f'crosstalk on {ops}')
103
103
 
104
104
 
@@ -122,8 +122,8 @@ class UndirectedGraphDevice(devices.Device):
122
122
 
123
123
  def __init__(
124
124
  self,
125
- device_graph: Optional[UndirectedHypergraph] = None,
126
- crosstalk_graph: Optional[UndirectedHypergraph] = None,
125
+ device_graph: UndirectedHypergraph | None = None,
126
+ crosstalk_graph: UndirectedHypergraph | None = None,
127
127
  ) -> None:
128
128
  """Inits UndirectedGraphDevice.
129
129
 
@@ -152,15 +152,15 @@ class UndirectedGraphDevice(devices.Device):
152
152
  self.crosstalk_graph = crosstalk_graph
153
153
 
154
154
  @property
155
- def qubits(self) -> Tuple[cirq.Qid, ...]:
156
- return cast(Tuple['cirq.Qid', ...], tuple(sorted(self.device_graph.vertices)))
155
+ def qubits(self) -> tuple[cirq.Qid, ...]:
156
+ return cast(tuple['cirq.Qid', ...], tuple(sorted(self.device_graph.vertices)))
157
157
 
158
158
  @property
159
- def edges(self):
159
+ def edges(self) -> tuple[frozenset[Hashable], ...]:
160
160
  return tuple(sorted(self.device_graph.edges))
161
161
 
162
162
  @property
163
- def labelled_edges(self):
163
+ def labelled_edges(self) -> dict[frozenset, Any]:
164
164
  return self.device_graph.labelled_edges
165
165
 
166
166
  def get_device_edge_from_op(self, operation: ops.Operation) -> UndirectedGraphDeviceEdge:
@@ -174,8 +174,8 @@ class UndirectedGraphDevice(devices.Device):
174
174
  device_edge = self.get_device_edge_from_op(operation)
175
175
  except Exception as error:
176
176
  if frozenset(operation.qubits) not in self.device_graph.edges:
177
- error = ValueError(f'{operation.qubits} not in device graph edges')
178
- raise error
177
+ raise ValueError(f'{operation.qubits} not in device graph edges') from error
178
+ raise # pragma: no cover
179
179
  device_edge.validate_operation(operation)
180
180
 
181
181
  def validate_crosstalk(
@@ -185,6 +185,7 @@ class UndirectedGraphDevice(devices.Device):
185
185
  self.crosstalk_graph._adjacency_lists.get(frozenset(operation.qubits), ())
186
186
  )
187
187
  for crosstalk_edge in adjacent_crosstalk_edges:
188
+ # pylint: disable=unreachable
188
189
  label = self.crosstalk_graph.labelled_edges[crosstalk_edge]
189
190
  validator = (
190
191
  raise_crosstalk_error(operation, *other_operations) if (label is None) else label
@@ -194,7 +195,7 @@ class UndirectedGraphDevice(devices.Device):
194
195
  ):
195
196
  validator(operation, *crosstalk_operations)
196
197
 
197
- def validate_moment(self, moment: cirq.Moment):
198
+ def validate_moment(self, moment: cirq.Moment) -> None:
198
199
  super().validate_moment(moment)
199
200
  ops = moment.operations
200
201
  for i, op in enumerate(ops):