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
cirq/value/timestamp.py CHANGED
@@ -11,8 +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
+
14
15
  """A typed location in time that supports picosecond accuracy."""
15
16
 
17
+ from __future__ import annotations
18
+
16
19
  from datetime import timedelta
17
20
  from typing import overload
18
21
 
@@ -45,23 +48,26 @@ class Timestamp:
45
48
  """The timestamp's location in picoseconds from arbitrary time zero."""
46
49
  return self._picos
47
50
 
48
- def __add__(self, other) -> 'Timestamp':
51
+ def __add__(self, other) -> Timestamp:
49
52
  if isinstance(other, timedelta):
50
53
  return Timestamp(picos=self._picos + other.total_seconds() * 10**12)
51
54
  if not isinstance(other, Duration):
52
55
  return NotImplemented
53
56
  return Timestamp(picos=self._picos + other.total_picos())
54
57
 
55
- def __radd__(self, other) -> 'Timestamp':
58
+ def __radd__(self, other) -> Timestamp:
56
59
  return self.__add__(other)
57
60
 
58
- # pylint: disable=function-redefined
59
61
  @overload
60
- def __sub__(self, other: 'Timestamp') -> Duration:
62
+ def __sub__(self, other: Timestamp) -> Duration:
63
+ pass
64
+
65
+ @overload
66
+ def __sub__(self, other: Duration) -> Timestamp:
61
67
  pass
62
68
 
63
69
  @overload
64
- def __sub__(self, other: Duration) -> 'Timestamp':
70
+ def __sub__(self, other: timedelta) -> Timestamp:
65
71
  pass
66
72
 
67
73
  def __sub__(self, other):
@@ -73,8 +79,6 @@ class Timestamp:
73
79
  return Duration(picos=self._picos - other._picos)
74
80
  return NotImplemented
75
81
 
76
- # pylint: enable=function-redefined
77
-
78
82
  def __eq__(self, other):
79
83
  if not isinstance(other, type(self)):
80
84
  return NotImplemented
@@ -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 datetime import timedelta
16
18
 
17
19
  import pytest
@@ -20,7 +22,7 @@ import cirq
20
22
  from cirq import Duration, Timestamp
21
23
 
22
24
 
23
- def test_init():
25
+ def test_init() -> None:
24
26
  assert Timestamp().raw_picos() == 0
25
27
  assert Timestamp(picos=513).raw_picos() == 513
26
28
  assert Timestamp(picos=-5).raw_picos() == -5
@@ -33,13 +35,13 @@ def test_init():
33
35
  assert isinstance(Timestamp(nanos=1.0).raw_picos(), float)
34
36
 
35
37
 
36
- def test_str():
38
+ def test_str() -> None:
37
39
  assert str(Timestamp(picos=1000, nanos=1000)) == 't=1001000'
38
40
  assert str(Timestamp(nanos=5.0)) == 't=5000.0'
39
41
  assert str(Timestamp(picos=-100)) == 't=-100'
40
42
 
41
43
 
42
- def test_repr():
44
+ def test_repr() -> None:
43
45
  a = Timestamp(picos=1000, nanos=1000)
44
46
  cirq.testing.assert_equivalent_repr(a)
45
47
  b = Timestamp(nanos=5.0)
@@ -48,14 +50,14 @@ def test_repr():
48
50
  cirq.testing.assert_equivalent_repr(c)
49
51
 
50
52
 
51
- def test_eq():
53
+ def test_eq() -> None:
52
54
  eq = cirq.testing.EqualsTester()
53
55
  eq.add_equality_group(Timestamp(), Timestamp(picos=0), Timestamp(nanos=0.0))
54
56
  eq.add_equality_group(Timestamp(picos=1000), Timestamp(nanos=1))
55
57
  eq.make_equality_group(lambda: Timestamp(picos=-1))
56
58
 
57
59
 
58
- def test_cmp():
60
+ def test_cmp() -> None:
59
61
  ordered_groups = [
60
62
  Timestamp(picos=-1),
61
63
  Timestamp(),
@@ -75,13 +77,13 @@ def test_cmp():
75
77
  assert (i >= j) == (a >= b)
76
78
  assert (i > j) == (a > b)
77
79
 
78
- assert not (Timestamp() == 0)
80
+ assert not (Timestamp() == 0) # noqa: SIM201
79
81
  assert Timestamp() != 0
80
- assert not (Timestamp() == Duration())
82
+ assert not (Timestamp() == Duration()) # noqa: SIM201
81
83
  assert Timestamp() != Duration()
82
84
 
83
85
 
84
- def test_cmp_vs_other_type():
86
+ def test_cmp_vs_other_type() -> None:
85
87
  with pytest.raises(TypeError):
86
88
  _ = Timestamp() < Duration()
87
89
  with pytest.raises(TypeError):
@@ -94,7 +96,7 @@ def test_cmp_vs_other_type():
94
96
  _ = Timestamp() > 0
95
97
 
96
98
 
97
- def test_add():
99
+ def test_add() -> None:
98
100
  assert Timestamp(picos=1) + Duration(picos=2) == Timestamp(picos=3)
99
101
  assert Duration(picos=3) + Timestamp(picos=-5) == Timestamp(picos=-2)
100
102
 
@@ -109,7 +111,7 @@ def test_add():
109
111
  _ = Timestamp() + 1
110
112
 
111
113
 
112
- def test_sub():
114
+ def test_sub() -> None:
113
115
  assert Timestamp() - Timestamp() == Duration()
114
116
  assert Timestamp(picos=1) - Timestamp(picos=2) == Duration(picos=-1)
115
117
  assert Timestamp(picos=5) - Duration(picos=2) == Timestamp(picos=3)
@@ -118,6 +120,6 @@ def test_sub():
118
120
  with pytest.raises(TypeError):
119
121
  _ = Duration() - Timestamp()
120
122
  with pytest.raises(TypeError):
121
- _ = 1 - Timestamp()
123
+ _ = 1 - Timestamp() # type: ignore[operator]
122
124
  with pytest.raises(TypeError):
123
- _ = Timestamp() - 1
125
+ _ = Timestamp() - 1 # type: ignore[operator]
cirq/value/type_alias.py CHANGED
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Union
15
+ from __future__ import annotations
16
16
 
17
17
  import numpy as np
18
18
  import sympy
@@ -22,11 +22,11 @@ from cirq._doc import document
22
22
  """Supply aliases for commonly used types.
23
23
  """
24
24
 
25
- TParamKey = Union[str, sympy.Expr]
25
+ TParamKey = str | sympy.Expr
26
26
  document(TParamKey, """A parameter that a parameter resolver may map to a value.""")
27
27
 
28
- TParamVal = Union[float, sympy.Expr]
28
+ TParamVal = float | sympy.Expr
29
29
  document(TParamVal, """A value that a parameter resolver may return for a parameter.""")
30
30
 
31
- TParamValComplex = Union[complex, np.number, sympy.Expr]
31
+ TParamValComplex = complex | np.number | sympy.Expr
32
32
  document(TParamValComplex, """A complex value that parameter resolvers may use for parameters.""")
@@ -11,9 +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
  """Defines `@cirq.value_equality`, for easy __eq__/__hash__ methods."""
15
16
 
16
- from typing import Any, Callable, Dict, Optional, overload, Union
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Callable, overload
17
20
 
18
21
  from typing_extensions import Protocol
19
22
 
@@ -83,7 +86,7 @@ def _value_equality_eq(self: _SupportsValueEquality, other: _SupportsValueEquali
83
86
 
84
87
 
85
88
  def _value_equality_ne(self: _SupportsValueEquality, other: _SupportsValueEquality) -> bool:
86
- return not self == other
89
+ return not self == other # noqa: SIM201
87
90
 
88
91
 
89
92
  def _value_equality_hash(self: _SupportsValueEquality) -> int:
@@ -110,7 +113,7 @@ def _value_equality_approx_eq(
110
113
  )
111
114
 
112
115
 
113
- def _value_equality_getstate(self: _SupportsValueEquality) -> Dict[str, Any]:
116
+ def _value_equality_getstate(self: _SupportsValueEquality) -> dict[str, Any]:
114
117
  # clear cached hash value when pickling, see #6674
115
118
  state = self.__dict__
116
119
  hash_attr = _compat._method_cache_name(self.__hash__)
@@ -120,7 +123,6 @@ def _value_equality_getstate(self: _SupportsValueEquality) -> Dict[str, Any]:
120
123
  return state
121
124
 
122
125
 
123
- # pylint: disable=function-redefined
124
126
  @overload
125
127
  def value_equality(
126
128
  cls: type,
@@ -145,13 +147,13 @@ def value_equality(
145
147
 
146
148
 
147
149
  def value_equality(
148
- cls: Optional[type] = None,
150
+ cls: type | None = None,
149
151
  *,
150
152
  unhashable: bool = False,
151
153
  distinct_child_types: bool = False,
152
154
  manual_cls: bool = False,
153
155
  approximate: bool = False,
154
- ) -> Union[Callable[[type], type], type]:
156
+ ) -> Callable[[type], type] | type:
155
157
  """Implements __eq__/__ne__/__hash__ via a _value_equality_values_ method.
156
158
 
157
159
  _value_equality_values_ is a method that the decorated class must implement.
@@ -255,6 +257,3 @@ def value_equality(
255
257
  setattr(cls, '_approx_eq_', _value_equality_approx_eq)
256
258
 
257
259
  return cls
258
-
259
-
260
- # pylint: enable=function-redefined
@@ -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 pytest
15
18
 
16
19
  import cirq
@@ -54,7 +57,7 @@ class BasicCb(BasicC):
54
57
  pass
55
58
 
56
59
 
57
- def test_value_equality_basic():
60
+ def test_value_equality_basic() -> None:
58
61
 
59
62
  # Lookup works across equivalent types.
60
63
  v = {BasicC(1): 4, BasicCa(2): 5}
@@ -69,7 +72,7 @@ def test_value_equality_basic():
69
72
  eq.add_equality_group(BasicCa(3))
70
73
 
71
74
 
72
- def test_value_equality_manual():
75
+ def test_value_equality_manual() -> None:
73
76
  eq = cirq.testing.EqualsTester()
74
77
  eq.add_equality_group(MasqueradePositiveD(3), BasicD(3))
75
78
  eq.add_equality_group(MasqueradePositiveD(4), MasqueradePositiveD(4), BasicD(4))
@@ -105,7 +108,7 @@ class UnhashableCb(UnhashableC):
105
108
  pass
106
109
 
107
110
 
108
- def test_value_equality_unhashable():
111
+ def test_value_equality_unhashable() -> None:
109
112
  # Not possible to use as a dictionary key.
110
113
  with pytest.raises(TypeError, match='unhashable'):
111
114
  _ = {UnhashableC(1): 4}
@@ -143,7 +146,7 @@ class DistinctCb(DistinctC):
143
146
  pass
144
147
 
145
148
 
146
- def test_value_equality_distinct_child_types():
149
+ def test_value_equality_distinct_child_types() -> None:
147
150
  # Lookup is distinct across child types.
148
151
  v = {DistinctC(1): 4, DistinctCa(1): 5, DistinctCb(1): 6}
149
152
  assert v[DistinctC(1)] == 4
@@ -168,7 +171,7 @@ class ApproxE:
168
171
  return self.x
169
172
 
170
173
 
171
- def test_value_equality_approximate():
174
+ def test_value_equality_approximate() -> None:
172
175
  assert cirq.approx_eq(ApproxE(0.0), ApproxE(0.0), atol=0.1)
173
176
  assert cirq.approx_eq(ApproxE(0.0), ApproxE(0.2), atol=0.3)
174
177
  assert not cirq.approx_eq(ApproxE(0.0), ApproxE(0.2), atol=0.1)
@@ -187,13 +190,13 @@ class PeriodicF:
187
190
  return self.x % self.n
188
191
 
189
192
 
190
- def test_value_equality_approximate_specialized():
193
+ def test_value_equality_approximate_specialized() -> None:
191
194
  assert PeriodicF(1, 4) != PeriodicF(5, 4)
192
195
  assert cirq.approx_eq(PeriodicF(1, 4), PeriodicF(5, 4), atol=0.1)
193
196
  assert not cirq.approx_eq(PeriodicF(1, 4), PeriodicF(6, 4), atol=0.1)
194
197
 
195
198
 
196
- def test_value_equality_approximate_not_supported():
199
+ def test_value_equality_approximate_not_supported() -> None:
197
200
  assert not cirq.approx_eq(BasicC(0.0), BasicC(0.1), atol=0.2)
198
201
 
199
202
 
@@ -222,7 +225,7 @@ class ApproxGb(ApproxG):
222
225
  pass
223
226
 
224
227
 
225
- def test_value_equality_approximate_typing():
228
+ def test_value_equality_approximate_typing() -> None:
226
229
  assert not cirq.approx_eq(ApproxE(0.0), PeriodicF(0.0, 1.0), atol=0.1)
227
230
  assert cirq.approx_eq(ApproxEa(0.0), ApproxEb(0.0), atol=0.1)
228
231
  assert cirq.approx_eq(ApproxG(0.0), ApproxG(0.0), atol=0.1)
@@ -230,7 +233,7 @@ def test_value_equality_approximate_typing():
230
233
  assert not cirq.approx_eq(ApproxG(0.0), ApproxGb(0.0), atol=0.1)
231
234
 
232
235
 
233
- def test_value_equality_forgot_method():
236
+ def test_value_equality_forgot_method() -> None:
234
237
  with pytest.raises(TypeError, match='_value_equality_values_'):
235
238
 
236
239
  @cirq.value_equality
@@ -238,7 +241,7 @@ def test_value_equality_forgot_method():
238
241
  pass
239
242
 
240
243
 
241
- def test_bad_manual_cls_incompatible_args():
244
+ def test_bad_manual_cls_incompatible_args() -> None:
242
245
  with pytest.raises(ValueError, match='incompatible'):
243
246
 
244
247
  @cirq.value_equality(manual_cls=True, distinct_child_types=True)
@@ -246,7 +249,7 @@ def test_bad_manual_cls_incompatible_args():
246
249
  pass
247
250
 
248
251
 
249
- def test_bad_manual_cls_forgot_method():
252
+ def test_bad_manual_cls_forgot_method() -> None:
250
253
  with pytest.raises(TypeError, match='_value_equality_values_cls_'):
251
254
 
252
255
  @cirq.value_equality(manual_cls=True)
@@ -14,7 +14,7 @@
14
14
 
15
15
  """Tool to visualize the magnitudes and phases in the density matrix"""
16
16
 
17
- from typing import Optional
17
+ from __future__ import annotations
18
18
 
19
19
  import matplotlib.pyplot as plt
20
20
  import numpy as np
@@ -79,10 +79,10 @@ def _plot_element_of_density_matrix(ax, x, y, r, phase, show_rect=False, show_te
79
79
 
80
80
  def plot_density_matrix(
81
81
  matrix: np.ndarray,
82
- ax: Optional[plt.Axes] = None,
82
+ ax: plt.Axes | None = None,
83
83
  *,
84
84
  show_text: bool = False,
85
- title: Optional[str] = None,
85
+ title: str | None = None,
86
86
  ) -> plt.Axes:
87
87
  """Generates a plot for a given density matrix.
88
88
 
@@ -11,8 +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
+
14
15
  """Tests for Density Matrix Plotter."""
15
16
 
17
+ from __future__ import annotations
18
+
16
19
  import numpy as np
17
20
  import pytest
18
21
  from matplotlib import axis, lines, patches, pyplot as plt, spines, text
@@ -24,7 +27,7 @@ from cirq.vis.density_matrix import _plot_element_of_density_matrix, plot_densit
24
27
  @pytest.mark.usefixtures('closefigures')
25
28
  @pytest.mark.parametrize('show_text', [True, False])
26
29
  @pytest.mark.parametrize('size', [2, 4, 8, 16])
27
- def test_density_matrix_plotter(size, show_text):
30
+ def test_density_matrix_plotter(size, show_text) -> None:
28
31
  matrix = cirq.testing.random_density_matrix(size)
29
32
  # Check that the title shows back up
30
33
  ax = plot_density_matrix(matrix, show_text=show_text, title='Test Density Matrix Plot')
@@ -48,16 +51,16 @@ def test_density_matrix_plotter(size, show_text):
48
51
  @pytest.mark.usefixtures('closefigures')
49
52
  @pytest.mark.parametrize('show_text', [True, False])
50
53
  @pytest.mark.parametrize('size', [2, 4, 8, 16])
51
- def test_density_matrix_circle_rectangle_sizes(size, show_text):
54
+ def test_density_matrix_circle_rectangle_sizes(size, show_text) -> None:
52
55
  matrix = cirq.testing.random_density_matrix(size)
53
56
  ax = plot_density_matrix(matrix, show_text=show_text, title='Test Density Matrix Plot')
54
57
  # Check that the radius of all the circles in the matrix is correct
55
- circles = [c for c in ax.get_children() if isinstance(c, patches.Circle)]
56
- mean_radius = np.mean([c.radius for c in circles if c.fill])
58
+ circle_list = [c for c in ax.get_children() if isinstance(c, patches.Circle)]
59
+ mean_radius = np.mean([c.radius for c in circle_list if c.fill])
57
60
  mean_value = np.mean(np.abs(matrix))
58
- circles = np.array(sorted(circles, key=lambda x: (x.fill, x.center[0], -x.center[1]))).reshape(
59
- (2, size, size)
60
- )
61
+ circles = np.array(
62
+ sorted(circle_list, key=lambda x: (x.fill, x.center[0], -x.center[1]))
63
+ ).reshape((2, size, size))
61
64
  for i in range(size):
62
65
  for j in range(size):
63
66
  assert np.isclose(
@@ -65,15 +68,15 @@ def test_density_matrix_circle_rectangle_sizes(size, show_text):
65
68
  )
66
69
 
67
70
  # Check that all the rectangles are of the right height, and only on the diagonal elements
68
- rects = [
71
+ rect_list = [
69
72
  r
70
73
  for r in ax.get_children()
71
74
  if isinstance(r, patches.Rectangle) and r.get_alpha() is not None
72
75
  ]
73
- assert len(rects) == size
74
- mean_size = np.mean([r.get_height() for r in rects])
76
+ assert len(rect_list) == size
77
+ mean_size = np.mean([r.get_height() for r in rect_list])
75
78
  mean_value = np.trace(np.abs(matrix)) / size
76
- rects = np.array(sorted(rects, key=lambda x: x.get_x()))
79
+ rects = np.array(sorted(rect_list, key=lambda x: x.get_x()))
77
80
  for i in range(size):
78
81
  # Ensuring that the rectangle is the right height
79
82
  assert np.isclose(np.abs(matrix[i, i]) * mean_size / mean_value, rects[i].get_height())
@@ -90,7 +93,7 @@ def test_density_matrix_circle_rectangle_sizes(size, show_text):
90
93
  @pytest.mark.usefixtures('closefigures')
91
94
  @pytest.mark.parametrize('show_text', [True, False])
92
95
  @pytest.mark.parametrize('size', [2, 4, 8, 16])
93
- def test_density_matrix_sizes_upper_bounds(size, show_text):
96
+ def test_density_matrix_sizes_upper_bounds(size, show_text) -> None:
94
97
  matrix = cirq.testing.random_density_matrix(size)
95
98
  ax = plot_density_matrix(matrix, show_text=show_text, title='Test Density Matrix Plot')
96
99
 
@@ -113,7 +116,7 @@ def test_density_matrix_sizes_upper_bounds(size, show_text):
113
116
  @pytest.mark.usefixtures('closefigures')
114
117
  @pytest.mark.parametrize('show_rect', [True, False])
115
118
  @pytest.mark.parametrize('value', [0.0, 1.0, 0.5 + 0.3j, 0.2 + 0.1j, 0.5 + 0.5j])
116
- def test_density_element_plot(value, show_rect):
119
+ def test_density_element_plot(value, show_rect) -> None:
117
120
  _, ax = plt.subplots(figsize=(10, 10))
118
121
  _plot_element_of_density_matrix(
119
122
  ax, 0, 0, np.abs(value), np.angle(value), show_rect=False, show_text=False
@@ -122,9 +125,9 @@ def test_density_element_plot(value, show_rect):
122
125
  plotted_lines = [c for c in ax.get_children() if isinstance(c, lines.Line2D)]
123
126
  assert len(plotted_lines) == 1
124
127
  line_position = plotted_lines[0].get_xydata()
125
- angle = np.arctan(
126
- (line_position[1, 1] - line_position[0, 1]) / (line_position[1, 0] - line_position[0, 0])
127
- )
128
+ numerator = line_position[1, 1] - line_position[0, 1] # type: ignore
129
+ denumerator = line_position[1, 0] - line_position[0, 0] # type: ignore
130
+ angle = np.arctan(numerator / denumerator)
128
131
  assert np.isclose(np.angle(value), angle)
129
132
  # Check if the circles are the right size ratio, given the value of the element
130
133
  circles_in = [c for c in ax.get_children() if isinstance(c, patches.Circle) and c.fill]
@@ -151,6 +154,6 @@ def test_density_element_plot(value, show_rect):
151
154
  np.random.random((4, 8)) * np.exp(np.random.random((4, 8)) * 2 * np.pi * 1j),
152
155
  ],
153
156
  )
154
- def test_density_matrix_type_error(matrix):
157
+ def test_density_matrix_type_error(matrix) -> None:
155
158
  with pytest.raises(ValueError, match="Incorrect shape for density matrix:*"):
156
159
  plot_density_matrix(matrix)
cirq/vis/heatmap.py CHANGED
@@ -16,19 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import copy
18
18
  from dataclasses import astuple, dataclass
19
- from typing import (
20
- Any,
21
- cast,
22
- Dict,
23
- List,
24
- Mapping,
25
- Optional,
26
- overload,
27
- Sequence,
28
- SupportsFloat,
29
- Tuple,
30
- Union,
31
- )
19
+ from typing import Any, cast, Mapping, overload, Sequence, SupportsFloat
32
20
 
33
21
  import matplotlib as mpl
34
22
  import matplotlib.collections as mpl_collections
@@ -39,9 +27,9 @@ from mpl_toolkits import axes_grid1
39
27
  from cirq.devices import grid_qubit
40
28
  from cirq.vis import vis_utils
41
29
 
42
- QubitTuple = Tuple[grid_qubit.GridQubit, ...]
30
+ QubitTuple = tuple[grid_qubit.GridQubit, ...]
43
31
 
44
- Polygon = Sequence[Tuple[float, float]]
32
+ Polygon = Sequence[tuple[float, float]]
45
33
 
46
34
 
47
35
  @dataclass
@@ -71,13 +59,12 @@ class PolygonUnit:
71
59
  polygon: Polygon
72
60
  value: float
73
61
  center: Point
74
- annot: Optional[str]
62
+ annot: str | None
75
63
 
76
64
 
77
65
  class Heatmap:
78
66
  """Distribution of a value in 2D qubit lattice as a color map."""
79
67
 
80
- # pylint: disable=function-redefined
81
68
  @overload
82
69
  def __init__(self, value_map: Mapping[QubitTuple, SupportsFloat], **kwargs):
83
70
  pass
@@ -88,9 +75,9 @@ class Heatmap:
88
75
 
89
76
  def __init__(
90
77
  self,
91
- value_map: Union[
92
- Mapping[QubitTuple, SupportsFloat], Mapping[grid_qubit.GridQubit, SupportsFloat]
93
- ],
78
+ value_map: (
79
+ Mapping[QubitTuple, SupportsFloat] | Mapping[grid_qubit.GridQubit, SupportsFloat]
80
+ ),
94
81
  **kwargs,
95
82
  ):
96
83
  """2D qubit grid Heatmaps
@@ -131,7 +118,7 @@ class Heatmap:
131
118
  }
132
119
  self._validate_kwargs(kwargs)
133
120
  if '_config' not in self.__dict__:
134
- self._config: Dict[str, Any] = {}
121
+ self._config: dict[str, Any] = {}
135
122
  self._config.update(
136
123
  {
137
124
  "plot_colorbar": True,
@@ -144,7 +131,7 @@ class Heatmap:
144
131
  )
145
132
  self._config.update(kwargs)
146
133
 
147
- def _extra_valid_kwargs(self) -> List[str]:
134
+ def _extra_valid_kwargs(self) -> list[str]:
148
135
  return []
149
136
 
150
137
  def _validate_kwargs(self, kwargs) -> None:
@@ -173,13 +160,13 @@ class Heatmap:
173
160
  invalid_args = ", ".join([k for k in kwargs if k not in valid_kwargs])
174
161
  raise ValueError(f"Received invalid argument(s): {invalid_args}")
175
162
 
176
- def update_config(self, **kwargs) -> 'Heatmap':
163
+ def update_config(self, **kwargs) -> Heatmap:
177
164
  """Add/Modify **kwargs args passed during initialisation."""
178
165
  self._validate_kwargs(kwargs)
179
166
  self._config.update(kwargs)
180
167
  return self
181
168
 
182
- def _qubits_to_polygon(self, qubits: QubitTuple) -> Tuple[Polygon, Point]:
169
+ def _qubits_to_polygon(self, qubits: QubitTuple) -> tuple[Polygon, Point]:
183
170
  qubit = qubits[0]
184
171
  x, y = float(qubit.row), float(qubit.col)
185
172
  return (
@@ -187,7 +174,7 @@ class Heatmap:
187
174
  Point(y, x),
188
175
  )
189
176
 
190
- def _get_annotation_value(self, key, value) -> Optional[str]:
177
+ def _get_annotation_value(self, key, value) -> str | None:
191
178
  if self._config.get('annotation_map'):
192
179
  return self._config['annotation_map'].get(key)
193
180
  elif self._config.get('annotation_format'):
@@ -198,8 +185,8 @@ class Heatmap:
198
185
  else:
199
186
  return None
200
187
 
201
- def _get_polygon_units(self) -> List[PolygonUnit]:
202
- polygon_unit_list: List[PolygonUnit] = []
188
+ def _get_polygon_units(self) -> list[PolygonUnit]:
189
+ polygon_unit_list: list[PolygonUnit] = []
203
190
  for qubits, value in sorted(self._value_map.items()):
204
191
  polygon, center = self._qubits_to_polygon(qubits)
205
192
  polygon_unit_list.append(
@@ -231,7 +218,7 @@ class Heatmap:
231
218
 
232
219
  def _write_annotations(
233
220
  self,
234
- centers_and_annot: List[Tuple[Point, Optional[str]]],
221
+ centers_and_annot: list[tuple[Point, str | None]],
235
222
  collection: mpl_collections.Collection,
236
223
  ax: plt.Axes,
237
224
  ) -> None:
@@ -245,7 +232,7 @@ class Heatmap:
245
232
  x, y = center
246
233
  face_luminance = vis_utils.relative_luminance(facecolor)
247
234
  text_color = 'black' if face_luminance > 0.4 else 'white'
248
- text_kwargs: Dict[str, Any] = dict(color=text_color, ha="center", va="center")
235
+ text_kwargs: dict[str, Any] = dict(color=text_color, ha="center", va="center")
249
236
  text_kwargs.update(self._config.get('annotation_text_kwargs', {}))
250
237
  ax.text(x, y, annotation, **text_kwargs)
251
238
 
@@ -286,8 +273,8 @@ class Heatmap:
286
273
  return collection
287
274
 
288
275
  def plot(
289
- self, ax: Optional[plt.Axes] = None, **kwargs: Any
290
- ) -> Tuple[plt.Axes, mpl_collections.Collection]:
276
+ self, ax: plt.Axes | None = None, **kwargs: Any
277
+ ) -> tuple[plt.Axes, mpl_collections.Collection]:
291
278
  """Plots the heatmap on the given Axes.
292
279
  Args:
293
280
  ax: the Axes to plot on. If not given, a new figure is created,
@@ -358,13 +345,13 @@ class TwoQubitInteractionHeatmap(Heatmap):
358
345
  coupler_margin: float, default = 0.03
359
346
  coupler_width: float, default = 0.6
360
347
  """
361
- self._config: Dict[str, Any] = {"coupler_margin": 0.03, "coupler_width": 0.6}
348
+ self._config: dict[str, Any] = {"coupler_margin": 0.03, "coupler_width": 0.6}
362
349
  super().__init__(value_map, **kwargs)
363
350
 
364
- def _extra_valid_kwargs(self) -> List[str]:
351
+ def _extra_valid_kwargs(self) -> list[str]:
365
352
  return ["coupler_margin", "coupler_width"]
366
353
 
367
- def _qubits_to_polygon(self, qubits: QubitTuple) -> Tuple[Polygon, Point]:
354
+ def _qubits_to_polygon(self, qubits: QubitTuple) -> tuple[Polygon, Point]:
368
355
  coupler_margin = self._config["coupler_margin"]
369
356
  coupler_width = self._config["coupler_width"]
370
357
  cwidth = coupler_width / 2.0
@@ -403,8 +390,8 @@ class TwoQubitInteractionHeatmap(Heatmap):
403
390
  return (polygon, Point((col1 + col2) / 2.0, (row1 + row2) / 2.0))
404
391
 
405
392
  def plot(
406
- self, ax: Optional[plt.Axes] = None, **kwargs: Any
407
- ) -> Tuple[plt.Axes, mpl_collections.Collection]:
393
+ self, ax: plt.Axes | None = None, **kwargs: Any
394
+ ) -> tuple[plt.Axes, mpl_collections.Collection]:
408
395
  """Plots the heatmap on the given Axes.
409
396
  Args:
410
397
  ax: the Axes to plot on. If not given, a new figure is created,
@@ -422,7 +409,7 @@ class TwoQubitInteractionHeatmap(Heatmap):
422
409
  original_config = copy.deepcopy(self._config)
423
410
  self.update_config(**kwargs)
424
411
  qubits = set([q for qubits in self._value_map.keys() for q in qubits])
425
- collection_options: Dict[str, Any] = {"cmap": "binary"}
412
+ collection_options: dict[str, Any] = {"cmap": "binary"}
426
413
  highlighted_qubits = frozenset(kwargs.get("highlighted_qubits", ()))
427
414
  if not highlighted_qubits:
428
415
  collection_options.update(
cirq/vis/heatmap_test.py CHANGED
@@ -11,8 +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
+
14
15
  """Tests for Heatmap."""
15
16
 
17
+ from __future__ import annotations
18
+
16
19
  import pathlib
17
20
  import shutil
18
21
  import string