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/gateset.py CHANGED
@@ -16,7 +16,8 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Any, Callable, cast, Hashable, Iterable, TYPE_CHECKING
19
+ from collections.abc import Callable, Hashable, Iterable
20
+ from typing import Any, cast, TYPE_CHECKING
20
21
 
21
22
  from cirq import protocols, value
22
23
  from cirq.ops import global_phase_op, op_tree, raw_types
@@ -340,6 +341,7 @@ class Gateset:
340
341
  self._unroll_circuit_op = unroll_circuit_op
341
342
  self._instance_gate_families: dict[raw_types.Gate, GateFamily] = {}
342
343
  self._type_gate_families: dict[type[raw_types.Gate], GateFamily] = {}
344
+ self._gate_families_with_tags: list[GateFamily] = []
343
345
  self._gates_repr_str = ", ".join([_gate_str(g, repr) for g in gates])
344
346
  unique_gate_list: list[GateFamily] = list(
345
347
  dict.fromkeys(g if isinstance(g, GateFamily) else GateFamily(gate=g) for g in gates)
@@ -351,6 +353,12 @@ class Gateset:
351
353
  self._instance_gate_families[g.gate] = g
352
354
  else:
353
355
  self._type_gate_families[g.gate] = g
356
+ else:
357
+ if isinstance(g.gate, raw_types.Gate):
358
+ self._gate_families_with_tags.append(g)
359
+ else:
360
+ # Instance checks are faster, so test them first.
361
+ self._gate_families_with_tags.insert(0, g)
354
362
  self._unique_gate_list = unique_gate_list
355
363
  self._gates = frozenset(unique_gate_list)
356
364
 
@@ -422,6 +430,7 @@ class Gateset:
422
430
  g = item if isinstance(item, raw_types.Gate) else item.gate
423
431
  assert g is not None, f'`item`: {item} must be a gate or have a valid `item.gate`'
424
432
 
433
+ # Check "type" based GateFamily since isinstance is fast
425
434
  for gate_mro_type in type(g).mro():
426
435
  if gate_mro_type in self._type_gate_families:
427
436
  assert item in self._type_gate_families[gate_mro_type], (
@@ -430,6 +439,7 @@ class Gateset:
430
439
  )
431
440
  return True
432
441
 
442
+ # Check exact instance equality next
433
443
  if g in self._instance_gate_families:
434
444
  assert item in self._instance_gate_families[g], (
435
445
  f"{item} instance matches {self._instance_gate_families[g]} but "
@@ -437,7 +447,17 @@ class Gateset:
437
447
  )
438
448
  return True
439
449
 
440
- return any(item in gate_family for gate_family in self._gates)
450
+ # Check other GateFamilies next
451
+ if any(item in gate_family for gate_family in self._gate_families_with_tags):
452
+ return True
453
+
454
+ # Lastly, do a final exhaustive check to make sure this is not equivalent
455
+ # to another type of gate. This will catch things like:
456
+ # cirq.XPowGate(exponent=0) in cirq.GateFamily(cirq.I)
457
+ return any(
458
+ item in gate_family
459
+ for gate_family in self._gates.difference(self._gate_families_with_tags)
460
+ )
441
461
 
442
462
  def validate(self, circuit_or_optree: cirq.AbstractCircuit | op_tree.OP_TREE) -> bool:
443
463
  """Validates gates forming `circuit_or_optree` should be contained in Gateset.
@@ -15,8 +15,9 @@
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
+ from collections.abc import Collection, Sequence, Set
18
19
  from types import NotImplementedType
19
- from typing import AbstractSet, Any, cast, Collection, Sequence
20
+ from typing import Any, cast
20
21
 
21
22
  import numpy as np
22
23
  import sympy
@@ -83,7 +84,7 @@ class GlobalPhaseGate(raw_types.Gate):
83
84
  def _is_parameterized_(self) -> bool:
84
85
  return protocols.is_parameterized(self.coefficient)
85
86
 
86
- def _parameter_names_(self) -> AbstractSet[str]:
87
+ def _parameter_names_(self) -> Set[str]:
87
88
  return protocols.parameter_names(self.coefficient)
88
89
 
89
90
  def _resolve_parameters_(
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Iterable, TYPE_CHECKING
17
+ from collections.abc import Iterable
18
+ from typing import TYPE_CHECKING
18
19
 
19
20
  from cirq.ops import named_qubit, qid_util, qubit_manager
20
21
 
cirq/ops/identity.py CHANGED
@@ -16,8 +16,9 @@
16
16
  from __future__ import annotations
17
17
 
18
18
  import numbers
19
+ from collections.abc import Sequence
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
  import sympy
cirq/ops/kraus_channel.py CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Any, Iterable, Mapping, TYPE_CHECKING
5
+ from collections.abc import Iterable, Mapping
6
+ from typing import Any, TYPE_CHECKING
6
7
 
7
8
  import numpy as np
8
9
 
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import numbers
18
18
  from collections import defaultdict
19
- from typing import AbstractSet, Any, Iterable, Mapping, TYPE_CHECKING, Union
19
+ from collections.abc import Iterable, Mapping, Set
20
+ from typing import Any, TYPE_CHECKING, Union
20
21
 
21
22
  import numpy as np
22
23
  import sympy
@@ -136,7 +137,7 @@ class LinearCombinationOfGates(value.LinearDict[raw_types.Gate]):
136
137
  def _is_parameterized_(self) -> bool:
137
138
  return any(protocols.is_parameterized(item) for item in self.items())
138
139
 
139
- def _parameter_names_(self) -> AbstractSet[str]:
140
+ def _parameter_names_(self) -> Set[str]:
140
141
  return {name for item in self.items() for name in protocols.parameter_names(item)}
141
142
 
142
143
  def _resolve_parameters_(
@@ -253,7 +254,7 @@ class LinearCombinationOfOperations(value.LinearDict[raw_types.Operation]):
253
254
  def _is_parameterized_(self) -> bool:
254
255
  return any(protocols.is_parameterized(item) for item in self.items())
255
256
 
256
- def _parameter_names_(self) -> AbstractSet[str]:
257
+ def _parameter_names_(self) -> Set[str]:
257
258
  return {name for item in self.items() for name in protocols.parameter_names(item)}
258
259
 
259
260
  def _resolve_parameters_(
@@ -742,6 +743,8 @@ class PauliSum:
742
743
  return len(self._linear_dict)
743
744
 
744
745
  def __iadd__(self, other):
746
+ if isinstance(other, raw_types.Operation):
747
+ other = pauli_string._try_interpret_as_pauli_string(other)
745
748
  if isinstance(other, numbers.Complex):
746
749
  other = PauliSum.from_pauli_strings([PauliString(coefficient=other)])
747
750
  elif isinstance(other, PauliString):
@@ -766,6 +769,8 @@ class PauliSum:
766
769
  return -self.__sub__(other)
767
770
 
768
771
  def __isub__(self, other):
772
+ if isinstance(other, raw_types.Operation):
773
+ other = pauli_string._try_interpret_as_pauli_string(other)
769
774
  if isinstance(other, numbers.Complex):
770
775
  other = PauliSum.from_pauli_strings([PauliString(coefficient=other)])
771
776
  elif isinstance(other, PauliString):
@@ -975,10 +975,16 @@ def test_paulisum_validation() -> None:
975
975
  ps += cirq.I(cirq.LineQubit(0))
976
976
  assert ps == cirq.PauliSum(cirq.LinearDict({frozenset(): complex(1)}))
977
977
 
978
+ ps = cirq.I(cirq.LineQubit(0)) + cirq.PauliSum()
979
+ assert ps == cirq.PauliSum(cirq.LinearDict({frozenset(): complex(1)}))
980
+
978
981
  ps = cirq.PauliSum()
979
982
  ps -= cirq.I(cirq.LineQubit(0))
980
983
  assert ps == cirq.PauliSum(cirq.LinearDict({frozenset(): complex(-1)}))
981
984
 
985
+ ps = cirq.I(cirq.LineQubit(0)) - cirq.PauliSum()
986
+ assert ps == cirq.PauliSum(cirq.LinearDict({frozenset(): complex(1)}))
987
+
982
988
 
983
989
  def test_add_number_paulisum() -> None:
984
990
  q = cirq.LineQubit.range(2)
@@ -1008,6 +1014,22 @@ def test_add_number_paulistring() -> None:
1008
1014
  == cirq.PauliSum.from_pauli_strings([cirq.PauliString() * 2, cirq.PauliString({a: cirq.X})])
1009
1015
  )
1010
1016
 
1017
+ assert (
1018
+ cirq.X(a) - 2
1019
+ == -2 + cirq.X(a)
1020
+ == cirq.PauliSum.from_pauli_strings(
1021
+ [cirq.PauliString() * -2, cirq.PauliString({a: cirq.X})]
1022
+ )
1023
+ )
1024
+
1025
+ assert (
1026
+ 2 - cirq.X(a)
1027
+ == 2 + -cirq.X(a)
1028
+ == cirq.PauliSum.from_pauli_strings(
1029
+ [cirq.PauliString() * 2, -cirq.PauliString({a: cirq.X})]
1030
+ )
1031
+ )
1032
+
1011
1033
 
1012
1034
  def test_pauli_sum_formatting() -> None:
1013
1035
  q = cirq.LineQubit.range(2)
@@ -1430,7 +1452,7 @@ def test_expectation_from_density_matrix_invalid_input() -> None:
1430
1452
  with pytest.raises(ValueError, match='shape'):
1431
1453
  psum.expectation_from_density_matrix(rho.reshape((8, 8, 1)), q_map)
1432
1454
  with pytest.raises(ValueError, match='shape'):
1433
- psum.expectation_from_density_matrix(rho.reshape((-1)), q_map)
1455
+ psum.expectation_from_density_matrix(rho.reshape((-1,)), q_map)
1434
1456
 
1435
1457
 
1436
1458
  def test_expectation_from_density_matrix_check_preconditions() -> None:
cirq/ops/matrix_gates.py CHANGED
@@ -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
 
cirq/ops/measure_util.py CHANGED
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Callable, cast, Iterable, overload, TYPE_CHECKING
17
+ from collections.abc import Callable, Iterable
18
+ from typing import cast, overload, TYPE_CHECKING
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 Any, Iterable, Mapping, Sequence, TYPE_CHECKING
17
+ from collections.abc import Iterable, Mapping, Sequence
18
+ from typing import Any, TYPE_CHECKING
18
19
 
19
20
  import numpy as np
20
21
 
@@ -2,7 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Any, Iterable, Mapping, TYPE_CHECKING
5
+ from collections.abc import Iterable, Mapping
6
+ from typing import Any, TYPE_CHECKING
6
7
 
7
8
  import numpy as np
8
9
 
cirq/ops/named_qubit.py CHANGED
@@ -148,7 +148,7 @@ class NamedQid(_BaseNamedQid):
148
148
 
149
149
  @staticmethod
150
150
  def range(*args, prefix: str, dimension: int) -> list[NamedQid]:
151
- """Returns a range of ``NamedQid``\\s.
151
+ """Returns a range of ``NamedQid``s.
152
152
 
153
153
  The range returned starts with the prefix, and followed by a qid for
154
154
  each number in the range, e.g.:
@@ -166,7 +166,7 @@ class NamedQid(_BaseNamedQid):
166
166
  dimension: The dimension of the qid's Hilbert space, i.e.
167
167
  the number of quantum levels.
168
168
  Returns:
169
- A list of ``NamedQid``\\s.
169
+ A list of ``NamedQid``s.
170
170
  """
171
171
  return [NamedQid(f"{prefix}{i}", dimension=dimension) for i in range(*args)]
172
172
 
cirq/ops/op_tree.py CHANGED
@@ -16,7 +16,8 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Callable, Iterable, Iterator, NoReturn, TYPE_CHECKING
19
+ from collections.abc import Callable, Iterable, Iterator
20
+ from typing import NoReturn, TYPE_CHECKING
20
21
 
21
22
  from cirq._doc import document
22
23
  from cirq._import import LazyLoader
cirq/ops/parallel_gate.py CHANGED
@@ -14,8 +14,9 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Set
17
18
  from types import NotImplementedType
18
- from typing import AbstractSet, Any, TYPE_CHECKING
19
+ from typing import Any, TYPE_CHECKING
19
20
 
20
21
  import numpy as np
21
22
 
@@ -90,7 +91,7 @@ class ParallelGate(raw_types.Gate):
90
91
  def _is_parameterized_(self) -> bool:
91
92
  return protocols.is_parameterized(self.sub_gate)
92
93
 
93
- def _parameter_names_(self) -> AbstractSet[str]:
94
+ def _parameter_names_(self) -> Set[str]:
94
95
  return protocols.parameter_names(self.sub_gate)
95
96
 
96
97
  def _resolve_parameters_(self, resolver: cirq.ParamResolver, recursive: bool) -> ParallelGate:
cirq/ops/parity_gates.py CHANGED
@@ -16,7 +16,8 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Any, Iterator, Self, Sequence, TYPE_CHECKING
19
+ from collections.abc import Iterator, Sequence
20
+ from typing import Any, Self, TYPE_CHECKING
20
21
 
21
22
  import numpy as np
22
23
 
@@ -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
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, cast, Iterable, Iterator, Mapping, Sequence, TYPE_CHECKING
17
+ from collections.abc import Iterable, Iterator, Mapping, Sequence
18
+ from typing import Any, cast, TYPE_CHECKING
18
19
 
19
20
  from cirq import protocols, value
20
21
  from cirq.ops import (
cirq/ops/pauli_string.py CHANGED
@@ -17,25 +17,19 @@ from __future__ import annotations
17
17
  import cmath
18
18
  import math
19
19
  import numbers
20
- from types import NotImplementedType
21
- from typing import (
22
- AbstractSet,
23
- Any,
20
+ from collections.abc import (
24
21
  Callable,
25
- cast,
26
- Generic,
27
22
  ItemsView,
28
23
  Iterable,
29
24
  Iterator,
30
25
  KeysView,
31
26
  Mapping,
32
- overload,
33
27
  Sequence,
34
- TYPE_CHECKING,
35
- TypeVar,
36
- Union,
28
+ Set,
37
29
  ValuesView,
38
30
  )
31
+ from types import NotImplementedType
32
+ from typing import Any, cast, Generic, overload, TYPE_CHECKING, TypeVar, Union
39
33
 
40
34
  import numpy as np
41
35
  import sympy
@@ -1040,7 +1034,7 @@ class PauliString(raw_types.Operation, Generic[TKey]):
1040
1034
  def _is_parameterized_(self) -> bool:
1041
1035
  return protocols.is_parameterized(self.coefficient)
1042
1036
 
1043
- def _parameter_names_(self) -> AbstractSet[str]:
1037
+ def _parameter_names_(self) -> Set[str]:
1044
1038
  return protocols.parameter_names(self.coefficient)
1045
1039
 
1046
1040
  def _resolve_parameters_(
@@ -1233,7 +1227,7 @@ class MutablePauliString(Generic[TKey]):
1233
1227
  return sign
1234
1228
  return -sign
1235
1229
 
1236
- def keys(self) -> AbstractSet[TKey]:
1230
+ def keys(self) -> Set[TKey]:
1237
1231
  """Returns the sequence of qubits on which this pauli string acts."""
1238
1232
  return self.pauli_int_dict.keys()
1239
1233
 
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import numbers
18
- from typing import AbstractSet, cast, Iterable, Iterator, Sequence, TYPE_CHECKING
18
+ from collections.abc import Iterable, Iterator, Sequence, Set
19
+ from typing import cast, TYPE_CHECKING
19
20
 
20
21
  from cirq import protocols, value
21
22
  from cirq._compat import deprecated, proper_repr
@@ -388,7 +389,7 @@ class PauliStringPhasorGate(raw_types.Gate):
388
389
  self.exponent_pos
389
390
  )
390
391
 
391
- def _parameter_names_(self) -> AbstractSet[str]:
392
+ def _parameter_names_(self) -> Set[str]:
392
393
  return protocols.parameter_names(self.exponent_neg) | protocols.parameter_names(
393
394
  self.exponent_pos
394
395
  )
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import abc
18
- from typing import Any, Self, Sequence, TYPE_CHECKING
18
+ from collections.abc import Sequence
19
+ from typing import Any, Self, TYPE_CHECKING
19
20
 
20
21
  from cirq import protocols
21
22
  from cirq.ops import pauli_string as ps, raw_types
@@ -16,7 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import itertools
18
18
  import math
19
- from typing import Iterator
19
+ from collections.abc import Iterator
20
20
 
21
21
  import numpy as np
22
22
  import pytest
@@ -1191,7 +1191,7 @@ def test_expectation_from_density_matrix_invalid_input() -> None:
1191
1191
  with pytest.raises(ValueError, match='shape'):
1192
1192
  ps.expectation_from_density_matrix(rho.reshape((4, 4, 1)), q_map_2)
1193
1193
  with pytest.raises(ValueError, match='shape'):
1194
- ps.expectation_from_density_matrix(rho.reshape((-1)), q_map_2)
1194
+ ps.expectation_from_density_matrix(rho.reshape((-1,)), q_map_2)
1195
1195
 
1196
1196
  # Correctly shaped state_vectors.
1197
1197
  with pytest.raises(ValueError, match='shape'):
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Iterator, TYPE_CHECKING
17
+ from collections.abc import Iterator
18
+ from typing import Any, TYPE_CHECKING
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 Any, Iterator, Sequence, TYPE_CHECKING
17
+ from collections.abc import Iterator, Sequence
18
+ from typing import Any, TYPE_CHECKING
18
19
 
19
20
  from cirq import protocols, value
20
21
  from cirq.ops import raw_types, swap_gates
@@ -15,7 +15,8 @@
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
- from typing import AbstractSet, Any, cast, Iterator, Sequence
18
+ from collections.abc import Iterator, Sequence, Set
19
+ from typing import Any, cast
19
20
 
20
21
  import numpy as np
21
22
  import sympy
@@ -108,7 +109,7 @@ class PhasedISwapPowGate(eigen_gate.EigenGate):
108
109
  self._phase_exponent
109
110
  )
110
111
 
111
- def _parameter_names_(self) -> AbstractSet[str]:
112
+ def _parameter_names_(self) -> Set[str]:
112
113
  return protocols.parameter_names(self._iswap) | protocols.parameter_names(
113
114
  self._phase_exponent
114
115
  )
cirq/ops/phased_x_gate.py CHANGED
@@ -18,8 +18,9 @@ from __future__ import annotations
18
18
 
19
19
  import math
20
20
  import numbers
21
+ from collections.abc import Sequence, Set
21
22
  from types import NotImplementedType
22
- from typing import AbstractSet, Any, cast, Sequence
23
+ from typing import Any, cast
23
24
 
24
25
  import numpy as np
25
26
  import sympy
@@ -166,7 +167,7 @@ class PhasedXPowGate(raw_types.Gate):
166
167
  self._phase_exponent
167
168
  )
168
169
 
169
- def _parameter_names_(self) -> AbstractSet[str]:
170
+ def _parameter_names_(self) -> Set[str]:
170
171
  """See `cirq.SupportsParameterization`."""
171
172
  return protocols.parameter_names(self._exponent) | protocols.parameter_names(
172
173
  self._phase_exponent
@@ -176,12 +177,12 @@ class PhasedXPowGate(raw_types.Gate):
176
177
  """See `cirq.SupportsParameterization`."""
177
178
  phase_exponent = resolver.value_of(self._phase_exponent, recursive)
178
179
  exponent = resolver.value_of(self._exponent, recursive)
179
- if isinstance(phase_exponent, numbers.Complex):
180
+ if not isinstance(phase_exponent, float) and isinstance(phase_exponent, numbers.Complex):
180
181
  if isinstance(phase_exponent, numbers.Real):
181
182
  phase_exponent = float(phase_exponent)
182
183
  else:
183
184
  raise ValueError(f'PhasedXPowGate does not support complex value {phase_exponent}')
184
- if isinstance(exponent, numbers.Complex):
185
+ if not isinstance(exponent, float) and isinstance(exponent, numbers.Complex):
185
186
  if isinstance(exponent, numbers.Real):
186
187
  exponent = float(exponent)
187
188
  else:
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import numbers
18
- from typing import AbstractSet, Any, Iterator, Sequence, TYPE_CHECKING
18
+ from collections.abc import Iterator, Sequence, Set
19
+ from typing import Any, TYPE_CHECKING
19
20
 
20
21
  import numpy as np
21
22
  import sympy
@@ -140,6 +141,10 @@ class PhasedXZGate(raw_types.Gate):
140
141
  return self._axis_phase_exponent
141
142
 
142
143
  def _value_equality_values_(self):
144
+ if self._is_parameterized_():
145
+ # If this is parameterized, do not try to calculate the canonical exponents
146
+ # as this results in some slow sympy operations.
147
+ return (self._x_exponent, self._z_exponent, self._axis_phase_exponent)
143
148
  c = self._canonical()
144
149
  return (
145
150
  value.PeriodicValue(c._x_exponent, 2),
@@ -216,7 +221,7 @@ class PhasedXZGate(raw_types.Gate):
216
221
  or protocols.is_parameterized(self._axis_phase_exponent)
217
222
  )
218
223
 
219
- def _parameter_names_(self) -> AbstractSet[str]:
224
+ def _parameter_names_(self) -> Set[str]:
220
225
  """See `cirq.SupportsParameterization`."""
221
226
  return (
222
227
  protocols.parameter_names(self._x_exponent)
@@ -231,17 +236,19 @@ class PhasedXZGate(raw_types.Gate):
231
236
  z_exponent = resolver.value_of(self._z_exponent, recursive)
232
237
  x_exponent = resolver.value_of(self._x_exponent, recursive)
233
238
  axis_phase_exponent = resolver.value_of(self._axis_phase_exponent, recursive)
234
- if isinstance(z_exponent, numbers.Complex):
239
+ if not isinstance(z_exponent, float) and isinstance(z_exponent, numbers.Complex):
235
240
  if isinstance(z_exponent, numbers.Real):
236
241
  z_exponent = float(z_exponent)
237
242
  else:
238
243
  raise ValueError(f'Complex exponent {z_exponent} not allowed in cirq.PhasedXZGate')
239
- if isinstance(x_exponent, numbers.Complex):
244
+ if not isinstance(x_exponent, float) and isinstance(x_exponent, numbers.Complex):
240
245
  if isinstance(x_exponent, numbers.Real):
241
246
  x_exponent = float(x_exponent)
242
247
  else:
243
248
  raise ValueError(f'Complex exponent {x_exponent} not allowed in cirq.PhasedXZGate')
244
- if isinstance(axis_phase_exponent, numbers.Complex):
249
+ if not isinstance(axis_phase_exponent, float) and isinstance(
250
+ axis_phase_exponent, numbers.Complex
251
+ ):
245
252
  if isinstance(axis_phase_exponent, numbers.Real):
246
253
  axis_phase_exponent = float(axis_phase_exponent)
247
254
  else:
cirq/ops/projector.py CHANGED
@@ -4,7 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  import itertools
6
6
  import math
7
- from typing import Any, Iterable, Mapping, TYPE_CHECKING
7
+ from collections.abc import Iterable, Mapping
8
+ from typing import Any, TYPE_CHECKING
8
9
 
9
10
  import numpy as np
10
11
  from scipy.sparse import csr_matrix
cirq/ops/qubit_manager.py CHANGED
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import abc
18
18
  import dataclasses
19
- from typing import Iterable, TYPE_CHECKING
19
+ from collections.abc import Iterable
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from cirq.ops import raw_types
22
23
 
cirq/ops/qubit_order.py CHANGED
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Callable, Iterable, TYPE_CHECKING, TypeVar
17
+ from collections.abc import Callable, Iterable
18
+ from typing import Any, TYPE_CHECKING, TypeVar
18
19
 
19
20
  if TYPE_CHECKING:
20
21
  import cirq
@@ -20,7 +20,7 @@ mypy.
20
20
 
21
21
  from __future__ import annotations
22
22
 
23
- from typing import Iterable
23
+ from collections.abc import Iterable
24
24
 
25
25
  from cirq._doc import document
26
26
  from cirq.ops import qubit_order, raw_types
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import numbers
18
- from typing import AbstractSet, Any, cast, SupportsFloat, TYPE_CHECKING
18
+ from collections.abc import Set
19
+ from typing import Any, cast, SupportsFloat, TYPE_CHECKING
19
20
 
20
21
  import numpy as np
21
22
 
@@ -74,7 +75,7 @@ class RandomGateChannel(raw_types.Gate):
74
75
  self.sub_gate
75
76
  )
76
77
 
77
- def _parameter_names_(self) -> AbstractSet[str]:
78
+ def _parameter_names_(self) -> Set[str]:
78
79
  return protocols.parameter_names(self.probability) | protocols.parameter_names(
79
80
  self.sub_gate
80
81
  )