cirq-core 1.7.0.dev20250825174419__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 (426) 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 +19 -17
  10. cirq/circuits/circuit_operation.py +2 -1
  11. cirq/circuits/circuit_operation_test.py +19 -0
  12. cirq/circuits/circuit_test.py +31 -12
  13. cirq/circuits/frozen_circuit.py +3 -2
  14. cirq/circuits/moment.py +3 -15
  15. cirq/circuits/optimization_pass.py +2 -1
  16. cirq/circuits/qasm_output.py +39 -10
  17. cirq/circuits/qasm_output_test.py +51 -2
  18. cirq/circuits/text_diagram_drawer.py +2 -1
  19. cirq/contrib/acquaintance/bipartite.py +2 -1
  20. cirq/contrib/acquaintance/devices.py +1 -1
  21. cirq/contrib/acquaintance/executor.py +4 -5
  22. cirq/contrib/acquaintance/executor_test.py +2 -1
  23. cirq/contrib/acquaintance/gates.py +2 -1
  24. cirq/contrib/acquaintance/gates_test.py +1 -1
  25. cirq/contrib/acquaintance/inspection_utils.py +2 -1
  26. cirq/contrib/acquaintance/mutation_utils.py +2 -1
  27. cirq/contrib/acquaintance/optimizers.py +2 -1
  28. cirq/contrib/acquaintance/permutation.py +2 -1
  29. cirq/contrib/acquaintance/permutation_test.py +1 -1
  30. cirq/contrib/acquaintance/shift.py +2 -1
  31. cirq/contrib/acquaintance/shift_swap_network.py +2 -1
  32. cirq/contrib/acquaintance/strategies/complete.py +3 -2
  33. cirq/contrib/acquaintance/strategies/cubic.py +2 -1
  34. cirq/contrib/acquaintance/strategies/quartic_paired.py +2 -1
  35. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +1 -1
  36. cirq/contrib/acquaintance/testing.py +2 -1
  37. cirq/contrib/acquaintance/topological_sort.py +2 -1
  38. cirq/contrib/bayesian_network/bayesian_network_gate.py +3 -2
  39. cirq/contrib/circuitdag/circuit_dag.py +4 -2
  40. cirq/contrib/custom_simulators/custom_state_simulator.py +2 -1
  41. cirq/contrib/custom_simulators/custom_state_simulator_test.py +1 -1
  42. cirq/contrib/graph_device/graph_device.py +2 -1
  43. cirq/contrib/graph_device/graph_device_test.py +2 -1
  44. cirq/contrib/graph_device/hypergraph.py +2 -1
  45. cirq/contrib/graph_device/uniform_graph_device.py +2 -1
  46. cirq/contrib/json.py +14 -2
  47. cirq/contrib/json_test_data/BayesianNetworkGate.json +10 -0
  48. cirq/contrib/json_test_data/BayesianNetworkGate.repr +3 -0
  49. cirq/contrib/json_test_data/QuantumVolumeResult.json +169 -0
  50. cirq/contrib/json_test_data/QuantumVolumeResult.repr +22 -0
  51. cirq/contrib/json_test_data/SwapPermutationGate.json +3 -0
  52. cirq/contrib/json_test_data/SwapPermutationGate.repr +1 -0
  53. cirq/contrib/json_test_data/spec.py +0 -2
  54. cirq/contrib/noise_models/noise_models.py +2 -1
  55. cirq/contrib/paulistring/clifford_optimize.py +20 -2
  56. cirq/contrib/paulistring/optimize.py +1 -1
  57. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +146 -35
  58. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +81 -178
  59. cirq/contrib/paulistring/recombine.py +5 -2
  60. cirq/contrib/paulistring/separate.py +1 -1
  61. cirq/contrib/qasm_import/_lexer.py +6 -1
  62. cirq/contrib/qasm_import/_lexer_test.py +1 -1
  63. cirq/contrib/qasm_import/_parser.py +24 -8
  64. cirq/contrib/qasm_import/_parser_test.py +44 -6
  65. cirq/contrib/qcircuit/qcircuit_pdf_test.py +6 -9
  66. cirq/contrib/quantikz/__init__.py +21 -0
  67. cirq/contrib/quantikz/circuit_to_latex_quantikz.py +680 -0
  68. cirq/contrib/quantikz/circuit_to_latex_quantikz_test.py +253 -0
  69. cirq/contrib/quantikz/circuit_to_latex_render.py +424 -0
  70. cirq/contrib/quantikz/circuit_to_latex_render_test.py +44 -0
  71. cirq/contrib/quantum_volume/quantum_volume.py +2 -1
  72. cirq/contrib/quimb/density_matrix.py +1 -1
  73. cirq/contrib/quimb/grid_circuits.py +2 -1
  74. cirq/contrib/quimb/grid_circuits_test.py +1 -1
  75. cirq/contrib/quimb/mps_simulator.py +4 -3
  76. cirq/contrib/quimb/state_vector.py +2 -1
  77. cirq/contrib/quirk/export_to_quirk.py +2 -1
  78. cirq/contrib/quirk/linearize_circuit.py +1 -1
  79. cirq/contrib/quirk/quirk_gate.py +2 -1
  80. cirq/contrib/routing/device.py +1 -1
  81. cirq/contrib/routing/greedy.py +2 -1
  82. cirq/contrib/routing/initialization.py +2 -1
  83. cirq/contrib/routing/router.py +2 -1
  84. cirq/contrib/routing/swap_network.py +2 -1
  85. cirq/contrib/routing/utils.py +2 -1
  86. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +7 -5
  87. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +6 -6
  88. cirq/devices/device.py +2 -1
  89. cirq/devices/grid_device_metadata.py +2 -1
  90. cirq/devices/grid_qubit.py +7 -6
  91. cirq/devices/insertion_noise_model.py +2 -1
  92. cirq/devices/line_qubit.py +2 -1
  93. cirq/devices/named_topologies.py +2 -1
  94. cirq/devices/noise_model.py +2 -1
  95. cirq/devices/noise_model_test.py +1 -1
  96. cirq/devices/noise_properties.py +2 -1
  97. cirq/devices/superconducting_qubits_noise_properties_test.py +2 -1
  98. cirq/devices/thermal_noise_model.py +2 -1
  99. cirq/experiments/__init__.py +2 -0
  100. cirq/experiments/benchmarking/parallel_xeb.py +2 -1
  101. cirq/experiments/benchmarking/parallel_xeb_test.py +1 -1
  102. cirq/experiments/fidelity_estimation.py +2 -1
  103. cirq/experiments/fidelity_estimation_test.py +1 -1
  104. cirq/experiments/ghz_2d.py +150 -0
  105. cirq/experiments/ghz_2d_test.py +155 -0
  106. cirq/experiments/n_qubit_tomography.py +2 -1
  107. cirq/experiments/n_qubit_tomography_test.py +1 -1
  108. cirq/experiments/purity_estimation.py +1 -1
  109. cirq/experiments/qubit_characterizations.py +33 -4
  110. cirq/experiments/qubit_characterizations_test.py +16 -0
  111. cirq/experiments/random_quantum_circuit_generation.py +2 -1
  112. cirq/experiments/random_quantum_circuit_generation_test.py +2 -1
  113. cirq/experiments/readout_confusion_matrix.py +2 -1
  114. cirq/experiments/readout_confusion_matrix_test.py +1 -1
  115. cirq/experiments/single_qubit_readout_calibration.py +2 -1
  116. cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
  117. cirq/experiments/t1_decay_experiment.py +2 -1
  118. cirq/experiments/two_qubit_xeb.py +2 -1
  119. cirq/experiments/two_qubit_xeb_test.py +1 -1
  120. cirq/experiments/xeb_fitting.py +2 -1
  121. cirq/experiments/xeb_fitting_test.py +1 -1
  122. cirq/experiments/xeb_sampling.py +5 -3
  123. cirq/experiments/xeb_sampling_test.py +1 -1
  124. cirq/experiments/xeb_simulation.py +2 -1
  125. cirq/experiments/xeb_simulation_test.py +2 -1
  126. cirq/experiments/z_phase_calibration.py +2 -1
  127. cirq/experiments/z_phase_calibration_test.py +18 -3
  128. cirq/interop/quirk/cells/__init__.py +1 -2
  129. cirq/interop/quirk/cells/all_cells.py +2 -1
  130. cirq/interop/quirk/cells/arithmetic_cells.py +2 -1
  131. cirq/interop/quirk/cells/cell.py +2 -1
  132. cirq/interop/quirk/cells/composite_cell.py +2 -1
  133. cirq/interop/quirk/cells/composite_cell_test.py +1 -1
  134. cirq/interop/quirk/cells/control_cells.py +2 -1
  135. cirq/interop/quirk/cells/frequency_space_cells.py +1 -1
  136. cirq/interop/quirk/cells/ignored_cells.py +1 -1
  137. cirq/interop/quirk/cells/input_cells.py +2 -1
  138. cirq/interop/quirk/cells/input_rotation_cells.py +2 -1
  139. cirq/interop/quirk/cells/measurement_cells.py +2 -1
  140. cirq/interop/quirk/cells/parse.py +2 -11
  141. cirq/interop/quirk/cells/qubit_permutation_cells.py +2 -1
  142. cirq/interop/quirk/cells/scalar_cells.py +2 -1
  143. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +2 -1
  144. cirq/interop/quirk/cells/swap_cell.py +2 -1
  145. cirq/interop/quirk/cells/unsupported_cells.py +1 -1
  146. cirq/interop/quirk/url_to_circuit.py +2 -1
  147. cirq/json_resolver_cache.py +0 -2
  148. cirq/linalg/decompositions.py +6 -2
  149. cirq/linalg/decompositions_test.py +1 -0
  150. cirq/linalg/diagonalize.py +1 -1
  151. cirq/linalg/predicates.py +2 -1
  152. cirq/linalg/tolerance.py +2 -1
  153. cirq/linalg/transformations.py +3 -2
  154. cirq/ops/arithmetic_operation.py +4 -3
  155. cirq/ops/arithmetic_operation_test.py +1 -1
  156. cirq/ops/boolean_hamiltonian.py +4 -3
  157. cirq/ops/classically_controlled_operation.py +11 -11
  158. cirq/ops/classically_controlled_operation_test.py +26 -2
  159. cirq/ops/clifford_gate.py +3 -2
  160. cirq/ops/clifford_gate_test.py +1 -2
  161. cirq/ops/common_channels.py +2 -1
  162. cirq/ops/common_gates.py +3 -2
  163. cirq/ops/control_values.py +2 -1
  164. cirq/ops/controlled_gate.py +3 -2
  165. cirq/ops/controlled_gate_test.py +2 -1
  166. cirq/ops/controlled_operation.py +3 -2
  167. cirq/ops/controlled_operation_test.py +2 -1
  168. cirq/ops/dense_pauli_string.py +44 -81
  169. cirq/ops/dense_pauli_string_test.py +21 -0
  170. cirq/ops/diagonal_gate.py +3 -2
  171. cirq/ops/eigen_gate.py +9 -7
  172. cirq/ops/fourier_transform.py +3 -2
  173. cirq/ops/fourier_transform_test.py +2 -4
  174. cirq/ops/fsim_gate.py +3 -2
  175. cirq/ops/gate_operation.py +23 -12
  176. cirq/ops/gateset.py +22 -2
  177. cirq/ops/global_phase_op.py +3 -2
  178. cirq/ops/greedy_qubit_manager.py +2 -1
  179. cirq/ops/identity.py +2 -1
  180. cirq/ops/kraus_channel.py +2 -1
  181. cirq/ops/linear_combinations.py +12 -17
  182. cirq/ops/linear_combinations_test.py +23 -1
  183. cirq/ops/matrix_gates.py +2 -1
  184. cirq/ops/measure_util.py +8 -6
  185. cirq/ops/measurement_gate.py +2 -1
  186. cirq/ops/mixed_unitary_channel.py +2 -1
  187. cirq/ops/named_qubit.py +2 -2
  188. cirq/ops/op_tree.py +2 -1
  189. cirq/ops/parallel_gate.py +3 -2
  190. cirq/ops/parity_gates.py +2 -1
  191. cirq/ops/parity_gates_test.py +35 -0
  192. cirq/ops/pauli_interaction_gate.py +2 -1
  193. cirq/ops/pauli_measurement_gate.py +2 -1
  194. cirq/ops/pauli_string.py +37 -57
  195. cirq/ops/pauli_string_phasor.py +6 -5
  196. cirq/ops/pauli_string_raw_types.py +2 -1
  197. cirq/ops/pauli_string_test.py +49 -6
  198. cirq/ops/pauli_sum_exponential.py +2 -1
  199. cirq/ops/permutation_gate.py +2 -1
  200. cirq/ops/phased_iswap_gate.py +3 -2
  201. cirq/ops/phased_x_gate.py +5 -4
  202. cirq/ops/phased_x_z_gate.py +12 -5
  203. cirq/ops/projector.py +2 -1
  204. cirq/ops/qubit_manager.py +2 -1
  205. cirq/ops/qubit_order.py +2 -1
  206. cirq/ops/qubit_order_or_list.py +1 -1
  207. cirq/ops/random_gate_channel.py +3 -2
  208. cirq/ops/raw_types.py +33 -16
  209. cirq/ops/raw_types_test.py +4 -3
  210. cirq/ops/state_preparation_channel.py +2 -1
  211. cirq/ops/three_qubit_gates.py +3 -2
  212. cirq/ops/two_qubit_diagonal_gate.py +3 -2
  213. cirq/ops/uniform_superposition_gate.py +2 -1
  214. cirq/ops/wait_gate.py +10 -4
  215. cirq/protocols/act_on_protocol.py +2 -1
  216. cirq/protocols/act_on_protocol_test.py +2 -1
  217. cirq/protocols/apply_channel_protocol.py +2 -1
  218. cirq/protocols/apply_mixture_protocol.py +2 -1
  219. cirq/protocols/apply_mixture_protocol_test.py +2 -1
  220. cirq/protocols/apply_unitary_protocol.py +2 -1
  221. cirq/protocols/apply_unitary_protocol_test.py +2 -0
  222. cirq/protocols/approximate_equality_protocol.py +2 -1
  223. cirq/protocols/circuit_diagram_info_protocol.py +2 -1
  224. cirq/protocols/control_key_protocol.py +7 -0
  225. cirq/protocols/decompose_protocol.py +2 -12
  226. cirq/protocols/has_stabilizer_effect_protocol.py +1 -1
  227. cirq/protocols/has_stabilizer_effect_protocol_test.py +11 -9
  228. cirq/protocols/has_unitary_protocol_test.py +3 -3
  229. cirq/protocols/hash_from_pickle_test.py +2 -2
  230. cirq/protocols/inverse_protocol.py +2 -1
  231. cirq/protocols/json_serialization.py +5 -4
  232. cirq/protocols/json_serialization_test.py +31 -31
  233. cirq/protocols/kraus_protocol.py +4 -3
  234. cirq/protocols/kraus_protocol_test.py +7 -7
  235. cirq/protocols/measurement_key_protocol.py +32 -8
  236. cirq/protocols/mixture_protocol.py +3 -2
  237. cirq/protocols/mixture_protocol_test.py +7 -7
  238. cirq/protocols/mul_protocol_test.py +4 -4
  239. cirq/protocols/phase_protocol.py +13 -4
  240. cirq/protocols/pow_protocol.py +2 -1
  241. cirq/protocols/pow_protocol_test.py +5 -5
  242. cirq/protocols/qasm.py +2 -1
  243. cirq/protocols/qid_shape_protocol.py +2 -1
  244. cirq/protocols/resolve_parameters.py +17 -15
  245. cirq/protocols/trace_distance_bound.py +2 -1
  246. cirq/protocols/unitary_protocol.py +21 -21
  247. cirq/protocols/unitary_protocol_test.py +31 -19
  248. cirq/qis/channels.py +1 -1
  249. cirq/qis/channels_test.py +1 -1
  250. cirq/qis/clifford_tableau.py +16 -15
  251. cirq/qis/clifford_tableau_test.py +17 -17
  252. cirq/qis/entropy.py +3 -3
  253. cirq/qis/entropy_test.py +1 -1
  254. cirq/qis/quantum_state_representation.py +2 -1
  255. cirq/qis/states.py +7 -2
  256. cirq/qis/states_test.py +54 -54
  257. cirq/sim/classical_simulator.py +25 -14
  258. cirq/sim/classical_simulator_test.py +85 -30
  259. cirq/sim/clifford/clifford_simulator.py +7 -6
  260. cirq/sim/clifford/clifford_simulator_test.py +51 -50
  261. cirq/sim/clifford/clifford_tableau_simulation_state.py +2 -1
  262. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +2 -1
  263. cirq/sim/clifford/stabilizer_sampler.py +1 -1
  264. cirq/sim/clifford/stabilizer_simulation_state.py +2 -1
  265. cirq/sim/clifford/stabilizer_state_ch_form.py +16 -15
  266. cirq/sim/clifford/stabilizer_state_ch_form_test.py +0 -1
  267. cirq/sim/density_matrix_simulation_state.py +7 -6
  268. cirq/sim/density_matrix_simulator.py +3 -2
  269. cirq/sim/density_matrix_simulator_test.py +94 -84
  270. cirq/sim/density_matrix_utils.py +2 -1
  271. cirq/sim/density_matrix_utils_test.py +1 -1
  272. cirq/sim/mux.py +35 -8
  273. cirq/sim/mux_test.py +39 -26
  274. cirq/sim/simulation_product_state.py +2 -1
  275. cirq/sim/simulation_product_state_test.py +8 -7
  276. cirq/sim/simulation_state.py +6 -5
  277. cirq/sim/simulation_state_base.py +3 -2
  278. cirq/sim/simulation_state_test.py +7 -6
  279. cirq/sim/simulation_utils.py +2 -1
  280. cirq/sim/simulator.py +4 -3
  281. cirq/sim/simulator_base.py +2 -1
  282. cirq/sim/simulator_base_test.py +51 -36
  283. cirq/sim/simulator_test.py +41 -36
  284. cirq/sim/sparse_simulator.py +3 -2
  285. cirq/sim/sparse_simulator_test.py +92 -82
  286. cirq/sim/state_vector.py +5 -6
  287. cirq/sim/state_vector_simulation_state.py +10 -9
  288. cirq/sim/state_vector_simulator.py +2 -1
  289. cirq/sim/state_vector_simulator_test.py +9 -9
  290. cirq/sim/state_vector_test.py +40 -39
  291. cirq/study/__init__.py +1 -0
  292. cirq/study/flatten_expressions.py +2 -1
  293. cirq/study/resolver.py +31 -18
  294. cirq/study/resolver_test.py +1 -1
  295. cirq/study/result.py +2 -1
  296. cirq/study/result_test.py +20 -20
  297. cirq/study/sweepable.py +2 -1
  298. cirq/study/sweepable_test.py +20 -20
  299. cirq/study/sweeps.py +26 -1
  300. cirq/study/sweeps_test.py +67 -43
  301. cirq/testing/_compat_test_data/__init__.py +3 -3
  302. cirq/testing/circuit_compare.py +2 -1
  303. cirq/testing/circuit_compare_test.py +16 -14
  304. cirq/testing/consistent_act_on_test.py +1 -1
  305. cirq/testing/consistent_channels.py +2 -2
  306. cirq/testing/consistent_controlled_gate_op.py +2 -2
  307. cirq/testing/consistent_controlled_gate_op_test.py +2 -1
  308. cirq/testing/consistent_decomposition.py +4 -2
  309. cirq/testing/consistent_phase_by.py +1 -1
  310. cirq/testing/consistent_protocols.py +2 -1
  311. cirq/testing/consistent_protocols_test.py +3 -3
  312. cirq/testing/consistent_qasm.py +4 -3
  313. cirq/testing/consistent_qasm_test.py +3 -3
  314. cirq/testing/consistent_resolve_parameters.py +1 -1
  315. cirq/testing/consistent_unitary.py +1 -1
  316. cirq/testing/consistent_unitary_test.py +1 -1
  317. cirq/testing/deprecation.py +1 -1
  318. cirq/testing/devices.py +3 -2
  319. cirq/testing/equals_tester.py +4 -3
  320. cirq/testing/equivalent_basis_map.py +4 -2
  321. cirq/testing/json.py +3 -2
  322. cirq/testing/lin_alg_utils.py +1 -1
  323. cirq/testing/logs.py +1 -1
  324. cirq/testing/op_tree.py +1 -1
  325. cirq/testing/order_tester.py +2 -2
  326. cirq/testing/pytest_utils.py +2 -1
  327. cirq/testing/random_circuit.py +2 -1
  328. cirq/testing/random_circuit_test.py +2 -1
  329. cirq/testing/repr_pretty_tester.py +3 -3
  330. cirq/transformers/__init__.py +1 -0
  331. cirq/transformers/_connected_component.py +231 -0
  332. cirq/transformers/_connected_component_test.py +200 -0
  333. cirq/transformers/align_test.py +13 -13
  334. cirq/transformers/analytical_decompositions/clifford_decomposition.py +8 -7
  335. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +5 -5
  336. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +11 -10
  337. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +6 -6
  338. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +3 -2
  339. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +11 -10
  340. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +8 -7
  341. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +17 -20
  342. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +33 -27
  343. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -1
  344. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +1 -1
  345. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +12 -11
  346. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -2
  347. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +3 -3
  348. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +2 -1
  349. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -1
  350. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +2 -2
  351. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -1
  352. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +32 -30
  353. cirq/transformers/drop_negligible_operations_test.py +7 -7
  354. cirq/transformers/dynamical_decoupling.py +185 -112
  355. cirq/transformers/dynamical_decoupling_test.py +195 -201
  356. cirq/transformers/eject_phased_paulis.py +2 -1
  357. cirq/transformers/eject_phased_paulis_test.py +3 -2
  358. cirq/transformers/eject_z.py +5 -3
  359. cirq/transformers/eject_z_test.py +23 -25
  360. cirq/transformers/expand_composite.py +3 -2
  361. cirq/transformers/expand_composite_test.py +14 -14
  362. cirq/transformers/gauge_compiling/__init__.py +13 -0
  363. cirq/transformers/gauge_compiling/gauge_compiling.py +3 -2
  364. cirq/transformers/gauge_compiling/gauge_compiling_test.py +14 -12
  365. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +3 -3
  366. cirq/transformers/gauge_compiling/idle_moments_gauge.py +225 -0
  367. cirq/transformers/gauge_compiling/idle_moments_gauge_test.py +193 -0
  368. cirq/transformers/gauge_compiling/multi_moment_cphase_gauge.py +242 -0
  369. cirq/transformers/gauge_compiling/multi_moment_cphase_gauge_test.py +243 -0
  370. cirq/transformers/gauge_compiling/multi_moment_gauge_compiling.py +151 -0
  371. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +2 -1
  372. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +1 -1
  373. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +6 -6
  374. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +3 -2
  375. cirq/transformers/measurement_transformers.py +2 -1
  376. cirq/transformers/measurement_transformers_test.py +45 -39
  377. cirq/transformers/merge_k_qubit_gates.py +2 -1
  378. cirq/transformers/merge_k_qubit_gates_test.py +1 -1
  379. cirq/transformers/merge_single_qubit_gates.py +9 -5
  380. cirq/transformers/merge_single_qubit_gates_test.py +22 -22
  381. cirq/transformers/noise_adding_test.py +2 -2
  382. cirq/transformers/optimize_for_target_gateset.py +2 -1
  383. cirq/transformers/optimize_for_target_gateset_test.py +11 -9
  384. cirq/transformers/qubit_management_transformers_test.py +6 -2
  385. cirq/transformers/routing/mapping_manager.py +2 -1
  386. cirq/transformers/routing/route_circuit_cqc.py +2 -1
  387. cirq/transformers/stratify.py +2 -1
  388. cirq/transformers/symbolize.py +2 -1
  389. cirq/transformers/tag_transformers.py +2 -1
  390. cirq/transformers/target_gatesets/compilation_target_gateset.py +2 -1
  391. cirq/transformers/target_gatesets/cz_gateset.py +2 -1
  392. cirq/transformers/target_gatesets/cz_gateset_test.py +1 -1
  393. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +2 -1
  394. cirq/transformers/transformer_api.py +2 -1
  395. cirq/transformers/transformer_primitives.py +271 -145
  396. cirq/transformers/transformer_primitives_test.py +185 -1
  397. cirq/value/abc_alt.py +2 -1
  398. cirq/value/classical_data.py +2 -1
  399. cirq/value/condition.py +2 -1
  400. cirq/value/digits.py +9 -2
  401. cirq/value/duration.py +6 -5
  402. cirq/value/linear_dict.py +4 -9
  403. cirq/value/measurement_key.py +2 -1
  404. cirq/value/periodic_value.py +3 -2
  405. cirq/value/product_state.py +2 -1
  406. cirq/value/value_equality_attr.py +2 -1
  407. cirq/vis/density_matrix.py +1 -1
  408. cirq/vis/heatmap.py +2 -1
  409. cirq/vis/histogram.py +2 -1
  410. cirq/vis/state_histogram.py +2 -1
  411. cirq/work/collector.py +2 -1
  412. cirq/work/observable_grouping.py +2 -1
  413. cirq/work/observable_measurement.py +2 -1
  414. cirq/work/observable_measurement_data.py +2 -1
  415. cirq/work/observable_measurement_test.py +1 -1
  416. cirq/work/observable_readout_calibration.py +2 -1
  417. cirq/work/observable_readout_calibration_test.py +1 -1
  418. cirq/work/observable_settings.py +2 -1
  419. cirq/work/sampler.py +2 -1
  420. cirq/work/sampler_test.py +1 -1
  421. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/METADATA +5 -6
  422. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/RECORD +425 -406
  423. cirq/contrib/json_test.py +0 -33
  424. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/WHEEL +0 -0
  425. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/licenses/LICENSE +0 -0
  426. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/top_level.txt +0 -0
@@ -18,20 +18,22 @@ from __future__ import annotations
18
18
 
19
19
  import itertools
20
20
  import time
21
- from typing import cast, Sequence, TYPE_CHECKING
21
+ from collections.abc import Sequence
22
+ from typing import cast, TYPE_CHECKING
22
23
 
23
24
  import attrs
24
25
  import numpy as np
26
+ import sympy
25
27
 
26
28
  import cirq.contrib.shuffle_circuits.shuffle_circuits_with_readout_benchmarking as sc_readout
27
29
  from cirq import circuits, ops, study, work
28
30
  from cirq.experiments.readout_confusion_matrix import TensoredConfusionMatrices
31
+ from cirq.study import ResultDict
29
32
 
30
33
  if TYPE_CHECKING:
31
34
  from cirq.experiments.single_qubit_readout_calibration import (
32
35
  SingleQubitReadoutCalibrationResult,
33
36
  )
34
- from cirq.study import ResultDict
35
37
 
36
38
 
37
39
  @attrs.frozen
@@ -188,7 +190,7 @@ def _validate_input(
188
190
 
189
191
  # Check pauli_repetitions is bigger than 0
190
192
  if pauli_repetitions <= 0:
191
- raise ValueError("Must provide non-zero pauli_repetitions.")
193
+ raise ValueError("Must provide positive pauli_repetitions.")
192
194
 
193
195
  # Check num_random_bitstrings is bigger than or equal to 0
194
196
  if num_random_bitstrings < 0:
@@ -196,7 +198,7 @@ def _validate_input(
196
198
 
197
199
  # Check readout_repetitions is bigger than 0
198
200
  if readout_repetitions <= 0:
199
- raise ValueError("Must provide non-zero readout_repetitions for readout calibration.")
201
+ raise ValueError("Must provide positive readout_repetitions for readout calibration.")
200
202
 
201
203
 
202
204
  def _normalize_input_paulis(
@@ -240,6 +242,90 @@ def _pauli_strings_to_basis_change_ops(
240
242
  return operations
241
243
 
242
244
 
245
+ def _pauli_strings_to_basis_change_with_sweep(
246
+ pauli_strings: list[ops.PauliString], qid_list: list[ops.Qid]
247
+ ) -> dict[str, float]:
248
+ """Decide single-qubit rotation sweep parameters for basis change.
249
+
250
+ Args:
251
+ pauli_strings: A list of QWC Pauli strings.
252
+ qid_list: A list of qubits to apply the basis change on.
253
+ Returns:
254
+ A dictionary mapping parameter names to their values for basis change.
255
+ """
256
+ params_dict = {}
257
+
258
+ for qid, qubit in enumerate(qid_list):
259
+ params_dict[f"phi{qid}"] = 1.0
260
+ params_dict[f"theta{qid}"] = 0.0
261
+ for pauli_str in pauli_strings:
262
+ pauli_op = pauli_str.get(qubit, default=ops.I)
263
+ if pauli_op == ops.X:
264
+ params_dict[f"phi{qid}"] = 0.0
265
+ params_dict[f"theta{qid}"] = 1 / 2
266
+ break
267
+ elif pauli_op == ops.Y:
268
+ params_dict[f"phi{qid}"] = 1.0
269
+ params_dict[f"theta{qid}"] = 1 / 2
270
+ break
271
+ return params_dict
272
+
273
+
274
+ def _generate_basis_change_circuits(
275
+ normalized_circuits_to_pauli: dict[circuits.FrozenCircuit, list[list[ops.PauliString]]],
276
+ insert_strategy: circuits.InsertStrategy,
277
+ ) -> list[circuits.Circuit]:
278
+ """Generates basis change circuits for each group of Pauli strings."""
279
+ pauli_measurement_circuits = list[circuits.Circuit]()
280
+
281
+ for input_circuit, pauli_string_groups in normalized_circuits_to_pauli.items():
282
+ qid_list = list(sorted(input_circuit.all_qubits()))
283
+ basis_change_circuits = []
284
+ input_circuit_unfrozen = input_circuit.unfreeze()
285
+ for pauli_strings in pauli_string_groups:
286
+ basis_change_circuit = circuits.Circuit(
287
+ input_circuit_unfrozen,
288
+ _pauli_strings_to_basis_change_ops(pauli_strings, qid_list),
289
+ ops.measure(*qid_list, key="result"),
290
+ strategy=insert_strategy,
291
+ )
292
+ basis_change_circuits.append(basis_change_circuit)
293
+ pauli_measurement_circuits.extend(basis_change_circuits)
294
+
295
+ return pauli_measurement_circuits
296
+
297
+
298
+ def _generate_basis_change_circuits_with_sweep(
299
+ normalized_circuits_to_pauli: dict[circuits.FrozenCircuit, list[list[ops.PauliString]]],
300
+ insert_strategy: circuits.InsertStrategy,
301
+ ) -> tuple[list[circuits.Circuit], list[study.Sweepable]]:
302
+ """Generates basis change circuits for each group of Pauli strings with sweep."""
303
+ parameterized_circuits = list[circuits.Circuit]()
304
+ sweep_params = list[study.Sweepable]()
305
+ for input_circuit, pauli_string_groups in normalized_circuits_to_pauli.items():
306
+ qid_list = list(sorted(input_circuit.all_qubits()))
307
+ phi_symbols = sympy.symbols(f"phi:{len(qid_list)}")
308
+ theta_symbols = sympy.symbols(f"theta:{len(qid_list)}")
309
+
310
+ # Create phased gates and measurement operator
311
+ phased_gates = [
312
+ ops.PhasedXPowGate(phase_exponent=(a - 1) / 2, exponent=b)(qubit)
313
+ for a, b, qubit in zip(phi_symbols, theta_symbols, qid_list)
314
+ ]
315
+ measurement_op = ops.M(*qid_list, key="result")
316
+
317
+ parameterized_circuit = circuits.Circuit(
318
+ input_circuit.unfreeze(), phased_gates, measurement_op, strategy=insert_strategy
319
+ )
320
+ sweep_param = []
321
+ for pauli_strings in pauli_string_groups:
322
+ sweep_param.append(_pauli_strings_to_basis_change_with_sweep(pauli_strings, qid_list))
323
+ sweep_params.append(sweep_param)
324
+ parameterized_circuits.append(parameterized_circuit)
325
+
326
+ return parameterized_circuits, sweep_params
327
+
328
+
243
329
  def _build_one_qubit_confusion_matrix(e0: float, e1: float) -> np.ndarray:
244
330
  """Builds a 2x2 confusion matrix for a single qubit.
245
331
 
@@ -288,7 +374,7 @@ def _build_many_one_qubits_empty_confusion_matrix(qubits_length: int) -> list[np
288
374
  def _process_pauli_measurement_results(
289
375
  qubits: Sequence[ops.Qid],
290
376
  pauli_string_groups: list[list[ops.PauliString]],
291
- circuit_results: list[ResultDict] | Sequence[study.Result],
377
+ circuit_results: Sequence[ResultDict] | Sequence[study.Result],
292
378
  calibration_results: dict[tuple[ops.Qid, ...], SingleQubitReadoutCalibrationResult],
293
379
  pauli_repetitions: int,
294
380
  timestamp: float,
@@ -321,7 +407,7 @@ def _process_pauli_measurement_results(
321
407
  pauli_measurement_results: list[PauliStringMeasurementResult] = []
322
408
 
323
409
  for pauli_group_index, circuit_result in enumerate(circuit_results):
324
- measurement_results = circuit_result.measurements["m"]
410
+ measurement_results = circuit_result.measurements["result"]
325
411
  pauli_strs = pauli_string_groups[pauli_group_index]
326
412
  pauli_readout_qubits = _extract_readout_qubits(pauli_strs)
327
413
 
@@ -403,6 +489,8 @@ def measure_pauli_strings(
403
489
  readout_repetitions: int,
404
490
  num_random_bitstrings: int,
405
491
  rng_or_seed: np.random.Generator | int,
492
+ use_sweep: bool = False,
493
+ insert_strategy: circuits.InsertStrategy = circuits.InsertStrategy.INLINE,
406
494
  ) -> list[CircuitToPauliStringsMeasurementResult]:
407
495
  """Measures expectation values of Pauli strings on given circuits with/without
408
496
  readout error mitigation.
@@ -411,10 +499,11 @@ def measure_pauli_strings(
411
499
  For each circuit and its associated list of QWC pauli string group, it:
412
500
  1. Constructs circuits to measure the Pauli string expectation value by
413
501
  adding basis change moments and measurement operations.
414
- 2. Runs shuffled readout benchmarking on these circuits to calibrate readout errors.
502
+ 2. If `num_random_bitstrings` is greater than zero, performing readout
503
+ benchmarking (shuffled or sweep-based) to calibrate readout errors.
415
504
  3. Mitigates readout errors using the calibrated confusion matrices.
416
505
  4. Calculates and returns both error-mitigated and unmitigated expectation values for
417
- each Pauli string.
506
+ each Pauli string.
418
507
 
419
508
  Args:
420
509
  circuits_to_pauli: A dictionary mapping circuits to either:
@@ -432,6 +521,10 @@ def measure_pauli_strings(
432
521
  num_random_bitstrings: The number of random bitstrings to use in readout
433
522
  benchmarking.
434
523
  rng_or_seed: A random number generator or seed for the readout benchmarking.
524
+ use_sweep: If True, uses parameterized circuits and sweeps parameters
525
+ for both Pauli measurements and readout benchmarking. Defaults to False.
526
+ insert_strategy: The strategy for inserting measurement operations into the circuit.
527
+ Defaults to circuits.InsertStrategy.INLINE.
435
528
 
436
529
  Returns:
437
530
  A list of CircuitToPauliStringsMeasurementResult objects, where each object contains:
@@ -460,49 +553,68 @@ def measure_pauli_strings(
460
553
 
461
554
  # Build the basis-change circuits for each Pauli string group
462
555
  pauli_measurement_circuits: list[circuits.Circuit] = []
463
- for input_circuit, pauli_string_groups in normalized_circuits_to_pauli.items():
464
- qid_list = sorted(input_circuit.all_qubits())
465
- basis_change_circuits = []
466
- input_circuit_unfrozen = input_circuit.unfreeze()
467
- for pauli_strings in pauli_string_groups:
468
- basis_change_circuit = (
469
- input_circuit_unfrozen
470
- + _pauli_strings_to_basis_change_ops(pauli_strings, qid_list)
471
- + ops.measure(*qid_list, key="m")
472
- )
473
- basis_change_circuits.append(basis_change_circuit)
474
- pauli_measurement_circuits.extend(basis_change_circuits)
556
+ sweep_params: list[study.Sweepable] = []
557
+ circuits_results: Sequence[ResultDict] | Sequence[Sequence[study.Result]] = []
558
+ calibration_results: dict[tuple[ops.Qid, ...], SingleQubitReadoutCalibrationResult] = {}
559
+
560
+ benchmarking_params = sc_readout.ReadoutBenchmarkingParams(
561
+ circuit_repetitions=pauli_repetitions,
562
+ num_random_bitstrings=num_random_bitstrings,
563
+ readout_repetitions=readout_repetitions,
564
+ )
565
+
566
+ if use_sweep:
567
+ pauli_measurement_circuits, sweep_params = _generate_basis_change_circuits_with_sweep(
568
+ normalized_circuits_to_pauli, insert_strategy
569
+ )
475
570
 
476
- # Run shuffled benchmarking for readout calibration
477
- circuits_results, calibration_results = (
478
- sc_readout.run_shuffled_circuits_with_readout_benchmarking(
571
+ # Run benchmarking using sweep for readout calibration
572
+ circuits_results, calibration_results = sc_readout.run_sweep_with_readout_benchmarking(
479
573
  sampler=sampler,
480
574
  input_circuits=pauli_measurement_circuits,
481
- parameters=sc_readout.ReadoutBenchmarkingParams(
482
- circuit_repetitions=pauli_repetitions,
483
- num_random_bitstrings=num_random_bitstrings,
484
- readout_repetitions=readout_repetitions,
485
- ),
575
+ sweep_params=sweep_params,
576
+ parameters=benchmarking_params,
486
577
  rng_or_seed=rng_or_seed,
487
578
  qubits=[list(qubits) for qubits in qubits_list],
488
579
  )
489
- )
580
+
581
+ else:
582
+ pauli_measurement_circuits = _generate_basis_change_circuits(
583
+ normalized_circuits_to_pauli, insert_strategy
584
+ )
585
+
586
+ # Run shuffled benchmarking for readout calibration
587
+ circuits_results, calibration_results = (
588
+ sc_readout.run_shuffled_circuits_with_readout_benchmarking(
589
+ sampler=sampler,
590
+ input_circuits=pauli_measurement_circuits,
591
+ parameters=benchmarking_params,
592
+ rng_or_seed=rng_or_seed,
593
+ qubits=[list(qubits) for qubits in qubits_list],
594
+ )
595
+ )
490
596
 
491
597
  # Process the results to calculate expectation values
492
598
  results: list[CircuitToPauliStringsMeasurementResult] = []
493
599
  circuit_result_index = 0
494
- for input_circuit, pauli_string_groups in normalized_circuits_to_pauli.items():
495
-
600
+ for i, (input_circuit, pauli_string_groups) in enumerate(normalized_circuits_to_pauli.items()):
496
601
  qubits_in_circuit = tuple(sorted(input_circuit.all_qubits()))
497
602
 
498
603
  disable_readout_mitigation = False if num_random_bitstrings != 0 else True
499
604
 
605
+ circuits_results_for_group: Sequence[ResultDict] | Sequence[study.Result] = []
606
+ if use_sweep:
607
+ circuits_results_for_group = cast(Sequence[Sequence[study.Result]], circuits_results)[i]
608
+ else:
609
+ circuits_results_for_group = cast(Sequence[ResultDict], circuits_results)[
610
+ circuit_result_index : circuit_result_index + len(pauli_string_groups)
611
+ ]
612
+ circuit_result_index += len(pauli_string_groups)
613
+
500
614
  pauli_measurement_results = _process_pauli_measurement_results(
501
615
  list(qubits_in_circuit),
502
616
  pauli_string_groups,
503
- circuits_results[
504
- circuit_result_index : circuit_result_index + len(pauli_string_groups)
505
- ],
617
+ circuits_results_for_group,
506
618
  calibration_results,
507
619
  pauli_repetitions,
508
620
  time.time(),
@@ -514,5 +626,4 @@ def measure_pauli_strings(
514
626
  )
515
627
  )
516
628
 
517
- circuit_result_index += len(pauli_string_groups)
518
629
  return results