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
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Iterable
17
+ from collections.abc import Iterable
18
18
 
19
19
  import pytest
20
20
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Iterable, Iterator, TYPE_CHECKING
17
+ from collections.abc import Iterable, Iterator
18
+ from typing import Any, TYPE_CHECKING
18
19
 
19
20
  from cirq import ops, value
20
21
  from cirq.interop.quirk.cells.cell import Cell, CellMaker
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Callable, Iterator
17
+ from collections.abc import Callable, Iterator
18
18
 
19
19
  import sympy
20
20
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Iterator
17
+ from collections.abc import Iterator
18
18
 
19
19
  from cirq.interop.quirk.cells.cell import CELL_SIZES, CellMaker
20
20
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Callable, Iterable, Iterator, TYPE_CHECKING
17
+ from collections.abc import Callable, Iterable, Iterator
18
+ from typing import TYPE_CHECKING
18
19
 
19
20
  from cirq.interop.quirk.cells.cell import Cell, CELL_SIZES, CellMaker
20
21
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Iterable, Iterator, Sequence
17
+ from collections.abc import Iterable, Iterator, Sequence
18
+ from typing import Any
18
19
 
19
20
  import numpy as np
20
21
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import cast, Iterable, Iterator, TYPE_CHECKING
17
+ from collections.abc import Iterable, Iterator
18
+ from typing import cast, TYPE_CHECKING
18
19
 
19
20
  from cirq import ops
20
21
  from cirq.interop.quirk.cells.cell import CellMaker, ExplicitOperationsCell
@@ -16,17 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import cmath
18
18
  import re
19
- from typing import (
20
- Any,
21
- Callable,
22
- cast,
23
- Iterable,
24
- Iterator,
25
- Mapping,
26
- SupportsFloat,
27
- TypeAlias,
28
- TypeVar,
29
- )
19
+ from collections.abc import Callable, Iterable, Iterator, Mapping
20
+ from typing import Any, cast, SupportsFloat, TypeAlias, TypeVar
30
21
 
31
22
  import numpy as np
32
23
  import sympy
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Callable, Iterator, Sequence, TYPE_CHECKING
17
+ from collections.abc import Callable, Iterator, Sequence
18
+ from typing import TYPE_CHECKING
18
19
 
19
20
  from cirq import ops, value
20
21
  from cirq.interop.quirk.cells.cell import CELL_SIZES, CellMaker
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Iterator, TYPE_CHECKING
17
+ from collections.abc import Iterator
18
+ from typing import TYPE_CHECKING
18
19
 
19
20
  from cirq import ops
20
21
  from cirq.interop.quirk.cells.cell import CellMaker
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Callable, Iterator, TYPE_CHECKING
17
+ from collections.abc import Callable, Iterator
18
+ from typing import TYPE_CHECKING
18
19
 
19
20
  import sympy
20
21
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Iterable, Iterator, TYPE_CHECKING
17
+ from collections.abc import Iterable, Iterator
18
+ from typing import Any, TYPE_CHECKING
18
19
 
19
20
  from cirq import ops, value
20
21
  from cirq.interop.quirk.cells.cell import Cell, CellMaker
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Iterator
17
+ from collections.abc import Iterator
18
18
 
19
19
  from cirq.interop.quirk.cells.cell import CELL_SIZES, CellMaker
20
20
 
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import json
18
18
  import urllib.parse
19
- from typing import Any, cast, Iterable, Mapping, Sequence, TYPE_CHECKING
19
+ from collections.abc import Iterable, Mapping, Sequence
20
+ from typing import Any, cast, TYPE_CHECKING
20
21
 
21
22
  import numpy as np
22
23
 
@@ -21,8 +21,6 @@ from typing import NamedTuple, TYPE_CHECKING
21
21
 
22
22
  if TYPE_CHECKING:
23
23
  import cirq
24
- import cirq.devices.unconstrained_device
25
- import cirq.ops.pauli_gates
26
24
  from cirq.protocols.json_serialization import ObjectFactory
27
25
 
28
26
 
@@ -18,7 +18,8 @@ from __future__ import annotations
18
18
 
19
19
  import cmath
20
20
  import math
21
- from typing import Any, Callable, cast, Iterable, TYPE_CHECKING, TypeVar
21
+ from collections.abc import Callable, Iterable
22
+ from typing import Any, cast, TYPE_CHECKING, TypeVar
22
23
 
23
24
  import matplotlib.pyplot as plt
24
25
  import numpy as np
@@ -243,7 +244,7 @@ def so4_to_magic_su2s(
243
244
 
244
245
  @value.value_equality(approximate=True)
245
246
  class AxisAngleDecomposition:
246
- """Represents a unitary operation as an axis, angle, and global phase.
247
+ r"""Represents a unitary operation as an axis, angle, and global phase.
247
248
 
248
249
  The unitary $U$ is decomposed as follows:
249
250
 
@@ -472,6 +473,9 @@ class KakDecomposition:
472
473
  f' global_phase={self.global_phase!r})'
473
474
  )
474
475
 
476
+ def _has_unitary_(self) -> bool:
477
+ return True
478
+
475
479
  def _unitary_(self) -> np.ndarray:
476
480
  """Returns the decomposition's two-qubit unitary matrix.
477
481
 
@@ -259,6 +259,7 @@ def test_kak_plot_empty() -> None:
259
259
  )
260
260
  def test_kak_decomposition(target) -> None:
261
261
  kak = cirq.kak_decomposition(target)
262
+ assert cirq.has_unitary(kak)
262
263
  np.testing.assert_allclose(cirq.unitary(kak), target, atol=1e-8)
263
264
 
264
265
 
@@ -16,7 +16,7 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Callable
19
+ from collections.abc import Callable
20
20
 
21
21
  import numpy as np
22
22
 
cirq/linalg/predicates.py CHANGED
@@ -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 EllipsisType
20
- from typing import cast, Sequence
21
+ from typing import cast
21
22
 
22
23
  import numpy as np
23
24
 
cirq/linalg/tolerance.py CHANGED
@@ -17,7 +17,8 @@ tolerances."""
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- from typing import Iterable, TYPE_CHECKING
20
+ from collections.abc import Iterable
21
+ from typing import TYPE_CHECKING
21
22
 
22
23
  import numpy as np
23
24
 
@@ -18,8 +18,9 @@ from __future__ import annotations
18
18
 
19
19
  import dataclasses
20
20
  import functools
21
+ from collections.abc import Sequence
21
22
  from types import EllipsisType
22
- from typing import Any, Sequence
23
+ from typing import Any
23
24
 
24
25
  import numpy as np
25
26
 
@@ -17,7 +17,8 @@ from __future__ import annotations
17
17
 
18
18
  import abc
19
19
  import itertools
20
- from typing import cast, Iterable, Self, Sequence, TYPE_CHECKING
20
+ from collections.abc import Iterable, Sequence
21
+ from typing import cast, Self, TYPE_CHECKING
21
22
 
22
23
  import numpy as np
23
24
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Sequence
17
+ from collections.abc import Sequence
18
18
 
19
19
  import numpy as np
20
20
  import pytest
@@ -27,7 +27,8 @@ from __future__ import annotations
27
27
 
28
28
  import functools
29
29
  import itertools
30
- from typing import Any, Generator, Sequence
30
+ from collections.abc import Generator, Sequence
31
+ from typing import Any
31
32
 
32
33
  import sympy.parsing.sympy_parser as sympy_parser
33
34
 
@@ -334,8 +335,8 @@ def _get_gates_from_hamiltonians(
334
335
 
335
336
  cnots = _simplify_cnots(cnots)
336
337
 
337
- for gate in (cirq.CNOT(qubits[c], qubits[t]) for c, t in cnots):
338
- yield gate
338
+ for c, t in cnots:
339
+ yield cirq.CNOT(qubits[c], qubits[t])
339
340
 
340
341
  sorted_hamiltonian_keys = sorted(
341
342
  hamiltonians.keys(), key=functools.cmp_to_key(_gray_code_comparator)
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import AbstractSet, Any, Mapping, Sequence, TYPE_CHECKING
17
+ from collections.abc import Mapping, Sequence, Set
18
+ from typing import Any, TYPE_CHECKING
18
19
 
19
20
  import sympy
20
21
 
@@ -150,7 +151,7 @@ class ClassicallyControlledOperation(raw_types.Operation):
150
151
  def _is_parameterized_(self) -> bool:
151
152
  return protocols.is_parameterized(self._sub_operation)
152
153
 
153
- def _parameter_names_(self) -> AbstractSet[str]:
154
+ def _parameter_names_(self) -> Set[str]:
154
155
  return protocols.parameter_names(self._sub_operation)
155
156
 
156
157
  def _resolve_parameters_(
cirq/ops/clifford_gate.py CHANGED
@@ -15,9 +15,10 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import functools
18
+ from collections.abc import Sequence
18
19
  from dataclasses import dataclass
19
20
  from types import NotImplementedType
20
- from typing import Any, Sequence, TYPE_CHECKING
21
+ from typing import Any, TYPE_CHECKING
21
22
 
22
23
  import numpy as np
23
24
 
@@ -48,8 +48,7 @@ def _assert_no_collision(gate) -> None:
48
48
 
49
49
 
50
50
  def _all_rotations():
51
- for pauli, flip in itertools.product(_paulis, _bools):
52
- yield (pauli, flip)
51
+ yield from itertools.product(_paulis, _bools)
53
52
 
54
53
 
55
54
  def _all_rotation_pairs():
@@ -17,7 +17,8 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  import itertools
20
- from typing import Any, Iterable, Sequence, TYPE_CHECKING
20
+ from collections.abc import Iterable, Sequence
21
+ from typing import Any, TYPE_CHECKING
21
22
 
22
23
  import numpy as np
23
24
 
cirq/ops/common_gates.py CHANGED
@@ -27,8 +27,9 @@ raised to a power (i.e. cirq.H**0.5). See the definition in EigenGate.
27
27
 
28
28
  from __future__ import annotations
29
29
 
30
+ from collections.abc import Collection, Sequence
30
31
  from types import NotImplementedType
31
- from typing import Any, cast, Collection, Sequence
32
+ from typing import Any, cast
32
33
 
33
34
  import numpy as np
34
35
  import sympy
@@ -16,8 +16,9 @@ from __future__ import annotations
16
16
 
17
17
  import abc
18
18
  import itertools
19
+ from collections.abc import Collection, Iterator, Sequence
19
20
  from functools import cached_property
20
- from typing import Any, Collection, Iterator, Sequence, TYPE_CHECKING
21
+ from typing import Any, TYPE_CHECKING
21
22
 
22
23
  from cirq import protocols, value
23
24
 
@@ -14,8 +14,9 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Collection, Sequence, Set
17
18
  from types import NotImplementedType
18
- from typing import AbstractSet, Any, Collection, Sequence, TYPE_CHECKING
19
+ from typing import Any, TYPE_CHECKING
19
20
 
20
21
  import numpy as np
21
22
 
@@ -244,7 +245,7 @@ class ControlledGate(raw_types.Gate):
244
245
  def _is_parameterized_(self) -> bool:
245
246
  return protocols.is_parameterized(self.sub_gate)
246
247
 
247
- def _parameter_names_(self) -> AbstractSet[str]:
248
+ def _parameter_names_(self) -> Set[str]:
248
249
  return protocols.parameter_names(self.sub_gate)
249
250
 
250
251
  def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> ControlledGate:
@@ -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 EllipsisType, NotImplementedType
18
- from typing import Any, cast, Sequence
19
+ from typing import Any, cast
19
20
 
20
21
  import numpy as np
21
22
  import pytest
@@ -14,8 +14,9 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Collection, Sequence, Set
17
18
  from types import EllipsisType, NotImplementedType
18
- from typing import AbstractSet, Any, Collection, Sequence, TYPE_CHECKING
19
+ from typing import Any, TYPE_CHECKING
19
20
 
20
21
  import numpy as np
21
22
 
@@ -261,7 +262,7 @@ class ControlledOperation(raw_types.Operation):
261
262
  def _is_parameterized_(self) -> bool:
262
263
  return protocols.is_parameterized(self.sub_operation)
263
264
 
264
- def _parameter_names_(self) -> AbstractSet[str]:
265
+ def _parameter_names_(self) -> Set[str]:
265
266
  return protocols.parameter_names(self.sub_operation)
266
267
 
267
268
  def _resolve_parameters_(
@@ -16,8 +16,9 @@ from __future__ import annotations
16
16
 
17
17
  import itertools
18
18
  import re
19
+ from collections.abc import Sequence
19
20
  from types import EllipsisType, NotImplementedType
20
- from typing import cast, Sequence
21
+ from typing import cast
21
22
 
22
23
  import numpy as np
23
24
  import pytest
@@ -16,19 +16,9 @@ from __future__ import annotations
16
16
 
17
17
  import abc
18
18
  import numbers
19
+ from collections.abc import Callable, Iterable, Iterator, Sequence, Set
19
20
  from types import NotImplementedType
20
- from typing import (
21
- AbstractSet,
22
- Any,
23
- Callable,
24
- cast,
25
- Iterable,
26
- Iterator,
27
- overload,
28
- Self,
29
- Sequence,
30
- TYPE_CHECKING,
31
- )
21
+ from typing import Any, cast, overload, Self, TYPE_CHECKING
32
22
 
33
23
  import numpy as np
34
24
  import sympy
@@ -187,7 +177,7 @@ class BaseDensePauliString(raw_types.Gate, metaclass=abc.ABCMeta):
187
177
  def _is_parameterized_(self) -> bool:
188
178
  return protocols.is_parameterized(self.coefficient)
189
179
 
190
- def _parameter_names_(self) -> AbstractSet[str]:
180
+ def _parameter_names_(self) -> Set[str]:
191
181
  return protocols.parameter_names(self.coefficient)
192
182
 
193
183
  def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> Self:
cirq/ops/diagonal_gate.py CHANGED
@@ -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
@@ -95,7 +96,7 @@ class DiagonalGate(raw_types.Gate):
95
96
  def _is_parameterized_(self) -> bool:
96
97
  return any(protocols.is_parameterized(angle) for angle in self._diag_angles_radians)
97
98
 
98
- def _parameter_names_(self) -> AbstractSet[str]:
99
+ def _parameter_names_(self) -> Set[str]:
99
100
  return {
100
101
  name for angle in self._diag_angles_radians for name in protocols.parameter_names(angle)
101
102
  }
cirq/ops/eigen_gate.py CHANGED
@@ -18,8 +18,9 @@ import abc
18
18
  import fractions
19
19
  import math
20
20
  import numbers
21
+ from collections.abc import Iterable, Set
21
22
  from types import NotImplementedType
22
- from typing import AbstractSet, Any, cast, Iterable, NamedTuple, TYPE_CHECKING
23
+ from typing import Any, cast, NamedTuple, TYPE_CHECKING
23
24
 
24
25
  import numpy as np
25
26
  import sympy
@@ -341,16 +342,17 @@ class EigenGate(raw_types.Gate):
341
342
  def _is_parameterized_(self) -> bool:
342
343
  return protocols.is_parameterized(self._exponent)
343
344
 
344
- def _parameter_names_(self) -> AbstractSet[str]:
345
+ def _parameter_names_(self) -> Set[str]:
345
346
  return protocols.parameter_names(self._exponent)
346
347
 
347
348
  def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> EigenGate:
348
349
  exponent = resolver.value_of(self._exponent, recursive)
349
- if isinstance(exponent, numbers.Complex):
350
- if isinstance(exponent, numbers.Real):
351
- exponent = float(exponent)
352
- else:
353
- raise ValueError(f'Complex exponent {exponent} not supported for EigenGate')
350
+ # Note that int/float checking is purposely done first,
351
+ # since numbers instance checking is somewhat slow.
352
+ if isinstance(exponent, (int, float)) or isinstance(exponent, numbers.Real): # noqa: SIM101
353
+ exponent = float(exponent)
354
+ elif isinstance(exponent, numbers.Complex):
355
+ raise ValueError(f'Complex exponent {exponent} not supported for EigenGate')
354
356
  return self._with_exponent(exponent=exponent)
355
357
 
356
358
  def _equal_up_to_global_phase_(self, other, atol):
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import AbstractSet, Any
17
+ from collections.abc import Set
18
+ from typing import Any
18
19
 
19
20
  import numpy as np
20
21
  import sympy
@@ -163,7 +164,7 @@ class PhaseGradientGate(raw_types.Gate):
163
164
  def _is_parameterized_(self) -> bool:
164
165
  return cirq.is_parameterized(self.exponent)
165
166
 
166
- def _parameter_names_(self) -> AbstractSet[str]:
167
+ def _parameter_names_(self) -> Set[str]:
167
168
  return cirq.parameter_names(self.exponent)
168
169
 
169
170
  def _resolve_parameters_(
@@ -107,9 +107,7 @@ def test_qft() -> None:
107
107
 
108
108
  arr = np.array([[1, 1, 1, 1], [1, -1j, -1, 1j], [1, -1, 1, -1], [1, 1j, -1, -1j]]) / 2
109
109
  np.testing.assert_allclose(
110
- cirq.unitary(cirq.qft(*cirq.LineQubit.range(2)) ** -1), # type: ignore[operator]
111
- arr, # type: ignore[arg-type]
112
- atol=1e-8,
110
+ cirq.unitary(cirq.qft(*cirq.LineQubit.range(2)) ** -1), arr, atol=1e-8
113
111
  )
114
112
 
115
113
  for k in range(4):
@@ -121,7 +119,7 @@ def test_qft() -> None:
121
119
 
122
120
  def test_inverse() -> None:
123
121
  a, b, c = cirq.LineQubit.range(3)
124
- assert cirq.qft(a, b, c, inverse=True) == cirq.qft(a, b, c) ** -1 # type: ignore[operator]
122
+ assert cirq.qft(a, b, c, inverse=True) == cirq.qft(a, b, c) ** -1
125
123
  assert cirq.qft(a, b, c, inverse=True, without_reverse=True) == cirq.inverse(
126
124
  cirq.qft(a, b, c, without_reverse=True)
127
125
  )
cirq/ops/fsim_gate.py CHANGED
@@ -26,7 +26,8 @@ from __future__ import annotations
26
26
 
27
27
  import cmath
28
28
  import math
29
- from typing import AbstractSet, Any, Iterator
29
+ from collections.abc import Iterator, Set
30
+ from typing import Any
30
31
 
31
32
  import numpy as np
32
33
  import sympy
@@ -125,7 +126,7 @@ class FSimGate(gate_features.InterchangeableQubitsGate, raw_types.Gate):
125
126
  def _is_parameterized_(self) -> bool:
126
127
  return cirq.is_parameterized(self.theta) or cirq.is_parameterized(self.phi)
127
128
 
128
- def _parameter_names_(self) -> AbstractSet[str]:
129
+ def _parameter_names_(self) -> Set[str]:
129
130
  return cirq.parameter_names(self.theta) | cirq.parameter_names(self.phi)
130
131
 
131
132
  def _has_unitary_(self):
@@ -16,20 +16,12 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
+ import numbers
19
20
  import re
20
21
  import warnings
22
+ from collections.abc import Collection, Mapping, Sequence, Set
21
23
  from types import NotImplementedType
22
- from typing import (
23
- AbstractSet,
24
- Any,
25
- cast,
26
- Collection,
27
- Mapping,
28
- Self,
29
- Sequence,
30
- TYPE_CHECKING,
31
- TypeVar,
32
- )
24
+ from typing import Any, cast, Self, TYPE_CHECKING, TypeVar
33
25
 
34
26
  from cirq import ops, protocols, value
35
27
  from cirq.ops import control_values as cv, gate_features, raw_types
@@ -269,7 +261,7 @@ class GateOperation(raw_types.Operation):
269
261
  return getter()
270
262
  return NotImplemented
271
263
 
272
- def _parameter_names_(self) -> AbstractSet[str]:
264
+ def _parameter_names_(self) -> Set[str]:
273
265
  getter = getattr(self.gate, '_parameter_names_', None)
274
266
  if getter is not None:
275
267
  return getter()
@@ -332,12 +324,16 @@ class GateOperation(raw_types.Operation):
332
324
  return self.gate._rmul_with_qubits(self._qubits, other)
333
325
 
334
326
  def __add__(self, other):
327
+ if not isinstance(other, (ops.Operation, numbers.Number)):
328
+ return NotImplemented
335
329
  return 1 * self + other
336
330
 
337
331
  def __radd__(self, other):
338
332
  return other + 1 * self
339
333
 
340
334
  def __sub__(self, other):
335
+ if not isinstance(other, (ops.Operation, numbers.Number)):
336
+ return NotImplemented
341
337
  return 1 * self - other
342
338
 
343
339
  def __rsub__(self, other):