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
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import enum
18
18
  import itertools
19
- from typing import Iterator, Sequence, TYPE_CHECKING
19
+ from collections.abc import Iterator, Sequence
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from cirq import ops
22
23
  from cirq.contrib.acquaintance.gates import acquaint
@@ -45,7 +45,7 @@ class AcquaintanceDevice(devices.Device, metaclass=abc.ABCMeta):
45
45
  def get_acquaintance_size(obj: circuits.Circuit | ops.Operation) -> int:
46
46
  """The maximum number of qubits to be acquainted with each other."""
47
47
  if isinstance(obj, circuits.Circuit):
48
- return max(tuple(get_acquaintance_size(op) for op in obj.all_operations()) or (0,))
48
+ return max((get_acquaintance_size(op) for op in obj.all_operations()), default=0)
49
49
  if not isinstance(obj, ops.Operation):
50
50
  raise TypeError('not isinstance(obj, (Circuit, Operation))')
51
51
  if not isinstance(obj, ops.GateOperation):
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import abc
18
18
  from collections import defaultdict
19
- from typing import Iterator, Sequence, TYPE_CHECKING
19
+ from collections.abc import Iterator, Sequence
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from cirq import circuits, devices, ops, protocols, transformers
22
23
  from cirq.contrib.acquaintance.gates import AcquaintanceOpportunityGate
@@ -66,10 +67,8 @@ class ExecutionStrategy(metaclass=abc.ABCMeta):
66
67
  """
67
68
  if len(args) < 1 or not isinstance(args[0], circuits.AbstractCircuit):
68
69
  raise ValueError(
69
- (
70
- "To call ExecutionStrategy, an argument of type "
71
- "circuits.AbstractCircuit must be passed in as the first non-keyword argument"
72
- )
70
+ "To call ExecutionStrategy, an argument of type "
71
+ "circuits.AbstractCircuit must be passed in as the first non-keyword argument"
73
72
  )
74
73
  input_circuit = args[0]
75
74
  strategy = StrategyExecutorTransformer(self)
@@ -14,9 +14,10 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Sequence
17
18
  from itertools import combinations
18
19
  from string import ascii_lowercase
19
- from typing import Any, Sequence
20
+ from typing import Any
20
21
 
21
22
  import numpy as np
22
23
  import pytest
@@ -18,7 +18,8 @@ import functools
18
18
  import itertools
19
19
  import math
20
20
  import operator
21
- from typing import Iterable, Iterator, NamedTuple, Sequence, TYPE_CHECKING
21
+ from collections.abc import Iterable, Iterator, Sequence
22
+ from typing import NamedTuple, TYPE_CHECKING
22
23
 
23
24
  from cirq import ops, protocols, value
24
25
  from cirq.contrib.acquaintance.permutation import (
@@ -14,10 +14,10 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Sequence
17
18
  from itertools import combinations, product
18
19
  from random import randint
19
20
  from string import ascii_lowercase as alphabet
20
- from typing import Sequence
21
21
 
22
22
  import numpy
23
23
  import pytest
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Iterator, Sequence, TYPE_CHECKING
17
+ from collections.abc import Iterator, Sequence
18
+ from typing import TYPE_CHECKING
18
19
 
19
20
  from cirq import devices
20
21
  from cirq.contrib import circuitdag
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import collections
18
- from typing import cast, Sequence, TYPE_CHECKING
18
+ from collections.abc import Sequence
19
+ from typing import cast, TYPE_CHECKING
19
20
 
20
21
  from cirq import circuits, ops, transformers
21
22
  from cirq.contrib.acquaintance.devices import get_acquaintance_size
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import cast, Sequence, TYPE_CHECKING
17
+ from collections.abc import Sequence
18
+ from typing import cast, TYPE_CHECKING
18
19
 
19
20
  from cirq import circuits
20
21
  from cirq.contrib.acquaintance.executor import AcquaintanceOperation
@@ -15,8 +15,9 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import abc
18
+ from collections.abc import Iterable, Iterator, Sequence
18
19
  from types import NotImplementedType
19
- from typing import Any, cast, Iterable, Iterator, Sequence, TYPE_CHECKING, TypeVar
20
+ from typing import Any, cast, TYPE_CHECKING, TypeVar
20
21
 
21
22
  from cirq import circuits, ops, protocols, transformers, value
22
23
 
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import random
18
- from typing import Iterator
18
+ from collections.abc import Iterator
19
19
 
20
20
  import pytest
21
21
 
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import itertools
18
- from typing import Any, Iterator, Sequence, TYPE_CHECKING
18
+ from collections.abc import Iterator, Sequence
19
+ from typing import Any, TYPE_CHECKING
19
20
 
20
21
  from cirq import ops, value
21
22
  from cirq.contrib.acquaintance.permutation import PermutationGate, SwapPermutationGate
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import functools
18
18
  import itertools
19
- from typing import Iterable, Iterator, Sequence, TYPE_CHECKING
19
+ from collections.abc import Iterable, Iterator, Sequence
20
+ from typing import TYPE_CHECKING
20
21
 
21
22
  from cirq import ops
22
23
  from cirq.contrib.acquaintance.gates import acquaint
@@ -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
20
21
  from cirq.contrib.acquaintance.gates import acquaint
@@ -54,7 +55,7 @@ def complete_acquaintance_strategy(
54
55
  if acquaintance_size == len(qubit_order):
55
56
  return circuits.Circuit(acquaint(*qubit_order))
56
57
 
57
- strategy = circuits.Circuit((acquaint(q) for q in qubit_order))
58
+ strategy = circuits.Circuit(acquaint(q) for q in qubit_order)
58
59
  for size_to_acquaint in range(2, acquaintance_size + 1):
59
60
  expose_acquaintance_gates(strategy)
60
61
  replace_acquaintance_with_swap_network(strategy, qubit_order, size_to_acquaint, swap_gate)
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import itertools
18
- from typing import Iterable, Sequence, TYPE_CHECKING, TypeVar
18
+ from collections.abc import Iterable, Sequence
19
+ from typing import TYPE_CHECKING, TypeVar
19
20
 
20
21
  from cirq import circuits, ops
21
22
  from cirq.contrib.acquaintance.gates import acquaint
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import cast, Iterable, Sequence, TYPE_CHECKING
17
+ from collections.abc import Iterable, Sequence
18
+ from typing import cast, TYPE_CHECKING
18
19
 
19
20
  from cirq import circuits
20
21
  from cirq.contrib.acquaintance.gates import acquaint, SwapNetworkGate
@@ -16,7 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import itertools
18
18
  import random
19
- from typing import Iterable
19
+ from collections.abc import Iterable
20
20
 
21
21
  import pytest
22
22
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import cast, Sequence, TYPE_CHECKING
17
+ from collections.abc import Sequence
18
+ from typing import cast, TYPE_CHECKING
18
19
 
19
20
  from cirq import devices, ops, protocols
20
21
  from cirq.contrib.acquaintance.permutation import PermutationGate, update_mapping
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import operator
18
18
  import random
19
- from typing import Any, Callable, cast, Iterable, TYPE_CHECKING
19
+ from collections.abc import Callable, Iterable
20
+ from typing import Any, cast, TYPE_CHECKING
20
21
 
21
22
  from cirq import ops
22
23
 
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import math
18
- from typing import Any, cast, Iterator, Sequence, TYPE_CHECKING
18
+ from collections.abc import Iterator, Sequence
19
+ from typing import Any, cast, TYPE_CHECKING
19
20
 
20
21
  from sympy.combinatorics import GrayCode
21
22
 
@@ -70,7 +71,7 @@ def _generate_got_set_for_init_prob(qubit, init_prob):
70
71
  yield common_gates.ry(_prob_to_angle(init_prob)).on(qubit)
71
72
 
72
73
 
73
- @value.value_equality
74
+ @value.value_equality(unhashable=True)
74
75
  class BayesianNetworkGate(raw_types.Gate):
75
76
  """A gate that represents a Bayesian network.
76
77
 
@@ -15,7 +15,8 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import functools
18
- from typing import Any, Callable, cast, Generic, Iterator, TypeVar
18
+ from collections.abc import Callable, Iterator
19
+ from typing import Any, cast, Generic, TypeVar
19
20
 
20
21
  import networkx
21
22
 
@@ -72,8 +73,9 @@ class CircuitDag(networkx.DiGraph):
72
73
 
73
74
  def __init__(
74
75
  self,
75
- can_reorder: Callable[[cirq.Operation, cirq.Operation], bool] = _disjoint_qubits,
76
76
  incoming_graph_data: Any = None,
77
+ *,
78
+ can_reorder: Callable[[cirq.Operation, cirq.Operation], bool] = _disjoint_qubits,
77
79
  ) -> None:
78
80
  """Initializes a CircuitDag.
79
81
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Generic, Sequence, TYPE_CHECKING
17
+ from collections.abc import Sequence
18
+ from typing import Any, Generic, TYPE_CHECKING
18
19
 
19
20
  from cirq import sim
20
21
  from cirq.sim.simulation_state import TSimulationState
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Sequence
17
+ from collections.abc import Sequence
18
18
 
19
19
  import numpy as np
20
20
  import sympy
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import abc
18
18
  import itertools
19
- from typing import Any, cast, Hashable, Iterable, NoReturn, TYPE_CHECKING
19
+ from collections.abc import Hashable, Iterable
20
+ from typing import Any, cast, NoReturn, TYPE_CHECKING
20
21
 
21
22
  from cirq import devices, ops, value
22
23
  from cirq.contrib.graph_device.hypergraph import UndirectedHypergraph
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Hashable, Iterable
17
+ from collections.abc import Hashable, Iterable
18
+ from typing import Any
18
19
 
19
20
  import pytest
20
21
 
@@ -16,7 +16,8 @@ from __future__ import annotations
16
16
 
17
17
  import itertools
18
18
  import random
19
- from typing import Any, Hashable, Iterable, Mapping
19
+ from collections.abc import Hashable, Iterable, Mapping
20
+ from typing import Any
20
21
 
21
22
  AdjacencyList = set[frozenset[Hashable]]
22
23
 
@@ -14,7 +14,8 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Any, Hashable, Iterable, Mapping
17
+ from collections.abc import Hashable, Iterable, Mapping
18
+ from typing import Any
18
19
 
19
20
  from cirq import devices, ops
20
21
  from cirq.contrib.graph_device.graph_device import UndirectedGraphDevice, UndirectedGraphDeviceEdge
cirq/contrib/json.py CHANGED
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
 
6
6
  import functools
7
7
 
8
+ from cirq import _compat
8
9
  from cirq.protocols.json_serialization import _register_resolver, DEFAULT_RESOLVERS, ObjectFactory
9
10
 
10
11
 
@@ -39,6 +40,17 @@ def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
39
40
  return {cls.__name__: cls for cls in classes}
40
41
 
41
42
 
42
- DEFAULT_CONTRIB_RESOLVERS = [contrib_class_resolver] + DEFAULT_RESOLVERS
43
-
44
43
  _register_resolver(_class_resolver_dictionary)
44
+
45
+ DEFAULT_CONTRIB_RESOLVERS = [contrib_class_resolver, *DEFAULT_RESOLVERS]
46
+
47
+ _compat.deprecate_attributes(
48
+ __name__,
49
+ {
50
+ 'DEFAULT_CONTRIB_RESOLVERS': (
51
+ 'v1.8',
52
+ 'DEFAULT_CONTRIB_RESOLVERS is no longer necessary as contrib classes are now '
53
+ 'automatically recognized and resolved with an import of cirq.contrib.',
54
+ )
55
+ },
56
+ )
@@ -0,0 +1,10 @@
1
+ {
2
+ "cirq_type": "BayesianNetworkGate",
3
+ "init_probs": [
4
+ ["q0", 0.125],
5
+ ["q1", null]
6
+ ],
7
+ "arc_probs": [
8
+ ["q1", ["q0"], [0.25, 0.5]]
9
+ ]
10
+ }
@@ -0,0 +1,3 @@
1
+ cirq.contrib.bayesian_network.BayesianNetworkGate(
2
+ init_probs=[('q0', 0.125), ('q1', None)], arc_probs=[('q1', ('q0',), [0.25, 0.5])]
3
+ )
@@ -0,0 +1,169 @@
1
+ {
2
+ "cirq_type": "QuantumVolumeResult",
3
+ "model_circuit": {
4
+ "cirq_type": "Circuit",
5
+ "moments": [
6
+ {
7
+ "cirq_type": "Moment",
8
+ "operations": [
9
+ {
10
+ "cirq_type": "GateOperation",
11
+ "gate": {
12
+ "cirq_type": "HPowGate",
13
+ "exponent": 1.0,
14
+ "global_shift": 0.0
15
+ },
16
+ "qubits": [
17
+ {
18
+ "cirq_type": "LineQubit",
19
+ "x": 0
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ "cirq_type": "GateOperation",
25
+ "gate": {
26
+ "cirq_type": "HPowGate",
27
+ "exponent": 1.0,
28
+ "global_shift": 0.0
29
+ },
30
+ "qubits": [
31
+ {
32
+ "cirq_type": "LineQubit",
33
+ "x": 1
34
+ }
35
+ ]
36
+ },
37
+ {
38
+ "cirq_type": "GateOperation",
39
+ "gate": {
40
+ "cirq_type": "HPowGate",
41
+ "exponent": 1.0,
42
+ "global_shift": 0.0
43
+ },
44
+ "qubits": [
45
+ {
46
+ "cirq_type": "LineQubit",
47
+ "x": 2
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ "cirq_type": "GateOperation",
53
+ "gate": {
54
+ "cirq_type": "HPowGate",
55
+ "exponent": 1.0,
56
+ "global_shift": 0.0
57
+ },
58
+ "qubits": [
59
+ {
60
+ "cirq_type": "LineQubit",
61
+ "x": 3
62
+ }
63
+ ]
64
+ },
65
+ {
66
+ "cirq_type": "GateOperation",
67
+ "gate": {
68
+ "cirq_type": "HPowGate",
69
+ "exponent": 1.0,
70
+ "global_shift": 0.0
71
+ },
72
+ "qubits": [
73
+ {
74
+ "cirq_type": "LineQubit",
75
+ "x": 4
76
+ }
77
+ ]
78
+ }
79
+ ]
80
+ }
81
+ ]
82
+ },
83
+ "heavy_set": [
84
+ 1,
85
+ 2,
86
+ 3
87
+ ],
88
+ "compiled_circuit": {
89
+ "cirq_type": "Circuit",
90
+ "moments": [
91
+ {
92
+ "cirq_type": "Moment",
93
+ "operations": [
94
+ {
95
+ "cirq_type": "GateOperation",
96
+ "gate": {
97
+ "cirq_type": "HPowGate",
98
+ "exponent": 1.0,
99
+ "global_shift": 0.0
100
+ },
101
+ "qubits": [
102
+ {
103
+ "cirq_type": "LineQubit",
104
+ "x": 0
105
+ }
106
+ ]
107
+ },
108
+ {
109
+ "cirq_type": "GateOperation",
110
+ "gate": {
111
+ "cirq_type": "HPowGate",
112
+ "exponent": 1.0,
113
+ "global_shift": 0.0
114
+ },
115
+ "qubits": [
116
+ {
117
+ "cirq_type": "LineQubit",
118
+ "x": 1
119
+ }
120
+ ]
121
+ },
122
+ {
123
+ "cirq_type": "GateOperation",
124
+ "gate": {
125
+ "cirq_type": "HPowGate",
126
+ "exponent": 1.0,
127
+ "global_shift": 0.0
128
+ },
129
+ "qubits": [
130
+ {
131
+ "cirq_type": "LineQubit",
132
+ "x": 2
133
+ }
134
+ ]
135
+ },
136
+ {
137
+ "cirq_type": "GateOperation",
138
+ "gate": {
139
+ "cirq_type": "HPowGate",
140
+ "exponent": 1.0,
141
+ "global_shift": 0.0
142
+ },
143
+ "qubits": [
144
+ {
145
+ "cirq_type": "LineQubit",
146
+ "x": 3
147
+ }
148
+ ]
149
+ },
150
+ {
151
+ "cirq_type": "GateOperation",
152
+ "gate": {
153
+ "cirq_type": "HPowGate",
154
+ "exponent": 1.0,
155
+ "global_shift": 0.0
156
+ },
157
+ "qubits": [
158
+ {
159
+ "cirq_type": "LineQubit",
160
+ "x": 4
161
+ }
162
+ ]
163
+ }
164
+ ]
165
+ }
166
+ ]
167
+ },
168
+ "sampler_result": 0.1
169
+ }
@@ -0,0 +1,22 @@
1
+ cirq.contrib.quantum_volume.QuantumVolumeResult(
2
+ model_circuit=cirq.Circuit(
3
+ cirq.Moment(
4
+ cirq.H(cirq.LineQubit(0)),
5
+ cirq.H(cirq.LineQubit(1)),
6
+ cirq.H(cirq.LineQubit(2)),
7
+ cirq.H(cirq.LineQubit(3)),
8
+ cirq.H(cirq.LineQubit(4)),
9
+ )
10
+ ),
11
+ heavy_set=[1, 2, 3],
12
+ compiled_circuit=cirq.Circuit(
13
+ cirq.Moment(
14
+ cirq.H(cirq.LineQubit(0)),
15
+ cirq.H(cirq.LineQubit(1)),
16
+ cirq.H(cirq.LineQubit(2)),
17
+ cirq.H(cirq.LineQubit(3)),
18
+ cirq.H(cirq.LineQubit(4)),
19
+ )
20
+ ),
21
+ sampler_result=0.1,
22
+ )
@@ -0,0 +1,3 @@
1
+ {
2
+ "cirq_type": "SwapPermutationGate"
3
+ }
@@ -0,0 +1 @@
1
+ cirq.contrib.acquaintance.SwapPermutationGate(swap_gate=cirq.SWAP)
@@ -27,6 +27,4 @@ TestSpec = ModuleJsonTestSpec(
27
27
  should_not_be_serialized=["Unique", "CircuitDag"],
28
28
  resolver_cache=_class_resolver_dictionary(),
29
29
  deprecated={},
30
- # TODO: #7520 - create .json and .repr for these so they can be tested here
31
- tested_elsewhere=["QuantumVolumeResult", "SwapPermutationGate", "BayesianNetworkGate"],
32
30
  )
@@ -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, devices, ops, value
20
21
  from cirq.devices.noise_model import validate_all_measurements
@@ -21,8 +21,26 @@ from cirq.contrib.paulistring.clifford_target_gateset import CliffordTargetGates
21
21
 
22
22
 
23
23
  def clifford_optimized_circuit(circuit: circuits.Circuit, atol: float = 1e-8) -> circuits.Circuit:
24
- # Convert to a circuit with SingleQubitCliffordGates,
25
- # CZs and other ignored gates
24
+ """Optimizes a circuit composed of Clifford and CZ gates.
25
+
26
+ This function attempts to simplify a circuit by finding local optimizations.
27
+ It works in two stages:
28
+ 1. It converts the circuit to a target gateset consisting of
29
+ `cirq.SingleQubitCliffordGate` and `cirq.CZPowGate` gates.
30
+ 2. It then iterates through the circuit, applying the following rules:
31
+ - Merges adjacent single-qubit Clifford gates.
32
+ - Commutes single-qubit Clifford gates past CZ gates, attempting to
33
+ merge them with other single-qubit Clifford gates.
34
+ - Cancels pairs of identical CZ gates.
35
+
36
+ Args:
37
+ circuit: The circuit to optimize.
38
+ atol: A limit on the amount of absolute error introduced by the decomposition.
39
+
40
+ Returns:
41
+ The optimized circuit.
42
+ """
43
+ # Convert to a circuit with SingleQubitCliffordGates, CZs and other ignored gates.
26
44
  c_cliff = transformers.optimize_for_target_gateset(
27
45
  circuit, gateset=CliffordTargetGateset(atol=atol)
28
46
  )
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Callable
17
+ from collections.abc import Callable
18
18
 
19
19
  from cirq import circuits, ops, transformers
20
20
  from cirq.contrib.paulistring.clifford_optimize import clifford_optimized_circuit