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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/value/linear_dict.py CHANGED
@@ -14,11 +14,12 @@
14
14
 
15
15
  """Linear combination represented as mapping of things to coefficients."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  from typing import (
18
20
  AbstractSet,
19
21
  Any,
20
22
  Callable,
21
- Dict,
22
23
  Generic,
23
24
  ItemsView,
24
25
  Iterable,
@@ -26,12 +27,9 @@ from typing import (
26
27
  KeysView,
27
28
  Mapping,
28
29
  MutableMapping,
29
- Optional,
30
30
  overload,
31
- Tuple,
32
31
  TYPE_CHECKING,
33
32
  TypeVar,
34
- Union,
35
33
  ValuesView,
36
34
  )
37
35
 
@@ -44,7 +42,7 @@ from cirq import protocols
44
42
  if TYPE_CHECKING:
45
43
  import cirq
46
44
 
47
- Scalar = Union[complex, np.number]
45
+ Scalar = complex | np.number
48
46
  TVector = TypeVar('TVector')
49
47
 
50
48
  TDefault = TypeVar('TDefault')
@@ -63,7 +61,7 @@ class _SympyPrinter(sympy.printing.str.StrPrinter):
63
61
  return super()._print(expr, **kwargs)
64
62
 
65
63
 
66
- def _format_coefficient(format_spec: str, coefficient: 'cirq.TParamValComplex') -> str:
64
+ def _format_coefficient(format_spec: str, coefficient: cirq.TParamValComplex) -> str:
67
65
  if isinstance(coefficient, sympy.Basic):
68
66
  printer = _SympyPrinter(format_spec)
69
67
  return printer.doprint(coefficient)
@@ -83,7 +81,7 @@ def _format_coefficient(format_spec: str, coefficient: 'cirq.TParamValComplex')
83
81
  return f'({real_str}+{imag_str}j)'
84
82
 
85
83
 
86
- def _format_term(format_spec: str, vector: TVector, coefficient: 'cirq.TParamValComplex') -> str:
84
+ def _format_term(format_spec: str, vector: TVector, coefficient: cirq.TParamValComplex) -> str:
87
85
  coefficient_str = _format_coefficient(format_spec, coefficient)
88
86
  if not coefficient_str:
89
87
  return coefficient_str
@@ -93,7 +91,7 @@ def _format_term(format_spec: str, vector: TVector, coefficient: 'cirq.TParamVal
93
91
  return '+' + result
94
92
 
95
93
 
96
- def _format_terms(terms: Iterable[Tuple[TVector, 'cirq.TParamValComplex']], format_spec: str):
94
+ def _format_terms(terms: Iterable[tuple[TVector, cirq.TParamValComplex]], format_spec: str):
97
95
  formatted_terms = [_format_term(format_spec, vector, coeff) for vector, coeff in terms]
98
96
  s = ''.join(formatted_terms)
99
97
  if not s:
@@ -120,8 +118,8 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
120
118
 
121
119
  def __init__(
122
120
  self,
123
- terms: Optional[Mapping[TVector, 'cirq.TParamValComplex']] = None,
124
- validator: Optional[Callable[[TVector], bool]] = None,
121
+ terms: Mapping[TVector, cirq.TParamValComplex] | None = None,
122
+ validator: Callable[[TVector], bool] | None = None,
125
123
  ) -> None:
126
124
  """Initializes linear combination from a collection of terms.
127
125
 
@@ -136,7 +134,7 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
136
134
  """
137
135
  self._has_validator = validator is not None
138
136
  self._is_valid = validator or (lambda x: True)
139
- self._terms: Dict[TVector, 'cirq.TParamValComplex'] = {}
137
+ self._terms: dict[TVector, cirq.TParamValComplex] = {}
140
138
  if terms is not None:
141
139
  self.update(terms)
142
140
 
@@ -172,31 +170,30 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
172
170
  snapshot = self.copy().clean(atol=0)
173
171
  return snapshot._terms.keys()
174
172
 
175
- def values(self) -> ValuesView['cirq.TParamValComplex']:
173
+ def values(self) -> ValuesView[cirq.TParamValComplex]:
176
174
  snapshot = self.copy().clean(atol=0)
177
175
  return snapshot._terms.values()
178
176
 
179
- def items(self) -> ItemsView[TVector, 'cirq.TParamValComplex']:
177
+ def items(self) -> ItemsView[TVector, cirq.TParamValComplex]:
180
178
  snapshot = self.copy().clean(atol=0)
181
179
  return snapshot._terms.items()
182
180
 
183
- # pylint: disable=function-redefined
184
181
  @overload
185
182
  def update(
186
- self, other: Mapping[TVector, 'cirq.TParamValComplex'], **kwargs: 'cirq.TParamValComplex'
183
+ self, other: Mapping[TVector, cirq.TParamValComplex], **kwargs: cirq.TParamValComplex
187
184
  ) -> None:
188
185
  pass
189
186
 
190
187
  @overload
191
188
  def update(
192
189
  self,
193
- other: Iterable[Tuple[TVector, 'cirq.TParamValComplex']],
194
- **kwargs: 'cirq.TParamValComplex',
190
+ other: Iterable[tuple[TVector, cirq.TParamValComplex]],
191
+ **kwargs: cirq.TParamValComplex,
195
192
  ) -> None:
196
193
  pass
197
194
 
198
195
  @overload
199
- def update(self, *args: Any, **kwargs: 'cirq.TParamValComplex') -> None:
196
+ def update(self, *args: Any, **kwargs: cirq.TParamValComplex) -> None:
200
197
  pass
201
198
 
202
199
  def update(self, *args, **kwargs):
@@ -211,11 +208,11 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
211
208
  self.clean(atol=0)
212
209
 
213
210
  @overload
214
- def get(self, vector: TVector) -> 'cirq.TParamValComplex':
211
+ def get(self, vector: TVector) -> cirq.TParamValComplex:
215
212
  pass
216
213
 
217
214
  @overload
218
- def get(self, vector: TVector, default: TDefault) -> Union['cirq.TParamValComplex', TDefault]:
215
+ def get(self, vector: TVector, default: TDefault) -> cirq.TParamValComplex | TDefault:
219
216
  pass
220
217
 
221
218
  def get(self, vector, default=0):
@@ -223,15 +220,13 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
223
220
  return default
224
221
  return self._terms.get(vector)
225
222
 
226
- # pylint: enable=function-redefined
227
-
228
223
  def __contains__(self, vector: Any) -> bool:
229
224
  return vector in self._terms and self._terms[vector] != 0
230
225
 
231
- def __getitem__(self, vector: TVector) -> 'cirq.TParamValComplex':
226
+ def __getitem__(self, vector: TVector) -> cirq.TParamValComplex:
232
227
  return self._terms.get(vector, 0)
233
228
 
234
- def __setitem__(self, vector: TVector, coefficient: 'cirq.TParamValComplex') -> None:
229
+ def __setitem__(self, vector: TVector, coefficient: cirq.TParamValComplex) -> None:
235
230
  self._check_vector_valid(vector)
236
231
  if coefficient != 0:
237
232
  self._terms[vector] = coefficient
@@ -279,21 +274,21 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
279
274
  factory = type(self)
280
275
  return factory({v: -c for v, c in self.items()})
281
276
 
282
- def __imul__(self, a: 'cirq.TParamValComplex') -> Self:
277
+ def __imul__(self, a: cirq.TParamValComplex) -> Self:
283
278
  for vector in self:
284
279
  self._terms[vector] *= a
285
280
  self.clean(atol=0)
286
281
  return self
287
282
 
288
- def __mul__(self, a: 'cirq.TParamValComplex') -> Self:
283
+ def __mul__(self, a: cirq.TParamValComplex) -> Self:
289
284
  result = self.copy()
290
285
  result *= a
291
286
  return result.copy()
292
287
 
293
- def __rmul__(self, a: 'cirq.TParamValComplex') -> Self:
288
+ def __rmul__(self, a: cirq.TParamValComplex) -> Self:
294
289
  return self.__mul__(a)
295
290
 
296
- def __truediv__(self, a: 'cirq.TParamValComplex') -> Self:
291
+ def __truediv__(self, a: cirq.TParamValComplex) -> Self:
297
292
  return self.__mul__(1 / a)
298
293
 
299
294
  def __bool__(self) -> bool:
@@ -352,7 +347,7 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
352
347
  else:
353
348
  p.text(str(self))
354
349
 
355
- def _json_dict_(self) -> Dict[Any, Any]:
350
+ def _json_dict_(self) -> dict[Any, Any]:
356
351
  if self._has_validator:
357
352
  raise ValueError('LinearDict with a validator is not json serializable.')
358
353
  return {
@@ -370,7 +365,7 @@ class LinearDict(Generic[TVector], MutableMapping[TVector, 'cirq.TParamValComple
370
365
  def _parameter_names_(self) -> AbstractSet[str]:
371
366
  return set(name for v in self._terms.values() for name in protocols.parameter_names(v))
372
367
 
373
- def _resolve_parameters_(self, resolver: 'cirq.ParamResolver', recursive: bool) -> 'LinearDict':
368
+ def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> LinearDict:
374
369
  result = self.copy()
375
370
  result.update(
376
371
  {
@@ -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 numpy as np
16
18
  import pytest
17
19
  import sympy
@@ -27,7 +29,7 @@ def test_empty_init():
27
29
 
28
30
  sym = sympy.Symbol('sym')
29
31
  expr = sym * -(2 + 3j)
30
- symval = expr.subs({'sym': 5})
32
+ symval = expr.subs({'sym': 5}) # pylint: disable=assignment-from-no-return
31
33
  symvalresolved = -10 - 15j
32
34
 
33
35
 
@@ -391,8 +393,8 @@ def test_scalar_division(scalar, terms, terms_expected):
391
393
  linear_dict = cirq.LinearDict(terms)
392
394
  actual = linear_dict / scalar
393
395
  expected = cirq.LinearDict(terms_expected)
394
- assert actual == expected
395
- assert expected == actual
396
+ assert cirq.approx_eq(actual, expected)
397
+ assert cirq.approx_eq(expected, actual)
396
398
 
397
399
 
398
400
  @pytest.mark.parametrize(
@@ -408,7 +410,7 @@ def test_scalar_division(scalar, terms, terms_expected):
408
410
  )
409
411
  def test_expressions(expression, expected):
410
412
  assert expression == expected
411
- assert not expression != expected
413
+ assert not expression != expected # noqa: SIM202
412
414
  assert cirq.approx_eq(expression, expected)
413
415
 
414
416
 
@@ -435,8 +437,8 @@ def test_equal(terms_1, terms_2):
435
437
  linear_dict_2 = cirq.LinearDict(terms_2)
436
438
  assert linear_dict_1 == linear_dict_2
437
439
  assert linear_dict_2 == linear_dict_1
438
- assert not linear_dict_1 != linear_dict_2
439
- assert not linear_dict_2 != linear_dict_1
440
+ assert not linear_dict_1 != linear_dict_2 # noqa: SIM202
441
+ assert not linear_dict_2 != linear_dict_1 # noqa: SIM202
440
442
 
441
443
 
442
444
  @pytest.mark.parametrize(
@@ -454,8 +456,8 @@ def test_unequal(terms_1, terms_2):
454
456
  linear_dict_2 = cirq.LinearDict(terms_2)
455
457
  assert linear_dict_1 != linear_dict_2
456
458
  assert linear_dict_2 != linear_dict_1
457
- assert not linear_dict_1 == linear_dict_2
458
- assert not linear_dict_2 == linear_dict_1
459
+ assert not linear_dict_1 == linear_dict_2 # noqa: SIM201
460
+ assert not linear_dict_2 == linear_dict_1 # noqa: SIM201
459
461
 
460
462
 
461
463
  @pytest.mark.parametrize(
@@ -12,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import dataclasses
16
- from typing import Any, Dict, FrozenSet, Mapping, Optional, Tuple
18
+ from typing import Any, Mapping
17
19
 
18
20
  MEASUREMENT_KEY_SEPARATOR = ':'
19
21
 
@@ -33,11 +35,11 @@ class MeasurementKey:
33
35
  appears first in the tuple.
34
36
  """
35
37
 
36
- _hash: Optional[int] = dataclasses.field(default=None, init=False)
37
- _str: Optional[str] = dataclasses.field(default=None, init=False)
38
+ _hash: int | None = dataclasses.field(default=None, init=False)
39
+ _str: str | None = dataclasses.field(default=None, init=False)
38
40
 
39
41
  name: str
40
- path: Tuple[str, ...] = dataclasses.field(default_factory=tuple)
42
+ path: tuple[str, ...] = dataclasses.field(default_factory=tuple)
41
43
 
42
44
  def __post_init__(self):
43
45
  if not isinstance(self.name, str):
@@ -49,7 +51,7 @@ class MeasurementKey:
49
51
  '`MeasurementKey.parse_serialized` for correct behavior.'
50
52
  )
51
53
 
52
- def replace(self, **changes) -> 'MeasurementKey':
54
+ def replace(self, **changes) -> MeasurementKey:
53
55
  """Returns a copy of this MeasurementKey with the specified changes."""
54
56
  return dataclasses.replace(self, **changes)
55
57
 
@@ -76,7 +78,7 @@ class MeasurementKey:
76
78
  object.__setattr__(self, '_hash', hash(str(self)))
77
79
  return self._hash
78
80
 
79
- def __getstate__(self) -> Dict[str, Any]:
81
+ def __getstate__(self) -> dict[str, Any]:
80
82
  # clear cached hash value when pickling, see #6674
81
83
  state = self.__dict__
82
84
  if "_hash" in state:
@@ -102,7 +104,7 @@ class MeasurementKey:
102
104
  return cls(name=name, path=tuple(path))
103
105
 
104
106
  @classmethod
105
- def parse_serialized(cls, key_str: str) -> 'MeasurementKey':
107
+ def parse_serialized(cls, key_str: str) -> MeasurementKey:
106
108
  """Parses the serialized string representation of `Measurementkey` into a `MeasurementKey`.
107
109
 
108
110
  This is the only way to construct a `MeasurementKey` from a nested string representation
@@ -110,10 +112,10 @@ class MeasurementKey:
110
112
  components = key_str.split(MEASUREMENT_KEY_SEPARATOR)
111
113
  return MeasurementKey(name=components[-1], path=tuple(components[:-1]))
112
114
 
113
- def _with_key_path_(self, path: Tuple[str, ...]):
115
+ def _with_key_path_(self, path: tuple[str, ...]):
114
116
  return self.replace(path=path)
115
117
 
116
- def _with_key_path_prefix_(self, prefix: Tuple[str, ...]):
118
+ def _with_key_path_prefix_(self, prefix: tuple[str, ...]):
117
119
  return self._with_key_path_(path=prefix + self.path)
118
120
 
119
121
  def with_key_path_prefix(self, *path_component: str):
@@ -124,9 +126,7 @@ class MeasurementKey:
124
126
  """
125
127
  return self.replace(path=path_component + self.path)
126
128
 
127
- def _with_rescoped_keys_(
128
- self, path: Tuple[str, ...], bindable_keys: FrozenSet['MeasurementKey']
129
- ):
129
+ def _with_rescoped_keys_(self, path: tuple[str, ...], bindable_keys: frozenset[MeasurementKey]):
130
130
  return self.replace(path=path + self.path)
131
131
 
132
132
  def _with_measurement_key_mapping_(self, key_map: Mapping[str, str]):
@@ -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
@@ -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 AbstractSet, Any, TYPE_CHECKING
16
18
 
17
19
  import sympy
@@ -35,7 +37,7 @@ class PeriodicValue:
35
37
  interval.
36
38
  """
37
39
 
38
- def __init__(self, value: 'cirq.TParamVal', period: 'cirq.TParamVal'):
40
+ def __init__(self, value: cirq.TParamVal, period: cirq.TParamVal):
39
41
  """Initializes the equivalence class.
40
42
 
41
43
  Args:
@@ -99,9 +101,7 @@ class PeriodicValue:
99
101
 
100
102
  return parameter_names(self.value) | parameter_names(self.period)
101
103
 
102
- def _resolve_parameters_(
103
- self, resolver: 'cirq.ParamResolver', recursive: bool
104
- ) -> 'PeriodicValue':
104
+ def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> PeriodicValue:
105
105
  # HACK: Avoids circular dependencies.
106
106
  from cirq.protocols import resolve_parameters
107
107
 
@@ -12,13 +12,15 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import pytest
16
18
  import sympy
17
19
 
18
20
  import cirq
19
21
 
20
22
 
21
- def test_periodic_value_equality():
23
+ def test_periodic_value_equality() -> None:
22
24
  eq = cirq.testing.EqualsTester()
23
25
  eq.add_equality_group(
24
26
  cirq.PeriodicValue(1, 2),
@@ -34,7 +36,7 @@ def test_periodic_value_equality():
34
36
  eq.add_equality_group(cirq.PeriodicValue(2, 4))
35
37
 
36
38
 
37
- def test_periodic_value_approx_eq_basic():
39
+ def test_periodic_value_approx_eq_basic() -> None:
38
40
  assert cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.0, 2.0), atol=0.1)
39
41
  assert cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.2, 2.0), atol=0.3)
40
42
  assert not cirq.approx_eq(cirq.PeriodicValue(1.0, 2.0), cirq.PeriodicValue(1.2, 2.0), atol=0.1)
@@ -49,12 +51,12 @@ def test_periodic_value_approx_eq_basic():
49
51
  )
50
52
 
51
53
 
52
- def test_periodic_value_approx_eq_normalized():
54
+ def test_periodic_value_approx_eq_normalized() -> None:
53
55
  assert cirq.approx_eq(cirq.PeriodicValue(1.0, 3.0), cirq.PeriodicValue(4.1, 3.0), atol=0.2)
54
56
  assert cirq.approx_eq(cirq.PeriodicValue(1.0, 3.0), cirq.PeriodicValue(-2.1, 3.0), atol=0.2)
55
57
 
56
58
 
57
- def test_periodic_value_approx_eq_boundary():
59
+ def test_periodic_value_approx_eq_boundary() -> None:
58
60
  assert cirq.approx_eq(cirq.PeriodicValue(0.0, 2.0), cirq.PeriodicValue(1.9, 2.0), atol=0.2)
59
61
  assert cirq.approx_eq(cirq.PeriodicValue(0.1, 2.0), cirq.PeriodicValue(1.9, 2.0), atol=0.3)
60
62
  assert cirq.approx_eq(cirq.PeriodicValue(1.9, 2.0), cirq.PeriodicValue(0.1, 2.0), atol=0.3)
@@ -64,7 +66,7 @@ def test_periodic_value_approx_eq_boundary():
64
66
  assert cirq.approx_eq(cirq.PeriodicValue(0.4, 1.0), cirq.PeriodicValue(0.6, 1.0), atol=0.3)
65
67
 
66
68
 
67
- def test_periodic_value_types_mismatch():
69
+ def test_periodic_value_types_mismatch() -> None:
68
70
  assert not cirq.approx_eq(cirq.PeriodicValue(0.0, 2.0), 0.0, atol=0.2)
69
71
  assert not cirq.approx_eq(0.0, cirq.PeriodicValue(0.0, 2.0), atol=0.2)
70
72
 
@@ -79,7 +81,9 @@ def test_periodic_value_types_mismatch():
79
81
  ],
80
82
  )
81
83
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
82
- def test_periodic_value_is_parameterized(value, is_parameterized, parameter_names, resolve_fn):
84
+ def test_periodic_value_is_parameterized(
85
+ value, is_parameterized, parameter_names, resolve_fn
86
+ ) -> None:
83
87
  assert cirq.is_parameterized(value) == is_parameterized
84
88
  assert cirq.parameter_names(value) == parameter_names
85
89
  resolved = resolve_fn(value, {p: 1 for p in parameter_names})
@@ -98,5 +102,5 @@ def test_periodic_value_is_parameterized(value, is_parameterized, parameter_name
98
102
  cirq.PeriodicValue(sympy.Symbol('v'), 3),
99
103
  ],
100
104
  )
101
- def test_periodic_value_repr(val):
105
+ def test_periodic_value_repr(val) -> None:
102
106
  cirq.testing.assert_equivalent_repr(val)
cirq/value/probability.py CHANGED
@@ -14,6 +14,8 @@
14
14
 
15
15
  """Utilities for handling probabilities."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  from typing import TYPE_CHECKING
18
20
 
19
21
  import numpy as np
@@ -44,7 +46,7 @@ def validate_probability(p: float, p_str: str) -> float:
44
46
  return p
45
47
 
46
48
 
47
- def state_vector_to_probabilities(state_vector: 'cirq.STATE_VECTOR_LIKE') -> np.ndarray:
49
+ def state_vector_to_probabilities(state_vector: cirq.STATE_VECTOR_LIKE) -> np.ndarray:
48
50
  """Function to transform a state vector like object into a numpy array of probabilities."""
49
51
  valid_state_vector = to_valid_state_vector(state_vector)
50
52
  return np.abs(valid_state_vector) ** 2
@@ -12,17 +12,19 @@
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
18
20
 
19
21
 
20
22
  @pytest.mark.parametrize('p', [0.0, 0.1, 0.6, 1.0])
21
- def test_validate_probability_valid(p):
23
+ def test_validate_probability_valid(p) -> None:
22
24
  assert p == cirq.validate_probability(p, 'p')
23
25
 
24
26
 
25
27
  @pytest.mark.parametrize('p', [-0.1, 1.1])
26
- def test_validate_probability_invalid(p):
28
+ def test_validate_probability_invalid(p) -> None:
27
29
  with pytest.raises(ValueError, match='p'):
28
30
  cirq.validate_probability(p, 'p')
@@ -12,9 +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 abc
16
18
  from dataclasses import dataclass
17
- from typing import Dict, Iterator, Optional, Sequence, Tuple, TYPE_CHECKING
19
+ from typing import Iterator, Sequence, TYPE_CHECKING
18
20
 
19
21
  import numpy as np
20
22
 
@@ -28,7 +30,7 @@ if TYPE_CHECKING:
28
30
  class _NamedOneQubitState(metaclass=abc.ABCMeta):
29
31
  """Abstract class representing a one-qubit state of note."""
30
32
 
31
- def on(self, qubit: 'cirq.Qid') -> 'ProductState':
33
+ def on(self, qubit: cirq.Qid) -> ProductState:
32
34
  """Associates one qubit with this named state.
33
35
 
34
36
  The returned object is a ProductState of length 1.
@@ -57,7 +59,7 @@ class ProductState:
57
59
  with `cirq.KET_PLUS(q0)`.
58
60
  """
59
61
 
60
- states: Dict['cirq.Qid', _NamedOneQubitState]
62
+ states: dict[cirq.Qid, _NamedOneQubitState]
61
63
 
62
64
  def __init__(self, states=None):
63
65
  if states is None:
@@ -66,10 +68,10 @@ class ProductState:
66
68
  object.__setattr__(self, 'states', states)
67
69
 
68
70
  @property
69
- def qubits(self) -> Sequence['cirq.Qid']:
71
+ def qubits(self) -> Sequence[cirq.Qid]:
70
72
  return sorted(self.states.keys())
71
73
 
72
- def __mul__(self, other: 'cirq.ProductState') -> 'cirq.ProductState':
74
+ def __mul__(self, other: cirq.ProductState) -> cirq.ProductState:
73
75
  if not isinstance(other, ProductState):
74
76
  raise ValueError("Multiplication is only supported with other TensorProductStates.")
75
77
 
@@ -93,11 +95,11 @@ class ProductState:
93
95
  )
94
96
  return f'cirq.ProductState({{{states_dict_repr}}})'
95
97
 
96
- def __getitem__(self, qubit: 'cirq.Qid') -> _NamedOneQubitState:
98
+ def __getitem__(self, qubit: cirq.Qid) -> _NamedOneQubitState:
97
99
  """Return the _NamedOneQubitState at the given qubit."""
98
100
  return self.states[qubit]
99
101
 
100
- def __iter__(self) -> Iterator[Tuple['cirq.Qid', _NamedOneQubitState]]:
102
+ def __iter__(self) -> Iterator[tuple[cirq.Qid, _NamedOneQubitState]]:
101
103
  yield from self.states.items()
102
104
 
103
105
  def __len__(self) -> int:
@@ -119,7 +121,7 @@ class ProductState:
119
121
  def _from_json_dict_(cls, states, **kwargs):
120
122
  return cls(states=dict(states))
121
123
 
122
- def state_vector(self, qubit_order: Optional['cirq.QubitOrder'] = None) -> np.ndarray:
124
+ def state_vector(self, qubit_order: cirq.QubitOrder | None = None) -> np.ndarray:
123
125
  """The state-vector representation of this state."""
124
126
  from cirq import ops
125
127
 
@@ -136,7 +138,7 @@ class ProductState:
136
138
 
137
139
  return mat
138
140
 
139
- def projector(self, qubit_order: Optional['cirq.QubitOrder'] = None) -> np.ndarray:
141
+ def projector(self, qubit_order: cirq.QubitOrder | None = None) -> np.ndarray:
140
142
  """The projector associated with this state expressed as a matrix.
141
143
 
142
144
  This is |s⟩⟨s| where |s⟩ is this state.
@@ -174,7 +176,7 @@ class _PauliEigenState(_NamedOneQubitState):
174
176
  return f'cirq.{self._symbol}.basis[{self.eigenvalue:+d}]'
175
177
 
176
178
  @abc.abstractmethod
177
- def stabilized_by(self) -> Tuple[int, 'cirq.Pauli']:
179
+ def stabilized_by(self) -> tuple[int, cirq.Pauli]:
178
180
  pass
179
181
 
180
182
  def __eq__(self, other) -> bool:
@@ -201,7 +203,7 @@ class _XEigenState(_PauliEigenState):
201
203
  return np.array([1, -1]) / np.sqrt(2)
202
204
  raise ValueError(f"Bad eigenvalue: {self.eigenvalue}") # pragma: no cover
203
205
 
204
- def stabilized_by(self) -> Tuple[int, 'cirq.Pauli']:
206
+ def stabilized_by(self) -> tuple[int, cirq.Pauli]:
205
207
  # Prevent circular import from `value.value_equality`
206
208
  from cirq import ops
207
209
 
@@ -218,7 +220,7 @@ class _YEigenState(_PauliEigenState):
218
220
  return np.array([1, -1j]) / np.sqrt(2)
219
221
  raise ValueError(f"Bad eigenvalue: {self.eigenvalue}") # pragma: no cover
220
222
 
221
- def stabilized_by(self) -> Tuple[int, 'cirq.Pauli']:
223
+ def stabilized_by(self) -> tuple[int, cirq.Pauli]:
222
224
  from cirq import ops
223
225
 
224
226
  return self.eigenvalue, ops.Y
@@ -234,7 +236,7 @@ class _ZEigenState(_PauliEigenState):
234
236
  return np.array([0, 1])
235
237
  raise ValueError(f"Bad eigenvalue: {self.eigenvalue}") # pragma: no cover
236
238
 
237
- def stabilized_by(self) -> Tuple[int, 'cirq.Pauli']:
239
+ def stabilized_by(self) -> tuple[int, cirq.Pauli]:
238
240
  from cirq import ops
239
241
 
240
242
  return self.eigenvalue, ops.Z
@@ -1,4 +1,7 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import numpy as np
3
6
  import pytest
4
7
 
@@ -85,7 +88,7 @@ def test_product_state():
85
88
  with pytest.raises(ValueError) as e:
86
89
  # Re-use q2
87
90
  ps *= cirq.KET_PLUS(q2)
88
- assert e.match(r'.*both contain factors for these qubits: ' r'\[cirq.LineQubit\(2\)\]')
91
+ assert e.match(r'.*both contain factors for these qubits: \[cirq.LineQubit\(2\)\]')
89
92
 
90
93
  ps2 = eval(repr(ps))
91
94
  assert ps == ps2
@@ -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 Any, cast
16
18
 
17
19
  import numpy as np
@@ -12,12 +12,14 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
 
17
19
  import cirq
18
20
 
19
21
 
20
- def test_parse_random_state():
22
+ def test_parse_random_state() -> None:
21
23
  global_state = np.random.get_state()
22
24
 
23
25
  def rand(prng):
@@ -34,11 +36,11 @@ def test_parse_random_state():
34
36
  eq.add_equality_group(*vals)
35
37
 
36
38
  seed = np.random.randint(2**31)
37
- prngs = [
39
+ prngs1 = [
38
40
  np.random.RandomState(seed),
39
41
  cirq.value.parse_random_state(np.random.RandomState(seed)),
40
42
  cirq.value.parse_random_state(seed),
41
43
  ]
42
- vals = [prng.rand() for prng in prngs]
44
+ vals = [prng.rand() for prng in prngs1]
43
45
  eq = cirq.testing.EqualsTester()
44
46
  eq.add_equality_group(*vals)