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 Collection, Sequence
17
+ from collections.abc import Collection, Sequence
18
18
 
19
19
  import numpy as np
20
20
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Collection, Sequence, TYPE_CHECKING
17
+ from collections.abc import Collection, Sequence
18
+ from typing import TYPE_CHECKING
18
19
 
19
20
  import numpy as np
20
21
  import pytest
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import itertools
18
- from typing import Any, Sequence
18
+ from collections.abc import Sequence
19
+ from typing import Any
19
20
 
20
21
  import numpy as np
21
22
  import sympy
@@ -14,8 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Sequence, Set
17
18
  from types import NotImplementedType
18
- from typing import AbstractSet, Sequence
19
19
 
20
20
  import numpy as np
21
21
  import pytest
@@ -100,7 +100,7 @@ class GoodGate(cirq.testing.SingleQubitGate):
100
100
  def _is_parameterized_(self) -> bool:
101
101
  return cirq.is_parameterized(self.exponent) or cirq.is_parameterized(self.phase_exponent)
102
102
 
103
- def _parameter_names_(self) -> AbstractSet[str]:
103
+ def _parameter_names_(self) -> Set[str]:
104
104
  return cirq.parameter_names(self.exponent) | cirq.parameter_names(self.phase_exponent)
105
105
 
106
106
  def _resolve_parameters_(self, resolver, recursive) -> GoodGate:
@@ -124,7 +124,7 @@ class BadGateIsParameterized(GoodGate):
124
124
 
125
125
 
126
126
  class BadGateParameterNames(GoodGate):
127
- def _parameter_names_(self) -> AbstractSet[str]:
127
+ def _parameter_names_(self) -> Set[str]:
128
128
  return super()._parameter_names_() | {'not_a_param'}
129
129
 
130
130
 
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import warnings
18
- from typing import Any, Sequence
18
+ from collections.abc import Sequence
19
+ from typing import Any
19
20
 
20
21
  import numpy as np
21
22
 
@@ -21,7 +21,7 @@ import sympy
21
21
  import cirq
22
22
 
23
23
 
24
- def assert_consistent_resolve_parameters(val: Any):
24
+ def assert_consistent_resolve_parameters(val: Any) -> None:
25
25
  names = cirq.parameter_names(val)
26
26
  symbols = cirq.parameter_symbols(val)
27
27
 
@@ -21,7 +21,7 @@ import numpy as np
21
21
  import cirq
22
22
 
23
23
 
24
- def assert_unitary_is_consistent(val: Any, ignoring_global_phase: bool = False):
24
+ def assert_unitary_is_consistent(val: Any, ignoring_global_phase: bool = False) -> None:
25
25
  if not isinstance(val, (cirq.Operation, cirq.Gate)):
26
26
  return
27
27
 
@@ -95,4 +95,4 @@ def test_failed_decomposition() -> None:
95
95
  with pytest.raises(ValueError):
96
96
  cirq.testing.assert_unitary_is_consistent(FailsOnDecompostion())
97
97
 
98
- _ = cirq.testing.assert_unitary_is_consistent(cirq.Circuit())
98
+ cirq.testing.assert_unitary_is_consistent(cirq.Circuit())
@@ -17,7 +17,7 @@ from __future__ import annotations
17
17
  import contextlib
18
18
  import logging
19
19
  import os
20
- from typing import Iterator
20
+ from collections.abc import Iterator
21
21
 
22
22
  from cirq._compat import ALLOW_DEPRECATION_IN_TEST
23
23
 
cirq/testing/devices.py CHANGED
@@ -15,7 +15,8 @@
15
15
  """Provides test devices that can validate circuits."""
16
16
  from __future__ import annotations
17
17
 
18
- from typing import AbstractSet, cast
18
+ from collections.abc import Set
19
+ from typing import cast
19
20
 
20
21
  from cirq import devices, ops
21
22
 
@@ -38,7 +39,7 @@ class ValidatingTestDevice(devices.Device):
38
39
 
39
40
  def __init__(
40
41
  self,
41
- qubits: AbstractSet[ops.Qid],
42
+ qubits: Set[ops.Qid],
42
43
  name: str = "ValidatingTestDevice",
43
44
  allowed_gates: tuple[type, ...] = (ops.Gate,),
44
45
  allowed_qubit_types: tuple[type, ...] = (devices.GridQubit,),
@@ -24,7 +24,8 @@ from __future__ import annotations
24
24
 
25
25
  import collections
26
26
  import itertools
27
- from typing import Any, Callable
27
+ from collections.abc import Callable
28
+ from typing import Any
28
29
 
29
30
 
30
31
  class EqualsTester:
@@ -93,7 +94,7 @@ class EqualsTester:
93
94
  "Common problem: returning NotImplementedError instead of NotImplemented. "
94
95
  )
95
96
 
96
- def add_equality_group(self, *group_items: Any):
97
+ def add_equality_group(self, *group_items: Any) -> None:
97
98
  """Tries to add a disjoint equivalence group to the equality tester.
98
99
 
99
100
  This methods asserts that items within the group must all be equal to
@@ -114,7 +115,7 @@ class EqualsTester:
114
115
  # Remember this group, to enable disjoint checks vs later groups.
115
116
  self._groups.append(group_items)
116
117
 
117
- def make_equality_group(self, *factories: Callable[[], Any]):
118
+ def make_equality_group(self, *factories: Callable[[], Any]) -> None:
118
119
  """Tries to add a disjoint equivalence group to the equality tester.
119
120
 
120
121
  Uses the factory methods to produce two different objects with the same
@@ -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
 
@@ -22,7 +22,9 @@ import cirq
22
22
  from cirq import circuits
23
23
 
24
24
 
25
- def assert_equivalent_computational_basis_map(maps: dict[int, int], circuit: circuits.Circuit):
25
+ def assert_equivalent_computational_basis_map(
26
+ maps: dict[int, int], circuit: circuits.Circuit
27
+ ) -> None:
26
28
  """Ensure equivalence of basis state mapping.
27
29
 
28
30
  Args:
cirq/testing/json.py CHANGED
@@ -18,9 +18,10 @@ import dataclasses
18
18
  import inspect
19
19
  import io
20
20
  import pathlib
21
+ from collections.abc import Iterator
21
22
  from dataclasses import dataclass
22
23
  from types import ModuleType
23
- from typing import Iterator, TYPE_CHECKING
24
+ from typing import TYPE_CHECKING
24
25
 
25
26
  import numpy as np
26
27
  import pandas as pd
@@ -149,7 +150,7 @@ def spec_for(module_name: str) -> ModuleJsonTestSpec:
149
150
  return getattr(test_module, "TestSpec")
150
151
 
151
152
 
152
- def assert_json_roundtrip_works(obj, text_should_be=None, resolvers=None):
153
+ def assert_json_roundtrip_works(obj, text_should_be=None, resolvers=None) -> None:
153
154
  """Tests that the given object can serialized and de-serialized
154
155
 
155
156
  Args:
cirq/testing/logs.py CHANGED
@@ -18,7 +18,7 @@ from __future__ import annotations
18
18
 
19
19
  import contextlib
20
20
  import logging
21
- from typing import Iterator
21
+ from collections.abc import Iterator
22
22
 
23
23
 
24
24
  @contextlib.contextmanager
cirq/testing/op_tree.py CHANGED
@@ -17,7 +17,7 @@ from __future__ import annotations
17
17
  from cirq import ops
18
18
 
19
19
 
20
- def assert_equivalent_op_tree(x: ops.OP_TREE, y: ops.OP_TREE):
20
+ def assert_equivalent_op_tree(x: ops.OP_TREE, y: ops.OP_TREE) -> None:
21
21
  """Ensures that the two OP_TREEs are equivalent.
22
22
 
23
23
  Args:
@@ -78,7 +78,7 @@ class OrderTester:
78
78
  f"That rule is being violated by this value: {item!r}"
79
79
  ) from ex
80
80
 
81
- def add_ascending(self, *items: Any):
81
+ def add_ascending(self, *items: Any) -> None:
82
82
  """Tries to add a sequence of ascending items to the order tester.
83
83
 
84
84
  This methods asserts that items must all be ascending
@@ -98,7 +98,7 @@ class OrderTester:
98
98
  for item in items:
99
99
  self.add_ascending_equivalence_group(item)
100
100
 
101
- def add_ascending_equivalence_group(self, *group_items: Any):
101
+ def add_ascending_equivalence_group(self, *group_items: Any) -> None:
102
102
  """Tries to add an ascending equivalence group to the order tester.
103
103
 
104
104
  Asserts that the group items are equal to each other, but strictly
@@ -18,7 +18,8 @@ from __future__ import annotations
18
18
 
19
19
  import functools
20
20
  import warnings
21
- from typing import Any, Callable
21
+ from collections.abc import Callable
22
+ from typing import Any
22
23
 
23
24
 
24
25
  def retry_once_after_timeout(testfunc: Callable) -> Callable:
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Sequence, TYPE_CHECKING
17
+ from collections.abc import Sequence
18
+ from typing import TYPE_CHECKING
18
19
 
19
20
  from cirq import circuits, ops, value
20
21
  from cirq._doc import document
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import random
18
- from typing import cast, Sequence
18
+ from collections.abc import Sequence
19
+ from typing import cast
19
20
 
20
21
  import numpy as np
21
22
  import pytest
@@ -34,11 +34,11 @@ class FakePrinter:
34
34
  def __init__(self):
35
35
  self.text_pretty = ""
36
36
 
37
- def text(self, to_print):
37
+ def text(self, to_print) -> None:
38
38
  self.text_pretty += to_print
39
39
 
40
40
 
41
- def assert_repr_pretty(val: Any, text: str, cycle: bool = False):
41
+ def assert_repr_pretty(val: Any, text: str, cycle: bool = False) -> None:
42
42
  """Assert that the given object has a `_repr_pretty_` method that produces the given text.
43
43
 
44
44
  Args:
@@ -57,7 +57,7 @@ def assert_repr_pretty(val: Any, text: str, cycle: bool = False):
57
57
  assert p.text_pretty == text, f"{p.text_pretty} != {text}"
58
58
 
59
59
 
60
- def assert_repr_pretty_contains(val: Any, substr: str, cycle: bool = False):
60
+ def assert_repr_pretty_contains(val: Any, substr: str, cycle: bool = False) -> None:
61
61
  """Assert that the given object has a `_repr_pretty_` output that contains the given text.
62
62
 
63
63
  Args:
@@ -150,6 +150,7 @@ from cirq.transformers.gauge_compiling import (
150
150
  SpinInversionGaugeTransformer as SpinInversionGaugeTransformer,
151
151
  SqrtCZGaugeTransformer as SqrtCZGaugeTransformer,
152
152
  SqrtISWAPGaugeTransformer as SqrtISWAPGaugeTransformer,
153
+ CPhaseGaugeTransformerMM as CPhaseGaugeTransformerMM,
153
154
  )
154
155
 
155
156
  from cirq.transformers.randomized_measurements import (
@@ -0,0 +1,231 @@
1
+ # Copyright 2025 The Cirq Developers
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Defines a connected component of operations, to be used in merge transformers."""
16
+
17
+ from __future__ import annotations
18
+
19
+ from collections.abc import Callable, Sequence
20
+ from typing import cast, TYPE_CHECKING
21
+
22
+ from scipy.cluster.hierarchy import DisjointSet
23
+
24
+ from cirq import ops, protocols
25
+
26
+ if TYPE_CHECKING:
27
+ import cirq
28
+
29
+
30
+ class Component:
31
+ """Internal representation for a connected component of operations."""
32
+
33
+ # Circuit moment containing the component
34
+ moment_id: int
35
+ # Union of all op qubits in the component
36
+ qubits: frozenset[cirq.Qid]
37
+ # Union of all measurement keys in the component
38
+ mkeys: frozenset[cirq.MeasurementKey]
39
+ # Union of all control keys in the component
40
+ ckeys: frozenset[cirq.MeasurementKey]
41
+ # Initial operation in the component
42
+ op: cirq.Operation
43
+
44
+ # True if the component can be merged with other components
45
+ is_mergeable: bool
46
+
47
+ def __init__(self, op: cirq.Operation, moment_id: int, is_mergeable=True):
48
+ """Initializes a singleton component."""
49
+ self.op = op
50
+ self.is_mergeable = is_mergeable
51
+ self.moment_id = moment_id
52
+ self.qubits = frozenset(op.qubits)
53
+ self.mkeys = protocols.measurement_key_objs(op)
54
+ self.ckeys = protocols.control_keys(op)
55
+
56
+
57
+ class ComponentWithOps(Component):
58
+ """Component that keeps track of operations."""
59
+
60
+ # List of all operations in the component
61
+ ops: list[cirq.Operation]
62
+
63
+ def __init__(self, op: cirq.Operation, moment_id: int, is_mergeable=True):
64
+ super().__init__(op, moment_id, is_mergeable)
65
+ self.ops = [op]
66
+
67
+
68
+ class ComponentWithCircuitOp(Component):
69
+ """Component that keeps track of operations as a CircuitOperation."""
70
+
71
+ # CircuitOperation containing all the operations in the component,
72
+ # or a single Operation if the component is a singleton
73
+ circuit_op: cirq.Operation
74
+
75
+ def __init__(self, op: cirq.Operation, moment_id: int, is_mergeable=True):
76
+ super().__init__(op, moment_id, is_mergeable)
77
+ self.circuit_op = op
78
+
79
+
80
+ class ComponentSet:
81
+ """Represents a set of mergeable components of operations."""
82
+
83
+ _comp_type: type[Component]
84
+
85
+ _disjoint_set: DisjointSet
86
+
87
+ # Callable to decide if a component is mergeable
88
+ _is_mergeable: Callable[[cirq.Operation], bool]
89
+
90
+ # List of components in creation order
91
+ _components: list[Component]
92
+
93
+ def __init__(self, is_mergeable: Callable[[cirq.Operation], bool]):
94
+ self._is_mergeable = is_mergeable
95
+ self._disjoint_set = DisjointSet()
96
+ self._components = []
97
+ self._comp_type = Component
98
+
99
+ def new_component(self, op: cirq.Operation, moment_id: int, is_mergeable=True) -> Component:
100
+ """Creates a new component and adds it to the set."""
101
+ c = self._comp_type(op, moment_id, is_mergeable and self._is_mergeable(op))
102
+ self._disjoint_set.add(c)
103
+ self._components.append(c)
104
+ return c
105
+
106
+ def components(self) -> list[Component]:
107
+ """Returns the initial components in creation order."""
108
+ return self._components
109
+
110
+ def find(self, x: Component) -> Component:
111
+ """Finds the representative for a merged component."""
112
+ return self._disjoint_set[x]
113
+
114
+ def merge(self, x: Component, y: Component, merge_left=True) -> Component | None:
115
+ """Attempts to merge two components.
116
+
117
+ If merge_left is True, y is merged into x, and the representative will keep
118
+ y's moment. If merge_left is False, x is merged into y, and the representative
119
+ will keep y's moment.
120
+
121
+ Args:
122
+ x: First component to merge.
123
+ y: Second component to merge.
124
+ merge_left: True to keep x's moment for the merged component, False to
125
+ keep y's moment for the merged component.
126
+
127
+ Returns:
128
+ None, if the components can't be merged.
129
+ Otherwise the new component representative.
130
+ """
131
+ x = self._disjoint_set[x]
132
+ y = self._disjoint_set[y]
133
+
134
+ if not x.is_mergeable or not y.is_mergeable:
135
+ return None
136
+
137
+ if not self._disjoint_set.merge(x, y):
138
+ return x
139
+
140
+ root = self._disjoint_set[x]
141
+ root.moment_id = x.moment_id if merge_left else y.moment_id
142
+ root.qubits = x.qubits.union(y.qubits)
143
+ root.mkeys = x.mkeys.union(y.mkeys)
144
+ root.ckeys = x.ckeys.union(y.ckeys)
145
+
146
+ return root
147
+
148
+
149
+ class ComponentWithOpsSet(ComponentSet):
150
+ """Represents a set of mergeable components, where each component tracks operations."""
151
+
152
+ # Callable that returns if two components can be merged based on their operations
153
+ _can_merge: Callable[[Sequence[cirq.Operation], Sequence[cirq.Operation]], bool]
154
+
155
+ def __init__(
156
+ self,
157
+ is_mergeable: Callable[[cirq.Operation], bool],
158
+ can_merge: Callable[[Sequence[cirq.Operation], Sequence[cirq.Operation]], bool],
159
+ ):
160
+ super().__init__(is_mergeable)
161
+ self._can_merge = can_merge
162
+ self._comp_type = ComponentWithOps
163
+
164
+ def merge(self, x: Component, y: Component, merge_left=True) -> Component | None:
165
+ """Attempts to merge two components.
166
+
167
+ Returns:
168
+ None if can_merge is False or the merge doesn't succeed, otherwise the
169
+ new representative. The representative will have ops = x.ops + y.ops.
170
+ """
171
+ x = cast(ComponentWithOps, self._disjoint_set[x])
172
+ y = cast(ComponentWithOps, self._disjoint_set[y])
173
+
174
+ if x is y:
175
+ return x
176
+
177
+ if not x.is_mergeable or not y.is_mergeable or not self._can_merge(x.ops, y.ops):
178
+ return None
179
+
180
+ root = cast(ComponentWithOps, super().merge(x, y, merge_left))
181
+ root.ops = x.ops + y.ops
182
+ # Clear the ops list in the non-representative component to avoid duplication
183
+ other = y if x is root else x
184
+ other.ops = []
185
+ return root
186
+
187
+
188
+ class ComponentWithCircuitOpSet(ComponentSet):
189
+ """Represents a set of mergeable components, with operations as a CircuitOperation."""
190
+
191
+ # Callable that merges CircuitOperations from two components
192
+ _merge_func: Callable[[ops.Operation, ops.Operation], ops.Operation | None]
193
+
194
+ def __init__(
195
+ self,
196
+ is_mergeable: Callable[[cirq.Operation], bool],
197
+ merge_func: Callable[[ops.Operation, ops.Operation], ops.Operation | None],
198
+ ):
199
+ super().__init__(is_mergeable)
200
+ self._merge_func = merge_func
201
+ self._comp_type = ComponentWithCircuitOp
202
+
203
+ def merge(self, x: Component, y: Component, merge_left=True) -> Component | None:
204
+ """Attempts to merge two components.
205
+
206
+ Returns:
207
+ None if merge_func returns None or the merge doesn't succeed,
208
+ otherwise the new representative.
209
+ """
210
+ x = cast(ComponentWithCircuitOp, self._disjoint_set[x])
211
+ y = cast(ComponentWithCircuitOp, self._disjoint_set[y])
212
+
213
+ if x is y:
214
+ return x
215
+
216
+ if not x.is_mergeable or not y.is_mergeable:
217
+ return None
218
+
219
+ new_op = self._merge_func(x.circuit_op, y.circuit_op)
220
+ if not new_op:
221
+ return None
222
+
223
+ root = cast(ComponentWithCircuitOp, super().merge(x, y, merge_left))
224
+
225
+ root.circuit_op = new_op
226
+ # The merge_func can be arbitrary, so we need to recompute the component properties
227
+ root.qubits = frozenset(new_op.qubits)
228
+ root.mkeys = protocols.measurement_key_objs(new_op)
229
+ root.ckeys = protocols.control_keys(new_op)
230
+
231
+ return root