cirq-core 1.7.0.dev20250924231107__py3-none-any.whl → 1.7.0.dev20251203004401__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.
Files changed (392) hide show
  1. cirq/__init__.py +1 -0
  2. cirq/_compat.py +3 -2
  3. cirq/_compat_test.py +16 -15
  4. cirq/_doc.py +4 -3
  5. cirq/_import.py +2 -1
  6. cirq/_version.py +1 -1
  7. cirq/_version_test.py +1 -1
  8. cirq/circuits/_bucket_priority_queue.py +2 -1
  9. cirq/circuits/circuit.py +7 -13
  10. cirq/circuits/circuit_operation.py +2 -1
  11. cirq/circuits/circuit_test.py +13 -12
  12. cirq/circuits/frozen_circuit.py +3 -2
  13. cirq/circuits/moment.py +3 -15
  14. cirq/circuits/optimization_pass.py +2 -1
  15. cirq/circuits/qasm_output.py +39 -10
  16. cirq/circuits/qasm_output_test.py +51 -2
  17. cirq/circuits/text_diagram_drawer.py +2 -1
  18. cirq/contrib/acquaintance/bipartite.py +2 -1
  19. cirq/contrib/acquaintance/devices.py +1 -1
  20. cirq/contrib/acquaintance/executor.py +4 -5
  21. cirq/contrib/acquaintance/executor_test.py +2 -1
  22. cirq/contrib/acquaintance/gates.py +2 -1
  23. cirq/contrib/acquaintance/gates_test.py +1 -1
  24. cirq/contrib/acquaintance/inspection_utils.py +2 -1
  25. cirq/contrib/acquaintance/mutation_utils.py +2 -1
  26. cirq/contrib/acquaintance/optimizers.py +2 -1
  27. cirq/contrib/acquaintance/permutation.py +2 -1
  28. cirq/contrib/acquaintance/permutation_test.py +1 -1
  29. cirq/contrib/acquaintance/shift.py +2 -1
  30. cirq/contrib/acquaintance/shift_swap_network.py +2 -1
  31. cirq/contrib/acquaintance/strategies/complete.py +3 -2
  32. cirq/contrib/acquaintance/strategies/cubic.py +2 -1
  33. cirq/contrib/acquaintance/strategies/quartic_paired.py +2 -1
  34. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +1 -1
  35. cirq/contrib/acquaintance/testing.py +2 -1
  36. cirq/contrib/acquaintance/topological_sort.py +2 -1
  37. cirq/contrib/bayesian_network/bayesian_network_gate.py +3 -2
  38. cirq/contrib/circuitdag/circuit_dag.py +4 -2
  39. cirq/contrib/custom_simulators/custom_state_simulator.py +2 -1
  40. cirq/contrib/custom_simulators/custom_state_simulator_test.py +1 -1
  41. cirq/contrib/graph_device/graph_device.py +2 -1
  42. cirq/contrib/graph_device/graph_device_test.py +2 -1
  43. cirq/contrib/graph_device/hypergraph.py +2 -1
  44. cirq/contrib/graph_device/uniform_graph_device.py +2 -1
  45. cirq/contrib/json.py +14 -2
  46. cirq/contrib/json_test_data/BayesianNetworkGate.json +10 -0
  47. cirq/contrib/json_test_data/BayesianNetworkGate.repr +3 -0
  48. cirq/contrib/json_test_data/QuantumVolumeResult.json +169 -0
  49. cirq/contrib/json_test_data/QuantumVolumeResult.repr +22 -0
  50. cirq/contrib/json_test_data/SwapPermutationGate.json +3 -0
  51. cirq/contrib/json_test_data/SwapPermutationGate.repr +1 -0
  52. cirq/contrib/json_test_data/spec.py +0 -2
  53. cirq/contrib/noise_models/noise_models.py +2 -1
  54. cirq/contrib/paulistring/clifford_optimize.py +20 -2
  55. cirq/contrib/paulistring/optimize.py +1 -1
  56. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +146 -35
  57. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +74 -171
  58. cirq/contrib/paulistring/recombine.py +5 -2
  59. cirq/contrib/paulistring/separate.py +1 -1
  60. cirq/contrib/qasm_import/_parser.py +2 -1
  61. cirq/contrib/qasm_import/_parser_test.py +3 -3
  62. cirq/contrib/quantikz/__init__.py +21 -0
  63. cirq/contrib/quantikz/circuit_to_latex_quantikz.py +680 -0
  64. cirq/contrib/quantikz/circuit_to_latex_quantikz_test.py +253 -0
  65. cirq/contrib/quantikz/circuit_to_latex_render.py +424 -0
  66. cirq/contrib/quantikz/circuit_to_latex_render_test.py +44 -0
  67. cirq/contrib/quantum_volume/quantum_volume.py +2 -1
  68. cirq/contrib/quimb/density_matrix.py +1 -1
  69. cirq/contrib/quimb/grid_circuits.py +2 -1
  70. cirq/contrib/quimb/grid_circuits_test.py +1 -1
  71. cirq/contrib/quimb/mps_simulator.py +4 -3
  72. cirq/contrib/quimb/state_vector.py +2 -1
  73. cirq/contrib/quirk/export_to_quirk.py +2 -1
  74. cirq/contrib/quirk/linearize_circuit.py +1 -1
  75. cirq/contrib/quirk/quirk_gate.py +2 -1
  76. cirq/contrib/routing/device.py +1 -1
  77. cirq/contrib/routing/greedy.py +2 -1
  78. cirq/contrib/routing/initialization.py +2 -1
  79. cirq/contrib/routing/router.py +2 -1
  80. cirq/contrib/routing/swap_network.py +2 -1
  81. cirq/contrib/routing/utils.py +2 -1
  82. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +7 -5
  83. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +6 -6
  84. cirq/devices/device.py +2 -1
  85. cirq/devices/grid_device_metadata.py +2 -1
  86. cirq/devices/grid_qubit.py +7 -6
  87. cirq/devices/insertion_noise_model.py +2 -1
  88. cirq/devices/line_qubit.py +2 -1
  89. cirq/devices/named_topologies.py +2 -1
  90. cirq/devices/noise_model.py +2 -1
  91. cirq/devices/noise_model_test.py +1 -1
  92. cirq/devices/noise_properties.py +2 -1
  93. cirq/devices/superconducting_qubits_noise_properties_test.py +2 -1
  94. cirq/devices/thermal_noise_model.py +2 -1
  95. cirq/experiments/__init__.py +2 -0
  96. cirq/experiments/benchmarking/parallel_xeb.py +2 -1
  97. cirq/experiments/benchmarking/parallel_xeb_test.py +1 -1
  98. cirq/experiments/fidelity_estimation.py +2 -1
  99. cirq/experiments/fidelity_estimation_test.py +1 -1
  100. cirq/experiments/ghz_2d.py +150 -0
  101. cirq/experiments/ghz_2d_test.py +155 -0
  102. cirq/experiments/n_qubit_tomography.py +2 -1
  103. cirq/experiments/n_qubit_tomography_test.py +1 -1
  104. cirq/experiments/purity_estimation.py +1 -1
  105. cirq/experiments/qubit_characterizations.py +2 -1
  106. cirq/experiments/random_quantum_circuit_generation.py +2 -1
  107. cirq/experiments/random_quantum_circuit_generation_test.py +2 -1
  108. cirq/experiments/readout_confusion_matrix.py +2 -1
  109. cirq/experiments/readout_confusion_matrix_test.py +1 -1
  110. cirq/experiments/single_qubit_readout_calibration.py +2 -1
  111. cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
  112. cirq/experiments/t1_decay_experiment.py +2 -1
  113. cirq/experiments/two_qubit_xeb.py +2 -1
  114. cirq/experiments/two_qubit_xeb_test.py +1 -1
  115. cirq/experiments/xeb_fitting.py +2 -1
  116. cirq/experiments/xeb_fitting_test.py +1 -1
  117. cirq/experiments/xeb_sampling.py +5 -3
  118. cirq/experiments/xeb_sampling_test.py +1 -1
  119. cirq/experiments/xeb_simulation.py +2 -1
  120. cirq/experiments/xeb_simulation_test.py +2 -1
  121. cirq/experiments/z_phase_calibration.py +2 -1
  122. cirq/experiments/z_phase_calibration_test.py +18 -3
  123. cirq/interop/quirk/cells/__init__.py +1 -2
  124. cirq/interop/quirk/cells/all_cells.py +2 -1
  125. cirq/interop/quirk/cells/arithmetic_cells.py +2 -1
  126. cirq/interop/quirk/cells/cell.py +2 -1
  127. cirq/interop/quirk/cells/composite_cell.py +2 -1
  128. cirq/interop/quirk/cells/composite_cell_test.py +1 -1
  129. cirq/interop/quirk/cells/control_cells.py +2 -1
  130. cirq/interop/quirk/cells/frequency_space_cells.py +1 -1
  131. cirq/interop/quirk/cells/ignored_cells.py +1 -1
  132. cirq/interop/quirk/cells/input_cells.py +2 -1
  133. cirq/interop/quirk/cells/input_rotation_cells.py +2 -1
  134. cirq/interop/quirk/cells/measurement_cells.py +2 -1
  135. cirq/interop/quirk/cells/parse.py +2 -11
  136. cirq/interop/quirk/cells/qubit_permutation_cells.py +2 -1
  137. cirq/interop/quirk/cells/scalar_cells.py +2 -1
  138. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +2 -1
  139. cirq/interop/quirk/cells/swap_cell.py +2 -1
  140. cirq/interop/quirk/cells/unsupported_cells.py +1 -1
  141. cirq/interop/quirk/url_to_circuit.py +2 -1
  142. cirq/json_resolver_cache.py +0 -2
  143. cirq/linalg/decompositions.py +6 -2
  144. cirq/linalg/decompositions_test.py +1 -0
  145. cirq/linalg/diagonalize.py +1 -1
  146. cirq/linalg/predicates.py +2 -1
  147. cirq/linalg/tolerance.py +2 -1
  148. cirq/linalg/transformations.py +2 -1
  149. cirq/ops/arithmetic_operation.py +2 -1
  150. cirq/ops/arithmetic_operation_test.py +1 -1
  151. cirq/ops/boolean_hamiltonian.py +4 -3
  152. cirq/ops/classically_controlled_operation.py +3 -2
  153. cirq/ops/clifford_gate.py +2 -1
  154. cirq/ops/clifford_gate_test.py +1 -2
  155. cirq/ops/common_channels.py +2 -1
  156. cirq/ops/common_gates.py +2 -1
  157. cirq/ops/control_values.py +2 -1
  158. cirq/ops/controlled_gate.py +3 -2
  159. cirq/ops/controlled_gate_test.py +2 -1
  160. cirq/ops/controlled_operation.py +3 -2
  161. cirq/ops/controlled_operation_test.py +2 -1
  162. cirq/ops/dense_pauli_string.py +3 -13
  163. cirq/ops/diagonal_gate.py +3 -2
  164. cirq/ops/eigen_gate.py +9 -7
  165. cirq/ops/fourier_transform.py +3 -2
  166. cirq/ops/fourier_transform_test.py +2 -4
  167. cirq/ops/fsim_gate.py +3 -2
  168. cirq/ops/gate_operation.py +8 -12
  169. cirq/ops/gateset.py +22 -2
  170. cirq/ops/global_phase_op.py +3 -2
  171. cirq/ops/greedy_qubit_manager.py +2 -1
  172. cirq/ops/identity.py +2 -1
  173. cirq/ops/kraus_channel.py +2 -1
  174. cirq/ops/linear_combinations.py +8 -3
  175. cirq/ops/linear_combinations_test.py +23 -1
  176. cirq/ops/matrix_gates.py +2 -1
  177. cirq/ops/measure_util.py +2 -1
  178. cirq/ops/measurement_gate.py +2 -1
  179. cirq/ops/mixed_unitary_channel.py +2 -1
  180. cirq/ops/named_qubit.py +2 -2
  181. cirq/ops/op_tree.py +2 -1
  182. cirq/ops/parallel_gate.py +3 -2
  183. cirq/ops/parity_gates.py +2 -1
  184. cirq/ops/pauli_interaction_gate.py +2 -1
  185. cirq/ops/pauli_measurement_gate.py +2 -1
  186. cirq/ops/pauli_string.py +6 -12
  187. cirq/ops/pauli_string_phasor.py +3 -2
  188. cirq/ops/pauli_string_raw_types.py +2 -1
  189. cirq/ops/pauli_string_test.py +2 -2
  190. cirq/ops/pauli_sum_exponential.py +2 -1
  191. cirq/ops/permutation_gate.py +2 -1
  192. cirq/ops/phased_iswap_gate.py +3 -2
  193. cirq/ops/phased_x_gate.py +5 -4
  194. cirq/ops/phased_x_z_gate.py +12 -5
  195. cirq/ops/projector.py +2 -1
  196. cirq/ops/qubit_manager.py +2 -1
  197. cirq/ops/qubit_order.py +2 -1
  198. cirq/ops/qubit_order_or_list.py +1 -1
  199. cirq/ops/random_gate_channel.py +3 -2
  200. cirq/ops/raw_types.py +7 -15
  201. cirq/ops/raw_types_test.py +4 -3
  202. cirq/ops/state_preparation_channel.py +2 -1
  203. cirq/ops/three_qubit_gates.py +3 -2
  204. cirq/ops/two_qubit_diagonal_gate.py +3 -2
  205. cirq/ops/uniform_superposition_gate.py +2 -1
  206. cirq/ops/wait_gate.py +10 -4
  207. cirq/protocols/act_on_protocol.py +2 -1
  208. cirq/protocols/act_on_protocol_test.py +2 -1
  209. cirq/protocols/apply_channel_protocol.py +2 -1
  210. cirq/protocols/apply_mixture_protocol.py +2 -1
  211. cirq/protocols/apply_mixture_protocol_test.py +2 -1
  212. cirq/protocols/apply_unitary_protocol.py +2 -1
  213. cirq/protocols/apply_unitary_protocol_test.py +2 -0
  214. cirq/protocols/approximate_equality_protocol.py +2 -1
  215. cirq/protocols/circuit_diagram_info_protocol.py +2 -1
  216. cirq/protocols/decompose_protocol.py +2 -12
  217. cirq/protocols/has_stabilizer_effect_protocol.py +1 -1
  218. cirq/protocols/hash_from_pickle_test.py +2 -2
  219. cirq/protocols/inverse_protocol.py +2 -1
  220. cirq/protocols/json_serialization.py +2 -1
  221. cirq/protocols/kraus_protocol.py +4 -3
  222. cirq/protocols/kraus_protocol_test.py +2 -2
  223. cirq/protocols/measurement_key_protocol.py +2 -1
  224. cirq/protocols/mixture_protocol.py +2 -1
  225. cirq/protocols/pow_protocol.py +2 -1
  226. cirq/protocols/qasm.py +2 -1
  227. cirq/protocols/qid_shape_protocol.py +2 -1
  228. cirq/protocols/resolve_parameters.py +16 -14
  229. cirq/protocols/trace_distance_bound.py +2 -1
  230. cirq/protocols/unitary_protocol.py +21 -21
  231. cirq/qis/channels.py +1 -1
  232. cirq/qis/channels_test.py +1 -1
  233. cirq/qis/clifford_tableau.py +2 -1
  234. cirq/qis/entropy.py +2 -2
  235. cirq/qis/quantum_state_representation.py +2 -1
  236. cirq/qis/states.py +7 -2
  237. cirq/sim/classical_simulator.py +2 -1
  238. cirq/sim/clifford/clifford_simulator.py +2 -1
  239. cirq/sim/clifford/clifford_simulator_test.py +1 -1
  240. cirq/sim/clifford/clifford_tableau_simulation_state.py +2 -1
  241. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +2 -1
  242. cirq/sim/clifford/stabilizer_sampler.py +1 -1
  243. cirq/sim/clifford/stabilizer_simulation_state.py +2 -1
  244. cirq/sim/clifford/stabilizer_state_ch_form.py +3 -2
  245. cirq/sim/clifford/stabilizer_state_ch_form_test.py +0 -1
  246. cirq/sim/density_matrix_simulation_state.py +2 -1
  247. cirq/sim/density_matrix_simulator.py +2 -1
  248. cirq/sim/density_matrix_utils.py +2 -1
  249. cirq/sim/mux.py +2 -1
  250. cirq/sim/mux_test.py +0 -1
  251. cirq/sim/simulation_product_state.py +2 -1
  252. cirq/sim/simulation_product_state_test.py +2 -1
  253. cirq/sim/simulation_state.py +2 -1
  254. cirq/sim/simulation_state_base.py +2 -1
  255. cirq/sim/simulation_state_test.py +2 -1
  256. cirq/sim/simulation_utils.py +2 -1
  257. cirq/sim/simulator.py +2 -1
  258. cirq/sim/simulator_base.py +2 -1
  259. cirq/sim/simulator_base_test.py +2 -1
  260. cirq/sim/simulator_test.py +2 -1
  261. cirq/sim/sparse_simulator.py +2 -1
  262. cirq/sim/state_vector.py +2 -1
  263. cirq/sim/state_vector_simulation_state.py +2 -1
  264. cirq/sim/state_vector_simulator.py +2 -1
  265. cirq/sim/state_vector_test.py +1 -2
  266. cirq/study/__init__.py +1 -0
  267. cirq/study/flatten_expressions.py +2 -1
  268. cirq/study/resolver.py +31 -18
  269. cirq/study/resolver_test.py +1 -1
  270. cirq/study/result.py +2 -1
  271. cirq/study/sweepable.py +2 -1
  272. cirq/study/sweeps.py +26 -1
  273. cirq/study/sweeps_test.py +24 -0
  274. cirq/testing/_compat_test_data/__init__.py +3 -3
  275. cirq/testing/circuit_compare.py +2 -1
  276. cirq/testing/consistent_act_on_test.py +1 -1
  277. cirq/testing/consistent_controlled_gate_op.py +1 -1
  278. cirq/testing/consistent_controlled_gate_op_test.py +2 -1
  279. cirq/testing/consistent_protocols.py +2 -1
  280. cirq/testing/consistent_protocols_test.py +3 -3
  281. cirq/testing/consistent_qasm.py +2 -1
  282. cirq/testing/consistent_resolve_parameters.py +1 -1
  283. cirq/testing/consistent_unitary.py +1 -1
  284. cirq/testing/consistent_unitary_test.py +1 -1
  285. cirq/testing/deprecation.py +1 -1
  286. cirq/testing/devices.py +3 -2
  287. cirq/testing/equals_tester.py +4 -3
  288. cirq/testing/equivalent_basis_map.py +4 -2
  289. cirq/testing/json.py +3 -2
  290. cirq/testing/logs.py +1 -1
  291. cirq/testing/op_tree.py +1 -1
  292. cirq/testing/order_tester.py +2 -2
  293. cirq/testing/pytest_utils.py +2 -1
  294. cirq/testing/random_circuit.py +2 -1
  295. cirq/testing/random_circuit_test.py +2 -1
  296. cirq/testing/repr_pretty_tester.py +3 -3
  297. cirq/transformers/__init__.py +1 -0
  298. cirq/transformers/_connected_component.py +231 -0
  299. cirq/transformers/_connected_component_test.py +200 -0
  300. cirq/transformers/align_test.py +13 -13
  301. cirq/transformers/analytical_decompositions/clifford_decomposition.py +8 -7
  302. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +5 -5
  303. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +11 -10
  304. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +6 -6
  305. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +3 -2
  306. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +11 -10
  307. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +8 -7
  308. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +17 -20
  309. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +33 -27
  310. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -1
  311. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +1 -1
  312. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +12 -11
  313. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -2
  314. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +3 -3
  315. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +2 -1
  316. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -1
  317. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +2 -2
  318. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -1
  319. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +32 -30
  320. cirq/transformers/drop_negligible_operations_test.py +7 -7
  321. cirq/transformers/dynamical_decoupling.py +185 -112
  322. cirq/transformers/dynamical_decoupling_test.py +195 -201
  323. cirq/transformers/eject_phased_paulis.py +2 -1
  324. cirq/transformers/eject_phased_paulis_test.py +3 -2
  325. cirq/transformers/eject_z.py +4 -3
  326. cirq/transformers/eject_z_test.py +23 -25
  327. cirq/transformers/expand_composite.py +3 -2
  328. cirq/transformers/expand_composite_test.py +14 -14
  329. cirq/transformers/gauge_compiling/__init__.py +8 -0
  330. cirq/transformers/gauge_compiling/gauge_compiling.py +3 -2
  331. cirq/transformers/gauge_compiling/gauge_compiling_test.py +14 -12
  332. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +3 -3
  333. cirq/transformers/gauge_compiling/idle_moments_gauge.py +5 -2
  334. cirq/transformers/gauge_compiling/multi_moment_cphase_gauge.py +242 -0
  335. cirq/transformers/gauge_compiling/multi_moment_cphase_gauge_test.py +243 -0
  336. cirq/transformers/gauge_compiling/multi_moment_gauge_compiling.py +151 -0
  337. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +2 -1
  338. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +1 -1
  339. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +6 -6
  340. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +2 -1
  341. cirq/transformers/measurement_transformers.py +2 -1
  342. cirq/transformers/measurement_transformers_test.py +45 -39
  343. cirq/transformers/merge_k_qubit_gates.py +2 -1
  344. cirq/transformers/merge_k_qubit_gates_test.py +1 -1
  345. cirq/transformers/merge_single_qubit_gates.py +2 -1
  346. cirq/transformers/merge_single_qubit_gates_test.py +22 -22
  347. cirq/transformers/noise_adding_test.py +2 -2
  348. cirq/transformers/optimize_for_target_gateset.py +2 -1
  349. cirq/transformers/optimize_for_target_gateset_test.py +11 -9
  350. cirq/transformers/qubit_management_transformers_test.py +6 -2
  351. cirq/transformers/routing/mapping_manager.py +2 -1
  352. cirq/transformers/routing/route_circuit_cqc.py +2 -1
  353. cirq/transformers/stratify.py +2 -1
  354. cirq/transformers/symbolize.py +2 -1
  355. cirq/transformers/tag_transformers.py +2 -1
  356. cirq/transformers/target_gatesets/compilation_target_gateset.py +2 -1
  357. cirq/transformers/target_gatesets/cz_gateset.py +2 -1
  358. cirq/transformers/target_gatesets/cz_gateset_test.py +1 -1
  359. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +2 -1
  360. cirq/transformers/transformer_api.py +2 -1
  361. cirq/transformers/transformer_primitives.py +271 -145
  362. cirq/transformers/transformer_primitives_test.py +185 -1
  363. cirq/value/abc_alt.py +2 -1
  364. cirq/value/classical_data.py +2 -1
  365. cirq/value/condition.py +2 -1
  366. cirq/value/digits.py +9 -2
  367. cirq/value/duration.py +6 -5
  368. cirq/value/linear_dict.py +4 -9
  369. cirq/value/measurement_key.py +2 -1
  370. cirq/value/periodic_value.py +3 -2
  371. cirq/value/product_state.py +2 -1
  372. cirq/value/value_equality_attr.py +2 -1
  373. cirq/vis/density_matrix.py +1 -1
  374. cirq/vis/heatmap.py +2 -1
  375. cirq/vis/histogram.py +2 -1
  376. cirq/vis/state_histogram.py +2 -1
  377. cirq/work/collector.py +2 -1
  378. cirq/work/observable_grouping.py +2 -1
  379. cirq/work/observable_measurement.py +2 -1
  380. cirq/work/observable_measurement_data.py +2 -1
  381. cirq/work/observable_measurement_test.py +1 -1
  382. cirq/work/observable_readout_calibration.py +2 -1
  383. cirq/work/observable_readout_calibration_test.py +1 -1
  384. cirq/work/observable_settings.py +2 -1
  385. cirq/work/sampler.py +2 -1
  386. cirq/work/sampler_test.py +1 -1
  387. {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/METADATA +4 -4
  388. {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/RECORD +391 -374
  389. cirq/contrib/json_test.py +0 -33
  390. {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/WHEEL +0 -0
  391. {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/licenses/LICENSE +0 -0
  392. {cirq_core-1.7.0.dev20250924231107.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/top_level.txt +0 -0
cirq/ops/raw_types.py CHANGED
@@ -18,20 +18,9 @@ from __future__ import annotations
18
18
 
19
19
  import abc
20
20
  import functools
21
+ from collections.abc import Callable, Collection, Hashable, Iterable, Mapping, Sequence, Set
21
22
  from types import NotImplementedType
22
- from typing import (
23
- AbstractSet,
24
- Any,
25
- Callable,
26
- cast,
27
- Collection,
28
- Hashable,
29
- Iterable,
30
- Mapping,
31
- overload,
32
- Sequence,
33
- TYPE_CHECKING,
34
- )
23
+ from typing import Any, cast, overload, TYPE_CHECKING
35
24
 
36
25
  import numpy as np
37
26
 
@@ -528,6 +517,9 @@ class Operation(metaclass=abc.ABCMeta):
528
517
  def _qid_shape_(self) -> tuple[int, ...]:
529
518
  return protocols.qid_shape(self.qubits)
530
519
 
520
+ def __pow__(self, exponent: Any) -> Operation:
521
+ return NotImplemented # pragma: no cover
522
+
531
523
  @abc.abstractmethod
532
524
  def with_qubits(self, *new_qubits: cirq.Qid) -> cirq.Operation:
533
525
  """Returns the same operation, but applied to different qubits.
@@ -909,7 +901,7 @@ class TaggedOperation(Operation):
909
901
  return NotImplemented
910
902
 
911
903
  @cached_method
912
- def _parameter_names_(self) -> AbstractSet[str]:
904
+ def _parameter_names_(self) -> Set[str]:
913
905
  tag_params = {name for tag in self.tags for name in protocols.parameter_names(tag)}
914
906
  return protocols.parameter_names(self.sub_operation) | tag_params
915
907
 
@@ -1023,7 +1015,7 @@ class _InverseCompositeGate(Gate):
1023
1015
  return protocols.is_parameterized(self._original)
1024
1016
 
1025
1017
  @cached_method
1026
- def _parameter_names_(self) -> AbstractSet[str]:
1018
+ def _parameter_names_(self) -> Set[str]:
1027
1019
  return protocols.parameter_names(self._original)
1028
1020
 
1029
1021
  def _resolve_parameters_(
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import AbstractSet, Any, cast, Iterator
17
+ from collections.abc import Iterator, Set
18
+ from typing import Any, cast
18
19
 
19
20
  import numpy as np
20
21
  import pytest
@@ -739,7 +740,7 @@ class ParameterizableTag:
739
740
  def _is_parameterized_(self) -> bool:
740
741
  return cirq.is_parameterized(self.value)
741
742
 
742
- def _parameter_names_(self) -> AbstractSet[str]:
743
+ def _parameter_names_(self) -> Set[str]:
743
744
  return cirq.parameter_names(self.value)
744
745
 
745
746
  def _resolve_parameters_(
@@ -781,7 +782,7 @@ def test_inverse_composite_standards() -> None:
781
782
  def _value_equality_values_(self):
782
783
  return (self._param,)
783
784
 
784
- def _parameter_names_(self) -> AbstractSet[str]:
785
+ def _parameter_names_(self) -> Set[str]:
785
786
  return cirq.parameter_names(self._param)
786
787
 
787
788
  def _is_parameterized_(self) -> bool:
@@ -16,7 +16,8 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Any, Iterable, TYPE_CHECKING
19
+ from collections.abc import Iterable
20
+ from typing import Any, TYPE_CHECKING
20
21
 
21
22
  import numpy as np
22
23
 
@@ -16,7 +16,8 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import AbstractSet, Any, Collection, Iterator, Sequence, TYPE_CHECKING
19
+ from collections.abc import Collection, Iterator, Sequence, Set
20
+ from typing import Any, TYPE_CHECKING
20
21
 
21
22
  import numpy as np
22
23
  import sympy
@@ -224,7 +225,7 @@ class ThreeQubitDiagonalGate(raw_types.Gate):
224
225
  def _is_parameterized_(self) -> bool:
225
226
  return any(protocols.is_parameterized(angle) for angle in self._diag_angles_radians)
226
227
 
227
- def _parameter_names_(self) -> AbstractSet[str]:
228
+ def _parameter_names_(self) -> Set[str]:
228
229
  return {
229
230
  name for angle in self._diag_angles_radians for name in protocols.parameter_names(angle)
230
231
  }
@@ -20,7 +20,8 @@ passed as a list.
20
20
 
21
21
  from __future__ import annotations
22
22
 
23
- from typing import AbstractSet, Any, Iterator, Sequence, TYPE_CHECKING
23
+ from collections.abc import Iterator, Sequence, Set
24
+ from typing import Any, TYPE_CHECKING
24
25
 
25
26
  import numpy as np
26
27
  import sympy
@@ -76,7 +77,7 @@ class TwoQubitDiagonalGate(raw_types.Gate):
76
77
  def _is_parameterized_(self) -> bool:
77
78
  return any(protocols.is_parameterized(angle) for angle in self._diag_angles_radians)
78
79
 
79
- def _parameter_names_(self) -> AbstractSet[str]:
80
+ def _parameter_names_(self) -> Set[str]:
80
81
  return {
81
82
  name for angle in self._diag_angles_radians for name in protocols.parameter_names(angle)
82
83
  }
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Iterator, Sequence, TYPE_CHECKING
17
+ from collections.abc import Iterator, Sequence
18
+ from typing import Any, TYPE_CHECKING
18
19
 
19
20
  import numpy as np
20
21
 
cirq/ops/wait_gate.py CHANGED
@@ -14,7 +14,10 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import AbstractSet, Any, TYPE_CHECKING
17
+ from collections.abc import Set
18
+ from typing import Any, TYPE_CHECKING
19
+
20
+ import sympy
18
21
 
19
22
  from cirq import protocols, value
20
23
  from cirq.ops import raw_types
@@ -51,8 +54,11 @@ class WaitGate(raw_types.Gate):
51
54
  ValueError: If the `qid_shape` provided is empty or `num_qubits` contradicts
52
55
  `qid_shape`.
53
56
  """
54
- self._duration = value.Duration(duration)
55
- if not protocols.is_parameterized(self.duration) and self.duration < 0:
57
+ self._duration = (
58
+ duration if isinstance(duration, value.Duration) else value.Duration(duration)
59
+ )
60
+ total_picos = self.duration.total_picos()
61
+ if not isinstance(total_picos, sympy.Basic) and total_picos < 0:
56
62
  raise ValueError('duration < 0')
57
63
  if qid_shape is None:
58
64
  if num_qubits is None:
@@ -75,7 +81,7 @@ class WaitGate(raw_types.Gate):
75
81
  def _is_parameterized_(self) -> bool:
76
82
  return protocols.is_parameterized(self.duration)
77
83
 
78
- def _parameter_names_(self) -> AbstractSet[str]:
84
+ def _parameter_names_(self) -> Set[str]:
79
85
  return protocols.parameter_names(self.duration)
80
86
 
81
87
  def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> WaitGate:
@@ -14,8 +14,9 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Sequence
17
18
  from types import NotImplementedType
18
- from typing import Any, Protocol, Sequence, TYPE_CHECKING
19
+ from typing import Any, Protocol, TYPE_CHECKING
19
20
 
20
21
  from cirq import ops
21
22
  from cirq._doc import doc_private
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Self, Sequence
17
+ from collections.abc import Sequence
18
+ from typing import Any, Self
18
19
 
19
20
  import numpy as np
20
21
  import pytest
@@ -16,8 +16,9 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
+ from collections.abc import Iterable, Sequence
19
20
  from types import NotImplementedType
20
- from typing import Any, Iterable, Protocol, Sequence, TypeVar
21
+ from typing import Any, Protocol, TypeVar
21
22
 
22
23
  import numpy as np
23
24
 
@@ -16,8 +16,9 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
+ from collections.abc import Iterable
19
20
  from types import NotImplementedType
20
- from typing import Any, cast, Iterable, Protocol, TypeVar
21
+ from typing import Any, cast, Protocol, TypeVar
21
22
 
22
23
  import numpy as np
23
24
 
@@ -13,7 +13,8 @@
13
13
  # limitations under the License.
14
14
  from __future__ import annotations
15
15
 
16
- from typing import Any, cast, Iterable
16
+ from collections.abc import Iterable
17
+ from typing import Any, cast
17
18
 
18
19
  import numpy as np
19
20
  import pytest
@@ -17,8 +17,9 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  import warnings
20
+ from collections.abc import Iterable, Sequence
20
21
  from types import EllipsisType, NotImplementedType
21
- from typing import Any, cast, Iterable, Protocol, Sequence, TYPE_CHECKING, TypeVar
22
+ from typing import Any, cast, Protocol, TYPE_CHECKING, TypeVar
22
23
 
23
24
  import numpy as np
24
25
 
@@ -240,6 +240,7 @@ def test_apply_unitary_args_tensor_manipulation() -> None:
240
240
  op_indices, tuple(qid_shape[i] for i in op_indices)
241
241
  )
242
242
  sub_result = val._apply_unitary_(sub_args)
243
+ assert isinstance(sub_result, np.ndarray)
243
244
  result = _incorporate_result_into_target(args, sub_args, sub_result)
244
245
  np.testing.assert_allclose(result, expected, atol=1e-8)
245
246
 
@@ -258,6 +259,7 @@ def test_apply_unitary_args_tensor_manipulation() -> None:
258
259
  op_indices, tuple(qid_shape[i] for i in op_indices)
259
260
  )
260
261
  sub_result = val._apply_unitary_(sub_args)
262
+ assert isinstance(sub_result, np.ndarray)
261
263
  result = _incorporate_result_into_target(args, sub_args, sub_result)
262
264
  np.testing.assert_allclose(result, expected, atol=1e-8, verbose=True)
263
265
 
@@ -15,9 +15,10 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import numbers
18
+ from collections.abc import Iterable
18
19
  from decimal import Decimal
19
20
  from fractions import Fraction
20
- from typing import Any, Iterable, Protocol
21
+ from typing import Any, Protocol
21
22
 
22
23
  import numpy as np
23
24
  import sympy
@@ -15,8 +15,9 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import re
18
+ from collections.abc import Iterable, Sequence
18
19
  from fractions import Fraction
19
- from typing import Any, Iterable, overload, Protocol, Self, Sequence, TYPE_CHECKING, TypeVar, Union
20
+ from typing import Any, overload, Protocol, Self, TYPE_CHECKING, TypeVar, Union
20
21
 
21
22
  import numpy as np
22
23
  import sympy
@@ -18,19 +18,9 @@ import dataclasses
18
18
  import inspect
19
19
  import itertools
20
20
  from collections import defaultdict
21
+ from collections.abc import Callable, Iterable, Iterator, Sequence
21
22
  from types import NotImplementedType
22
- from typing import (
23
- Any,
24
- Callable,
25
- Iterable,
26
- Iterator,
27
- overload,
28
- Protocol,
29
- Sequence,
30
- TYPE_CHECKING,
31
- TypeVar,
32
- Union,
33
- )
23
+ from typing import Any, overload, Protocol, TYPE_CHECKING, TypeVar, Union
34
24
 
35
25
  from cirq import devices, ops
36
26
  from cirq._doc import doc_private
@@ -97,7 +97,7 @@ def _strat_has_stabilizer_effect_from_unitary(val: Any) -> bool | None:
97
97
  ps = DensePauliString(pauli_string)
98
98
  p = ps._unitary_()
99
99
  if not pauli_string_decomposition.unitary_to_pauli_string(
100
- (unitary @ p @ unitary.T.conj())
100
+ unitary @ p @ unitary.T.conj()
101
101
  ):
102
102
  return False
103
103
  return True
@@ -18,8 +18,8 @@ import multiprocessing
18
18
  import os
19
19
  import pathlib
20
20
  import pickle
21
- from collections.abc import Iterator
22
- from typing import Any, Hashable
21
+ from collections.abc import Hashable, Iterator
22
+ from typing import Any
23
23
 
24
24
  import pytest
25
25
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Iterable, overload, TYPE_CHECKING, TypeVar
17
+ from collections.abc import Iterable
18
+ from typing import Any, overload, TYPE_CHECKING, TypeVar
18
19
 
19
20
  from cirq import ops
20
21
 
@@ -20,8 +20,9 @@ import gzip
20
20
  import json
21
21
  import numbers
22
22
  import pathlib
23
+ from collections.abc import Callable, Iterable, Sequence
23
24
  from types import NotImplementedType
24
- from typing import Any, Callable, cast, IO, Iterable, overload, Protocol, Sequence
25
+ from typing import Any, cast, IO, overload, Protocol
25
26
 
26
27
  import attrs
27
28
  import numpy as np
@@ -17,8 +17,9 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  import warnings
20
+ from collections.abc import Iterable
20
21
  from types import NotImplementedType
21
- from typing import Any, Protocol, Sequence, TypeVar
22
+ from typing import Any, Protocol, TypeVar
22
23
 
23
24
  import numpy as np
24
25
 
@@ -31,7 +32,7 @@ from cirq.protocols.unitary_protocol import unitary
31
32
 
32
33
  # This is a special indicator value used by the channel method to determine
33
34
  # whether or not the caller provided a 'default' argument. It must be of type
34
- # Sequence[np.ndarray] to ensure the method has the correct type signature in
35
+ # Iterable[np.ndarray] to ensure the method has the correct type signature in
35
36
  # that case. It is checked for using `is`, so it won't have a false positive
36
37
  # if the user provides a different (np.array([]),) value.
37
38
  RaiseTypeErrorIfNotProvided: tuple[np.ndarray] = (np.array([]),)
@@ -44,7 +45,7 @@ class SupportsKraus(Protocol):
44
45
  """An object that may be describable as a quantum channel."""
45
46
 
46
47
  @doc_private
47
- def _kraus_(self) -> Sequence[np.ndarray] | NotImplementedType:
48
+ def _kraus_(self) -> Iterable[np.ndarray] | NotImplementedType:
48
49
  r"""A list of Kraus matrices describing the quantum channel.
49
50
 
50
51
  These matrices are the terms in the operator sum representation of a
@@ -16,7 +16,7 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Iterable, Sequence
19
+ from collections.abc import Iterable
20
20
 
21
21
  import numpy as np
22
22
  import pytest
@@ -89,7 +89,7 @@ def test_explicit_kraus() -> None:
89
89
  c = (a0, a1)
90
90
 
91
91
  class ReturnsKraus:
92
- def _kraus_(self) -> Sequence[np.ndarray]:
92
+ def _kraus_(self) -> Iterable[np.ndarray]:
93
93
  return c
94
94
 
95
95
  assert cirq.kraus(ReturnsKraus()) is c
@@ -16,8 +16,9 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
+ from collections.abc import Mapping
19
20
  from types import NotImplementedType
20
- from typing import Any, Mapping, overload, Protocol, TYPE_CHECKING, TypeVar
21
+ from typing import Any, overload, Protocol, TYPE_CHECKING, TypeVar
21
22
 
22
23
  from cirq import value
23
24
  from cirq._doc import doc_private
@@ -16,8 +16,9 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
+ from collections.abc import Sequence
19
20
  from types import NotImplementedType
20
- from typing import Any, Protocol, Sequence
21
+ from typing import Any, Protocol
21
22
 
22
23
  import numpy as np
23
24
 
@@ -16,7 +16,8 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Any, Callable, overload, TYPE_CHECKING, TypeVar
19
+ from collections.abc import Callable
20
+ from typing import Any, overload, TYPE_CHECKING, TypeVar
20
21
 
21
22
  if TYPE_CHECKING:
22
23
  import cirq
cirq/protocols/qasm.py CHANGED
@@ -15,8 +15,9 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import string
18
+ from collections.abc import Iterable, Mapping
18
19
  from types import NotImplementedType
19
- from typing import Any, Iterable, Mapping, Protocol, TYPE_CHECKING, TypeVar
20
+ from typing import Any, Protocol, TYPE_CHECKING, TypeVar
20
21
 
21
22
  from cirq import ops
22
23
  from cirq._doc import doc_private
@@ -14,8 +14,9 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Sequence
17
18
  from types import NotImplementedType
18
- from typing import Any, Protocol, Sequence, TypeVar
19
+ from typing import Any, Protocol, TypeVar
19
20
 
20
21
  from cirq import ops
21
22
  from cirq._doc import doc_private, document
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import numbers
18
- from typing import AbstractSet, Any, cast, Protocol, Self, TYPE_CHECKING, TypeVar
18
+ from collections.abc import Set
19
+ from typing import Any, cast, Protocol, Self, TYPE_CHECKING, TypeVar
19
20
 
20
21
  import sympy
21
22
 
@@ -40,7 +41,7 @@ class SupportsParameterization(Protocol):
40
41
  and False otherwise."""
41
42
 
42
43
  @doc_private
43
- def _parameter_names_(self) -> AbstractSet[str]:
44
+ def _parameter_names_(self) -> Set[str]:
44
45
  """Returns a collection of string names of parameters that require
45
46
  resolution. If _is_parameterized_ is False, the collection is empty.
46
47
  The converse is not necessarily true, because some objects may report
@@ -92,7 +93,7 @@ def is_parameterized(val: Any) -> bool:
92
93
  return bool(parameter_names(val))
93
94
 
94
95
 
95
- def parameter_names(val: Any) -> AbstractSet[str]:
96
+ def parameter_names(val: Any) -> Set[str]:
96
97
  """Returns parameter names for this object.
97
98
 
98
99
  Args:
@@ -119,7 +120,7 @@ def parameter_names(val: Any) -> AbstractSet[str]:
119
120
  return set()
120
121
 
121
122
 
122
- def parameter_symbols(val: Any) -> AbstractSet[sympy.Symbol]:
123
+ def parameter_symbols(val: Any) -> Set[sympy.Symbol]:
123
124
  """Returns parameter symbols for this object.
124
125
 
125
126
  Args:
@@ -169,14 +170,8 @@ def resolve_parameters(
169
170
  return val
170
171
 
171
172
  # Ensure it is a dictionary wrapped in a ParamResolver.
172
- param_resolver = study.ParamResolver(param_resolver)
173
-
174
- # Handle special cases for sympy expressions and sequences.
175
- # These may not in fact preserve types, but we pretend they do by casting.
176
- if isinstance(val, sympy.Expr):
177
- return cast(T, param_resolver.value_of(val, recursive))
178
- if isinstance(val, (list, tuple)):
179
- return cast(T, type(val)(resolve_parameters(e, param_resolver, recursive) for e in val))
173
+ if not isinstance(param_resolver, study.ParamResolver):
174
+ param_resolver = study.ParamResolver(param_resolver)
180
175
 
181
176
  is_parameterized = (
182
177
  val._is_parameterized_() if hasattr(val, '_is_parameterized_') else NotImplemented
@@ -192,8 +187,15 @@ def resolve_parameters(
192
187
 
193
188
  if result is not NotImplemented:
194
189
  return result
195
- else:
196
- return val
190
+
191
+ # Handle special cases for sympy expressions and sequences.
192
+ # These may not in fact preserve types, but we pretend they do by casting.
193
+ if isinstance(val, sympy.Expr):
194
+ return cast(T, param_resolver.value_of(val, recursive))
195
+ if isinstance(val, (list, tuple)):
196
+ return cast(T, type(val)(resolve_parameters(e, param_resolver, recursive) for e in val))
197
+
198
+ return val
197
199
 
198
200
 
199
201
  def resolve_parameters_once(val: T, param_resolver: cirq.ParamResolverOrSimilarType) -> T:
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Protocol, Sequence, TypeVar
17
+ from collections.abc import Sequence
18
+ from typing import Any, Protocol, TypeVar
18
19
 
19
20
  import numpy as np
20
21
 
@@ -24,7 +24,7 @@ from cirq.protocols import qid_shape_protocol
24
24
  from cirq.protocols.apply_unitary_protocol import apply_unitaries, ApplyUnitaryArgs
25
25
  from cirq.protocols.decompose_protocol import _try_decompose_into_operations_and_qubits
26
26
 
27
- # This is a special indicator value used by the unitary method to determine
27
+ # This is a special indicator value used by the function unitary() to determine
28
28
  # whether or not the caller provided a 'default' argument. It must be of type
29
29
  # np.ndarray to ensure the method has the correct type signature in that case.
30
30
  # It is checked for using `is`, so it won't have a false positive if the user
@@ -38,23 +38,23 @@ class SupportsUnitary(Protocol):
38
38
  """An object that may be describable by a unitary matrix."""
39
39
 
40
40
  @doc_private
41
- def _unitary_(self) -> np.ndarray | NotImplementedType:
41
+ def _unitary_(self) -> np.ndarray | NotImplementedType | None:
42
42
  """A unitary matrix describing this value, e.g. the matrix of a gate.
43
43
 
44
44
  This method is used by the global `cirq.unitary` method. If this method
45
45
  is not present, or returns NotImplemented, it is assumed that the
46
46
  receiving object doesn't have a unitary matrix (resulting in a TypeError
47
- or default result when calling `cirq.unitary` on it). (The ability to
47
+ or default result when calling `cirq.unitary` on it). The ability to
48
48
  return NotImplemented is useful when a class cannot know if it has a
49
- matrix until runtime, e.g. cirq.X**c normally has a matrix but
50
- cirq.X**sympy.Symbol('a') doesn't.)
49
+ matrix until runtime; e.g., `cirq.X**c` normally has a matrix but
50
+ `cirq.X**sympy.Symbol('a')` doesn't.
51
51
 
52
52
  The order of cells in the matrix is always implicit with respect to the
53
- object being called. For example, for gates the matrix must be ordered
53
+ object being called. For example, for gates, the matrix must be ordered
54
54
  with respect to the list of qubits that the gate is applied to. For
55
55
  operations, the matrix is ordered to match the list returned by its
56
56
  `qubits` attribute. The qubit-to-amplitude order mapping matches the
57
- ordering of numpy.kron(A, B), where A is a qubit earlier in the list
57
+ ordering of `numpy.kron(A, B)`, where A is a qubit earlier in the list
58
58
  than the qubit B.
59
59
 
60
60
  Returns:
@@ -68,7 +68,7 @@ class SupportsUnitary(Protocol):
68
68
 
69
69
  This method is used by the global `cirq.has_unitary` method. If this
70
70
  method is not present, or returns NotImplemented, it will fallback
71
- to using _unitary_ with a default value, or False if neither exist.
71
+ to using `_unitary_()` with a default value, or False if neither exist.
72
72
 
73
73
  Returns:
74
74
  True if the value has a unitary matrix representation, False
@@ -81,17 +81,17 @@ def unitary(
81
81
  ) -> np.ndarray | TDefault:
82
82
  """Returns a unitary matrix describing the given value.
83
83
 
84
- The matrix is determined by any one of the following techniques:
84
+ The matrix is determined by the first of these strategies that succeeds:
85
85
 
86
- - If the value is a numpy array, it is returned directly.
87
- - The value has a `_unitary_` method that returns something besides None or
88
- NotImplemented. The matrix is whatever the method returned.
86
+ - If the value is a NumPy array, it is returned directly.
87
+ - The value has a `_unitary_` method that returns something besides `None` or
88
+ `NotImplemented`. The matrix is whatever the method returned.
89
+ - The value has an `_apply_unitary_` method, and it returns something
90
+ besides `None` or `NotImplemented`. The matrix is created by applying
91
+ `_apply_unitary_` to an identity matrix.
89
92
  - The value has a `_decompose_` method that returns a list of operations,
90
93
  and each operation in the list has a unitary effect. The matrix is
91
94
  created by aggregating the sub-operations' unitary effects.
92
- - The value has an `_apply_unitary_` method, and it returns something
93
- besides None or NotImplemented. The matrix is created by applying
94
- `_apply_unitary_` to an identity matrix.
95
95
 
96
96
  If none of these techniques succeeds, it is assumed that `val` doesn't have
97
97
  a unitary effect. The order in which techniques are attempted is
@@ -100,8 +100,8 @@ def unitary(
100
100
  Args:
101
101
  val: The value to describe with a unitary matrix.
102
102
  default: Determines the fallback behavior when `val` doesn't have
103
- a unitary effect. If `default` is not set, a TypeError is raised. If
104
- `default` is set to a value, that value is returned.
103
+ a unitary effect. If `default` is not set, a `TypeError` is raised.
104
+ If `default` is set to a value, that value is returned.
105
105
 
106
106
  Returns:
107
107
  If `val` has a unitary effect, the corresponding unitary matrix.
@@ -135,13 +135,13 @@ def unitary(
135
135
  f"type: {type(val)}\n"
136
136
  f"value: {val!r}\n"
137
137
  "\n"
138
- "The value failed to satisfy any of the following criteria:\n"
138
+ "The given value failed to satisfy any of the following criteria:\n"
139
139
  "- A `_unitary_(self)` method that returned a value "
140
- "besides None or NotImplemented.\n"
140
+ "besides `None` or `NotImplemented`.\n"
141
141
  "- A `_decompose_(self)` method that returned a "
142
142
  "list of unitary operations.\n"
143
- "- An `_apply_unitary_(self, args) method that returned a value "
144
- "besides None or NotImplemented."
143
+ "- An `_apply_unitary_(self, args)` method that returned a value "
144
+ "besides `None` or `NotImplemented`."
145
145
  )
146
146
 
147
147
 
cirq/qis/channels.py CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Sequence
19
+ from collections.abc import Sequence
20
20
 
21
21
  import numpy as np
22
22