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
cirq/study/result_test.py CHANGED
@@ -25,12 +25,12 @@ import cirq.testing
25
25
  from cirq.study.result import _pack_digits
26
26
 
27
27
 
28
- def test_result_init():
28
+ def test_result_init() -> None:
29
29
  assert cirq.ResultDict(params=cirq.ParamResolver({}), measurements=None).repetitions == 0
30
30
  assert cirq.ResultDict(params=cirq.ParamResolver({}), measurements={}).repetitions == 0
31
31
 
32
32
 
33
- def test_default_repetitions():
33
+ def test_default_repetitions() -> None:
34
34
  class MyResult(cirq.Result):
35
35
  def __init__(self, records):
36
36
  self._records = records
@@ -55,7 +55,7 @@ def test_default_repetitions():
55
55
  assert MyResult({'a': np.zeros((5, 2, 3))}).repetitions == 5
56
56
 
57
57
 
58
- def test_repr():
58
+ def test_repr() -> None:
59
59
  v = cirq.ResultDict(
60
60
  params=cirq.ParamResolver({'a': 2}), measurements={'xy': np.array([[1, 0], [0, 1]])}
61
61
  )
@@ -68,7 +68,7 @@ def test_repr():
68
68
  cirq.testing.assert_equivalent_repr(v)
69
69
 
70
70
 
71
- def test_construct_from_measurements():
71
+ def test_construct_from_measurements() -> None:
72
72
  r = cirq.ResultDict(
73
73
  params=None,
74
74
  measurements={'a': np.array([[0, 0], [1, 1]]), 'b': np.array([[0, 0, 0], [1, 1, 1]])},
@@ -79,7 +79,7 @@ def test_construct_from_measurements():
79
79
  assert np.all(r.records['b'] == np.array([[[0, 0, 0]], [[1, 1, 1]]]))
80
80
 
81
81
 
82
- def test_construct_from_repeated_measurements():
82
+ def test_construct_from_repeated_measurements() -> None:
83
83
  r = cirq.ResultDict(
84
84
  params=None,
85
85
  records={
@@ -104,13 +104,13 @@ def test_construct_from_repeated_measurements():
104
104
  assert r2.repetitions == 2
105
105
 
106
106
 
107
- def test_empty_measurements():
107
+ def test_empty_measurements() -> None:
108
108
  assert cirq.ResultDict(params=None).repetitions == 0
109
109
  assert cirq.ResultDict(params=None, measurements={}).repetitions == 0
110
110
  assert cirq.ResultDict(params=None, records={}).repetitions == 0
111
111
 
112
112
 
113
- def test_str():
113
+ def test_str() -> None:
114
114
  result = cirq.ResultDict(
115
115
  params=cirq.ParamResolver({}),
116
116
  measurements={
@@ -136,7 +136,7 @@ def test_str():
136
136
  assert str(result) == 'c=1, 0\nc=0, 1'
137
137
 
138
138
 
139
- def test_df():
139
+ def test_df() -> None:
140
140
  result = cirq.ResultDict(
141
141
  params=cirq.ParamResolver({}),
142
142
  measurements={
@@ -156,7 +156,7 @@ def test_df():
156
156
  assert df.c.value_counts().to_dict() == {0: 3, 1: 2}
157
157
 
158
158
 
159
- def test_df_large():
159
+ def test_df_large() -> None:
160
160
  result = cirq.ResultDict(
161
161
  params=cirq.ParamResolver({}),
162
162
  measurements={
@@ -171,7 +171,7 @@ def test_df_large():
171
171
  assert result.data['d'].dtype == object
172
172
 
173
173
 
174
- def test_histogram():
174
+ def test_histogram() -> None:
175
175
  result = cirq.ResultDict(
176
176
  params=cirq.ParamResolver({}),
177
177
  measurements={
@@ -188,7 +188,7 @@ def test_histogram():
188
188
  assert result.histogram(key='c') == collections.Counter({0: 3, 1: 2})
189
189
 
190
190
 
191
- def test_multi_measurement_histogram():
191
+ def test_multi_measurement_histogram() -> None:
192
192
  result = cirq.ResultDict(
193
193
  params=cirq.ParamResolver({}),
194
194
  measurements={
@@ -222,7 +222,7 @@ def test_multi_measurement_histogram():
222
222
  )
223
223
 
224
224
 
225
- def test_result_equality():
225
+ def test_result_equality() -> None:
226
226
  et = cirq.testing.EqualsTester()
227
227
  et.add_equality_group(
228
228
  cirq.ResultDict(params=cirq.ParamResolver({}), measurements={'a': np.array([[0]] * 5)}),
@@ -239,7 +239,7 @@ def test_result_equality():
239
239
  )
240
240
 
241
241
 
242
- def test_result_addition_valid():
242
+ def test_result_addition_valid() -> None:
243
243
  a = cirq.ResultDict(
244
244
  params=cirq.ParamResolver({'ax': 1}),
245
245
  measurements={
@@ -278,7 +278,7 @@ def test_result_addition_valid():
278
278
  )
279
279
 
280
280
 
281
- def test_result_addition_invalid():
281
+ def test_result_addition_invalid() -> None:
282
282
  a = cirq.ResultDict(
283
283
  params=cirq.ParamResolver({'ax': 1}),
284
284
  measurements={
@@ -324,10 +324,10 @@ def test_result_addition_invalid():
324
324
  with pytest.raises(ValueError, match='different measurement shapes'):
325
325
  _ = a + e
326
326
  with pytest.raises(TypeError):
327
- _ = a + 'junk'
327
+ _ = a + 'junk' # type: ignore[operator]
328
328
 
329
329
 
330
- def test_qubit_keys_for_histogram():
330
+ def test_qubit_keys_for_histogram() -> None:
331
331
  a, b, c = cirq.LineQubit.range(3)
332
332
  circuit = cirq.Circuit(cirq.measure(a, b), cirq.X(c), cirq.measure(c))
333
333
  results = cirq.Simulator().run(program=circuit, repetitions=100)
@@ -339,7 +339,7 @@ def test_qubit_keys_for_histogram():
339
339
  assert results.histogram(key=[c]) == collections.Counter({1: 100})
340
340
 
341
341
 
342
- def test_text_diagram_jupyter():
342
+ def test_text_diagram_jupyter() -> None:
343
343
  result = cirq.ResultDict(
344
344
  params=cirq.ParamResolver({}),
345
345
  measurements={
@@ -397,12 +397,12 @@ def test_json_bit_packing_and_dtype(use_records: bool) -> None:
397
397
  np.testing.assert_allclose(len(bits_json), len(digits_json) / 8, rtol=0.02)
398
398
 
399
399
 
400
- def test_json_bit_packing_error():
400
+ def test_json_bit_packing_error() -> None:
401
401
  with pytest.raises(ValueError):
402
402
  _pack_digits(np.ones(10), pack_bits='hi mom')
403
403
 
404
404
 
405
- def test_json_bit_packing_force():
405
+ def test_json_bit_packing_force() -> None:
406
406
  assert _pack_digits(np.ones(10, dtype=int), pack_bits='force') == _pack_digits(
407
407
  np.ones(10), pack_bits='auto'
408
408
  )
@@ -418,7 +418,7 @@ def test_json_bit_packing_force():
418
418
  )
419
419
 
420
420
 
421
- def test_json_unpack_compat():
421
+ def test_json_unpack_compat() -> None:
422
422
  """Test reading old json with serialized measurements array."""
423
423
  old_json = """
424
424
  {
cirq/study/sweepable.py CHANGED
@@ -17,7 +17,8 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  import warnings
20
- from typing import cast, Iterable, Iterator, Protocol, Sequence
20
+ from collections.abc import Iterable, Iterator, Sequence
21
+ from typing import cast, Protocol
21
22
 
22
23
  from cirq._doc import document
23
24
  from cirq.study.resolver import ParamResolver, ParamResolverOrSimilarType
@@ -24,66 +24,66 @@ import sympy
24
24
  import cirq
25
25
 
26
26
 
27
- def test_to_resolvers_none():
27
+ def test_to_resolvers_none() -> None:
28
28
  assert list(cirq.to_resolvers(None)) == [cirq.ParamResolver({})]
29
29
 
30
30
 
31
- def test_to_resolvers_single():
31
+ def test_to_resolvers_single() -> None:
32
32
  resolver = cirq.ParamResolver({})
33
33
  assert list(cirq.to_resolvers(resolver)) == [resolver]
34
34
  assert list(cirq.to_resolvers({})) == [resolver]
35
35
 
36
36
 
37
- def test_to_resolvers_sweep():
37
+ def test_to_resolvers_sweep() -> None:
38
38
  sweep = cirq.Linspace('a', 0, 1, 10)
39
39
  assert list(cirq.to_resolvers(sweep)) == list(sweep)
40
40
 
41
41
 
42
- def test_to_resolvers_iterable():
42
+ def test_to_resolvers_iterable() -> None:
43
43
  resolvers = [cirq.ParamResolver({'a': 2}), cirq.ParamResolver({'a': 1})]
44
44
  assert list(cirq.to_resolvers(resolvers)) == resolvers
45
45
  assert list(cirq.to_resolvers([{'a': 2}, {'a': 1}])) == resolvers
46
46
 
47
47
 
48
- def test_to_resolvers_iterable_sweeps():
48
+ def test_to_resolvers_iterable_sweeps() -> None:
49
49
  sweeps = [cirq.Linspace('a', 0, 1, 10), cirq.Linspace('b', 0, 1, 10)]
50
50
  assert list(cirq.to_resolvers(sweeps)) == list(itertools.chain(*sweeps))
51
51
 
52
52
 
53
- def test_to_resolvers_bad():
53
+ def test_to_resolvers_bad() -> None:
54
54
  with pytest.raises(TypeError, match='Unrecognized sweepable'):
55
55
  for _ in cirq.study.to_resolvers('nope'):
56
56
  pass
57
57
 
58
58
 
59
- def test_to_sweeps_none():
59
+ def test_to_sweeps_none() -> None:
60
60
  assert cirq.study.to_sweeps(None) == [cirq.UnitSweep]
61
61
 
62
62
 
63
- def test_to_sweeps_single():
63
+ def test_to_sweeps_single() -> None:
64
64
  resolver = cirq.ParamResolver({})
65
65
  assert cirq.study.to_sweeps(resolver) == [cirq.UnitSweep]
66
66
  assert cirq.study.to_sweeps({}) == [cirq.UnitSweep]
67
67
 
68
68
 
69
- def test_to_sweeps_sweep():
69
+ def test_to_sweeps_sweep() -> None:
70
70
  sweep = cirq.Linspace('a', 0, 1, 10)
71
71
  assert cirq.study.to_sweeps(sweep) == [sweep]
72
72
 
73
73
 
74
- def test_to_sweeps_iterable():
74
+ def test_to_sweeps_iterable() -> None:
75
75
  resolvers = [cirq.ParamResolver({'a': 2}), cirq.ParamResolver({'a': 1})]
76
76
  sweeps = [cirq.study.Zip(cirq.Points('a', [2])), cirq.study.Zip(cirq.Points('a', [1]))]
77
77
  assert cirq.study.to_sweeps(resolvers) == sweeps
78
78
  assert cirq.study.to_sweeps([{'a': 2}, {'a': 1}]) == sweeps
79
79
 
80
80
 
81
- def test_to_sweeps_iterable_sweeps():
81
+ def test_to_sweeps_iterable_sweeps() -> None:
82
82
  sweeps = [cirq.Linspace('a', 0, 1, 10), cirq.Linspace('b', 0, 1, 10)]
83
83
  assert cirq.study.to_sweeps(sweeps) == sweeps
84
84
 
85
85
 
86
- def test_to_sweeps_dictionary_of_list():
86
+ def test_to_sweeps_dictionary_of_list() -> None:
87
87
  with pytest.warns(DeprecationWarning, match='dict_to_product_sweep'):
88
88
  assert cirq.study.to_sweeps({'t': [0, 2, 3]}) == cirq.study.to_sweeps(
89
89
  [{'t': 0}, {'t': 2}, {'t': 3}]
@@ -98,12 +98,12 @@ def test_to_sweeps_dictionary_of_list():
98
98
  )
99
99
 
100
100
 
101
- def test_to_sweeps_invalid():
101
+ def test_to_sweeps_invalid() -> None:
102
102
  with pytest.raises(TypeError, match='Unrecognized sweepable'):
103
103
  cirq.study.to_sweeps('nope')
104
104
 
105
105
 
106
- def test_to_sweep_sweep():
106
+ def test_to_sweep_sweep() -> None:
107
107
  sweep = cirq.Linspace('a', 0, 1, 10)
108
108
  assert cirq.to_sweep(sweep) is sweep
109
109
 
@@ -117,7 +117,7 @@ def test_to_sweep_sweep():
117
117
  lambda: cirq.ParamResolver({sympy.Symbol('a'): 1}),
118
118
  ],
119
119
  )
120
- def test_to_sweep_single_resolver(r_gen):
120
+ def test_to_sweep_single_resolver(r_gen) -> None:
121
121
  sweep = cirq.to_sweep(r_gen())
122
122
  assert isinstance(sweep, cirq.Sweep)
123
123
  assert list(sweep) == [cirq.ParamResolver({'a': 1})]
@@ -141,18 +141,18 @@ def test_to_sweep_single_resolver(r_gen):
141
141
  lambda: {object(): r for r in [{'a': 1}, {'a': 1.5}]}.values(),
142
142
  ],
143
143
  )
144
- def test_to_sweep_resolver_list(r_list_gen):
144
+ def test_to_sweep_resolver_list(r_list_gen) -> None:
145
145
  sweep = cirq.to_sweep(r_list_gen())
146
146
  assert isinstance(sweep, cirq.Sweep)
147
147
  assert list(sweep) == [cirq.ParamResolver({'a': 1}), cirq.ParamResolver({'a': 1.5})]
148
148
 
149
149
 
150
- def test_to_sweep_type_error():
150
+ def test_to_sweep_type_error() -> None:
151
151
  with pytest.raises(TypeError, match='Unexpected sweep'):
152
- cirq.to_sweep(5)
152
+ cirq.to_sweep(5) # type: ignore[arg-type]
153
153
 
154
154
 
155
- def test_to_sweeps_with_param_dict_appends_metadata():
155
+ def test_to_sweeps_with_param_dict_appends_metadata() -> None:
156
156
  params = {'a': 1, 'b': 2, 'c': 3}
157
157
  unit_map = {'a': 'ns', 'b': 'ns'}
158
158
 
@@ -167,7 +167,7 @@ def test_to_sweeps_with_param_dict_appends_metadata():
167
167
  ]
168
168
 
169
169
 
170
- def test_to_sweeps_with_param_list_appends_metadata():
170
+ def test_to_sweeps_with_param_list_appends_metadata() -> None:
171
171
  resolvers = [cirq.ParamResolver({'a': 2}), cirq.ParamResolver({'a': 1})]
172
172
  unit_map = {'a': 'ns'}
173
173
 
cirq/study/sweeps.py CHANGED
@@ -17,7 +17,8 @@ from __future__ import annotations
17
17
  import abc
18
18
  import collections
19
19
  import itertools
20
- from typing import Any, cast, Iterable, Iterator, overload, Sequence, TYPE_CHECKING, Union
20
+ from collections.abc import Iterable, Iterator, Mapping, Sequence
21
+ from typing import Any, cast, overload, TYPE_CHECKING, Union
21
22
 
22
23
  import sympy
23
24
 
@@ -653,3 +654,27 @@ def dict_to_zip_sweep(factor_dict: ProductOrZipSweepLike) -> Zip:
653
654
  for k, v in factor_dict.items()
654
655
  )
655
656
  )
657
+
658
+
659
+ def list_of_dicts_to_zip(params: Sequence[Mapping[str, float]]) -> cirq.Zip:
660
+ """Converts a list of dictionaries into a cirq.Zip of cirq.Points.
661
+
662
+ This will convert lists of dictionaries into a more compact
663
+ Sweep format. For large sweeps, this can vastly improve performance.
664
+
665
+ This will change [{'a': 1.0, 'b': 2.0}, {'a': 3.0, 'b': 4.0}]
666
+ into cirq.Zip(cirq.Points('a', [1.0, 3.0]), cirq.Points('b', [2.0, 4.0])_)
667
+
668
+ Raises:
669
+ ValueError if the keys in any of the list items are not the same.
670
+ """
671
+ param_keys: dict[str, list[float]] = collections.defaultdict(list)
672
+ if len(params) < 1:
673
+ raise ValueError("Input dictionary to convert is empty.")
674
+ sweep_keys = params[0].keys()
675
+ for sweep_point in params:
676
+ if set(sweep_point.keys()) != sweep_keys:
677
+ raise ValueError("Keys must be the same in each sweep point.")
678
+ for key, value in sweep_point.items():
679
+ param_keys[key].append(value)
680
+ return Zip(*(Points(key, points) for key, points in param_keys.items()))