cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__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.

Potentially problematic release.


This version of cirq-core might be problematic. Click here for more details.

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,14 +12,18 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import List
15
+ from unittest import TestCase
16
+ from unittest.mock import Mock, patch
17
+
18
+ import pytest
19
+ import sympy
16
20
 
17
21
  import cirq
18
22
 
19
23
 
20
24
  def assert_optimizes(optimized: cirq.AbstractCircuit, expected: cirq.AbstractCircuit):
21
25
  # Ignore differences that would be caught by follow-up optimizations.
22
- followup_transformers: List[cirq.TRANSFORMER] = [
26
+ followup_transformers: list[cirq.TRANSFORMER] = [
23
27
  cirq.drop_negligible_operations,
24
28
  cirq.drop_empty_moments,
25
29
  ]
@@ -81,7 +85,7 @@ def test_merge_single_qubit_gates_to_phased_x_and_z_deep():
81
85
  cirq.testing.assert_same_circuits(c_new, c_expected)
82
86
 
83
87
 
84
- def _phxz(a: float, x: float, z: float):
88
+ def _phxz(a: float | sympy.Symbol, x: float | sympy.Symbol, z: float | sympy.Symbol):
85
89
  return cirq.PhasedXZGate(axis_phase_exponent=a, x_exponent=x, z_exponent=z)
86
90
 
87
91
 
@@ -221,13 +225,181 @@ def test_merge_single_qubit_moments_to_phxz_deep():
221
225
  )
222
226
 
223
227
 
224
- def test_merge_single_qubit_moments_to_phxz_global_phase():
228
+ def test_merge_single_qubit_gates_to_phxz_global_phase():
225
229
  c = cirq.Circuit(cirq.GlobalPhaseGate(1j).on())
226
230
  c2 = cirq.merge_single_qubit_gates_to_phxz(c)
227
231
  assert c == c2
228
232
 
229
233
 
230
- def test_merge_single_qubit_moments_to_phased_x_and_z_global_phase():
234
+ def test_merge_single_qubit_gates_to_phased_x_and_z_global_phase():
231
235
  c = cirq.Circuit(cirq.GlobalPhaseGate(1j).on())
232
236
  c2 = cirq.merge_single_qubit_gates_to_phased_x_and_z(c)
233
237
  assert c == c2
238
+
239
+
240
+ class TestMergeSingleQubitGatesSymbolized(TestCase):
241
+ """Test suite for merge_single_qubit_gates_to_phxz_symbolized."""
242
+
243
+ def test_case1(self):
244
+ """Test case diagram.
245
+ Input circuit:
246
+ 0: ───X─────────@────────H[ignore]─H──X──PhXZ(a=a0,x=x0,z=z0)──X──PhXZ(a=a1,x=x1,z=z1)───
247
+
248
+ 1: ───H^h_exp───@^cz_exp─────────────────────────────────────────────────────────────────
249
+ Expected output:
250
+ 0: ───PhXZ(a=-1,x=1,z=0)─────@──────────H[ignore]───PhXZ(a=a1,x=x1,z=z1)───
251
+
252
+ 1: ───PhXZ(a=a0,x=x0,z=z0)───@^cz_exp──────────────────────────────────────
253
+ """
254
+ a, b = cirq.LineQubit.range(2)
255
+ sa0, sa1 = [sympy.Symbol(a) for a in ["a0", "a1"]]
256
+ sx0, sx1 = [sympy.Symbol(x) for x in ["x0", "x1"]]
257
+ sz0, sz1 = [sympy.Symbol(z) for z in ["z0", "z1"]]
258
+ input_circuit = cirq.Circuit(
259
+ cirq.Moment(cirq.X(a), cirq.H(b) ** sympy.Symbol("h_exp")),
260
+ cirq.Moment(cirq.CZ(a, b) ** sympy.Symbol("cz_exp")),
261
+ cirq.Moment(cirq.H(a).with_tags("ignore")),
262
+ cirq.Moment(cirq.H(a)),
263
+ cirq.Moment(cirq.X(a)),
264
+ cirq.Moment(_phxz(sa0, sx0, sz0).on(a)),
265
+ cirq.Moment(cirq.X(a)),
266
+ cirq.Moment(_phxz(sa1, sx1, sz1).on(a)),
267
+ )
268
+ context = cirq.TransformerContext(tags_to_ignore=["ignore"])
269
+ sweep = cirq.Zip(
270
+ cirq.Points(key="h_exp", points=[0, 1]),
271
+ cirq.Points(key="cz_exp", points=[0, 1]),
272
+ cirq.Points(key="a0", points=[0, 1]),
273
+ cirq.Points(key="x0", points=[0, 1]),
274
+ cirq.Points(key="z0", points=[0, 1]),
275
+ cirq.Points(key="a1", points=[0, 1]),
276
+ cirq.Points(key="x1", points=[0, 1]),
277
+ cirq.Points(key="z1", points=[0, 1]),
278
+ )
279
+ output_circuit, new_sweep = cirq.merge_single_qubit_gates_to_phxz_symbolized(
280
+ input_circuit, context=context, sweep=sweep
281
+ )
282
+ expected = cirq.Circuit(
283
+ cirq.Moment(_phxz(-1, 1, 0).on(a), _phxz(sa0, sx0, sz0).on(b)),
284
+ cirq.Moment(cirq.CZ(a, b) ** sympy.Symbol("cz_exp")),
285
+ cirq.Moment(cirq.H(a).with_tags("ignore")),
286
+ cirq.Moment(_phxz(sa1, sx1, sz1).on(a)),
287
+ )
288
+ assert_optimizes(output_circuit, expected)
289
+
290
+ # Check the unitaries are preserved for each set of sweep parameterization.
291
+ for old_resolver, new_resolver in zip(sweep, new_sweep):
292
+ cirq.testing.assert_circuits_have_same_unitary_given_final_permutation(
293
+ cirq.resolve_parameters(input_circuit, old_resolver),
294
+ cirq.resolve_parameters(output_circuit, new_resolver),
295
+ {q: q for q in input_circuit.all_qubits()},
296
+ )
297
+
298
+ def test_with_gauge_compiling_as_sweep_success(self):
299
+ qubits = cirq.LineQubit.range(7)
300
+ c = cirq.Circuit(
301
+ cirq.Moment(cirq.H(qubits[0]), cirq.H(qubits[3])),
302
+ cirq.Moment(cirq.CZ(qubits[0], qubits[2]), cirq.CZ(qubits[3], qubits[5])),
303
+ cirq.Moment(cirq.CZ(qubits[0], qubits[1]), cirq.CZ(qubits[3], qubits[4])),
304
+ cirq.Moment(cirq.CZ(qubits[1], qubits[3]), cirq.CZ(qubits[4], qubits[6])),
305
+ cirq.Moment(cirq.M(*qubits, key='m')),
306
+ )
307
+ old_circuit, old_sweep = cirq.transformers.gauge_compiling.CZGaugeTransformer.as_sweep(
308
+ c, N=50
309
+ )
310
+ new_circuit, new_sweep = cirq.merge_single_qubit_gates_to_phxz_symbolized(
311
+ old_circuit, sweep=old_sweep
312
+ )
313
+ # Check the unitaries are preserved for each set of sweep parameterization.
314
+ for old_resolver, new_resolver in zip(old_sweep, new_sweep):
315
+ cirq.testing.assert_circuits_have_same_unitary_given_final_permutation(
316
+ cirq.resolve_parameters(old_circuit[0:-1], old_resolver),
317
+ cirq.resolve_parameters(new_circuit[0:-1], new_resolver),
318
+ {q: q for q in qubits},
319
+ )
320
+
321
+ def test_case_non_parameterized_singles(self):
322
+ """Test merge_single_qubit_gates_to_phxz_symbolized when all single qubit gates are not
323
+ parameterized."""
324
+
325
+ a, b = cirq.LineQubit.range(2)
326
+ input_circuit = cirq.Circuit(cirq.H(a), cirq.H(a), cirq.CZ(a, b) ** sympy.Symbol("exp"))
327
+ expected_circuit = cirq.merge_single_qubit_gates_to_phxz(input_circuit)
328
+ output_circuit, _ = cirq.merge_single_qubit_gates_to_phxz_symbolized(
329
+ input_circuit, sweep=cirq.Points(key="exp", points=[0.1, 0.2, 0.5])
330
+ )
331
+ assert_optimizes(output_circuit, expected_circuit)
332
+
333
+ def test_fail_different_structures_error(self):
334
+ """Tests that the function raises a ValueError if merged structures of the circuit differ
335
+ for different parameterizations."""
336
+ q0, q1 = cirq.LineQubit.range(2)
337
+ circuit = cirq.Circuit(cirq.H(q0) ** sympy.Symbol("exp"))
338
+ sweep = cirq.Points(key="exp", points=[0.1, 0.2])
339
+
340
+ with patch(
341
+ "cirq.protocols.resolve_parameters",
342
+ side_effect=[ # Mock the return values of resolve_parameters
343
+ cirq.Circuit(cirq.I(q0).with_tags("_tmp_symbolize_tag")),
344
+ cirq.Circuit(cirq.CZ(q0, q1)),
345
+ ],
346
+ ):
347
+ with pytest.raises(ValueError, match="Expect a PhasedXZGate or IdentityGate.*"):
348
+ cirq.merge_single_qubit_gates_to_phxz_symbolized(circuit, sweep=sweep)
349
+
350
+ def test_fail_unexpected_gate_error(self):
351
+ """Tests that the function raises a RuntimeError of unexpected gate."""
352
+ a, b = cirq.LineQubit.range(2)
353
+ circuit = cirq.Circuit(
354
+ cirq.H(a) ** sympy.Symbol("exp1"),
355
+ cirq.X(a),
356
+ cirq.CZ(a, b),
357
+ cirq.Y(a),
358
+ cirq.H(a) ** sympy.Symbol("exp2"),
359
+ )
360
+ sweep = cirq.Points(key="exp1", points=[0.1, 0.2]) * cirq.Points(
361
+ key="exp2", points=[0.1, 0.2]
362
+ )
363
+
364
+ mock_iter = Mock()
365
+ mock_iter.__next__ = Mock(return_value=2)
366
+
367
+ with patch(
368
+ "cirq.transformers.analytical_decompositions"
369
+ ".single_qubit_decompositions.single_qubit_matrix_to_phxz",
370
+ return_value=cirq.H,
371
+ ):
372
+ with pytest.raises(ValueError, match="Expect a PhasedXZGate or IdentityGate.*"):
373
+ cirq.merge_single_qubit_gates_to_phxz_symbolized(circuit, sweep=sweep)
374
+
375
+
376
+ def test_merge_single_qubit_moments_to_phxz_with_global_phase_in_first_moment():
377
+ q0 = cirq.LineQubit(0)
378
+ c_orig = cirq.Circuit(
379
+ cirq.Moment(cirq.Y(q0) ** 0.5, cirq.GlobalPhaseGate(1j**0.5).on()), cirq.Moment(cirq.X(q0))
380
+ )
381
+ c_expected = cirq.Circuit(
382
+ cirq.Moment(
383
+ cirq.PhasedXZGate(axis_phase_exponent=-0.5, x_exponent=0.5, z_exponent=-1.0).on(q0),
384
+ cirq.GlobalPhaseGate(1j**0.5).on(),
385
+ )
386
+ )
387
+ context = cirq.TransformerContext(tags_to_ignore=["ignore"])
388
+ c_new = cirq.merge_single_qubit_moments_to_phxz(c_orig, context=context)
389
+ assert c_new == c_expected
390
+
391
+
392
+ def test_merge_single_qubit_moments_to_phxz_with_global_phase_in_second_moment():
393
+ q0 = cirq.LineQubit(0)
394
+ c_orig = cirq.Circuit(
395
+ cirq.Moment(cirq.Y(q0) ** 0.5), cirq.Moment(cirq.X(q0), cirq.GlobalPhaseGate(1j**0.5).on())
396
+ )
397
+ c_expected = cirq.Circuit(
398
+ cirq.Moment(
399
+ cirq.PhasedXZGate(axis_phase_exponent=-0.5, x_exponent=0.5, z_exponent=-1.0).on(q0),
400
+ cirq.GlobalPhaseGate(1j**0.5).on(),
401
+ )
402
+ )
403
+ context = cirq.TransformerContext(tags_to_ignore=["ignore"])
404
+ c_new = cirq.merge_single_qubit_moments_to_phxz(c_orig, context=context)
405
+ assert c_new == c_expected
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from collections.abc import Mapping
16
18
  from typing import cast
17
19
 
@@ -34,7 +36,7 @@ class DepolarizingNoiseTransformer:
34
36
 
35
37
  Attrs:
36
38
  p: The probability with which to add noise.
37
- target_gate: Add depolarizing nose after this type of gate
39
+ target_gate: Add depolarizing noise after this type of gate
38
40
  """
39
41
 
40
42
  def __init__(
@@ -56,7 +58,7 @@ class DepolarizingNoiseTransformer:
56
58
  if not isinstance(p, (Mapping, float)):
57
59
  raise TypeError( # pragma: no cover
58
60
  "p must either be a float or a mapping from" # pragma: no cover
59
- + "sorted qubit pairs to floats" # pragma: no cover
61
+ "sorted qubit pairs to floats" # pragma: no cover
60
62
  ) # pragma: no cover
61
63
  self.p = p
62
64
  self.p_func = (
@@ -86,7 +88,7 @@ class DepolarizingNoiseTransformer:
86
88
  rng = np.random.default_rng()
87
89
  target_gate = self.target_gate
88
90
 
89
- # add random Pauli gates with probability p after each of the specified gate
91
+ # add random Pauli gates with probability p after each specified gate
90
92
  assert target_gate.num_qubits() == 2, "`target_gate` must be a two-qubit gate."
91
93
  paulis = [ops.I, ops.X, ops.Y, ops.Z]
92
94
  new_moments = []
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
 
17
19
  import cirq.transformers.noise_adding as na
@@ -14,7 +14,9 @@
14
14
 
15
15
  """Transformers to rewrite a circuit using gates from a given target gateset."""
16
16
 
17
- from typing import Callable, Hashable, Optional, Sequence, TYPE_CHECKING, Union
17
+ from __future__ import annotations
18
+
19
+ from typing import Callable, Hashable, Sequence, TYPE_CHECKING
18
20
 
19
21
  from cirq import circuits
20
22
  from cirq.protocols import decompose_protocol as dp
@@ -24,8 +26,8 @@ if TYPE_CHECKING:
24
26
  import cirq
25
27
 
26
28
 
27
- def _create_on_stuck_raise_error(gateset: 'cirq.Gateset'):
28
- def _value_error_describing_bad_operation(op: 'cirq.Operation') -> ValueError:
29
+ def _create_on_stuck_raise_error(gateset: cirq.Gateset):
30
+ def _value_error_describing_bad_operation(op: cirq.Operation) -> ValueError:
29
31
  return ValueError(f"Unable to convert {op} to target gateset {gateset!r}")
30
32
 
31
33
  return _value_error_describing_bad_operation
@@ -33,20 +35,20 @@ def _create_on_stuck_raise_error(gateset: 'cirq.Gateset'):
33
35
 
34
36
  @transformer_api.transformer
35
37
  def _decompose_operations_to_target_gateset(
36
- circuit: 'cirq.AbstractCircuit',
38
+ circuit: cirq.AbstractCircuit,
37
39
  *,
38
- context: Optional['cirq.TransformerContext'] = None,
39
- gateset: Optional['cirq.Gateset'] = None,
40
- decomposer: Callable[['cirq.Operation', int], dp.DecomposeResult] = lambda *_: NotImplemented,
40
+ context: cirq.TransformerContext | None = None,
41
+ gateset: cirq.Gateset | None = None,
42
+ decomposer: Callable[[cirq.Operation, int], dp.DecomposeResult] = lambda *_: NotImplemented,
41
43
  ignore_failures: bool = True,
42
44
  tags_to_decompose: Sequence[Hashable] = (),
43
- ) -> 'cirq.Circuit':
45
+ ) -> cirq.Circuit:
44
46
  """Decomposes every operation to `gateset` using `cirq.decompose` and `decomposer`.
45
47
 
46
48
  This transformer attempts to decompose every operation `op` in the given circuit to `gateset`
47
- using `cirq.decompose` protocol with `decomposer` used as an intercepting decomposer. This
48
- ensures that `op` is recursively decomposed using implicitly defined known decompositions
49
- (eg: in `_decompose_` magic method on the gaet class) till either `decomposer` knows how to
49
+ using the `cirq.decompose` protocol with `decomposer` used as an intercepting decomposer. This
50
+ ensures that `op` is recursively decomposed using implicitly defined known decompositions (e.g.
51
+ in the `_decompose_` magic method on the gate class) until either `decomposer` knows how to
50
52
  decompose the given operation or the given operation belongs to `gateset`.
51
53
 
52
54
  Args:
@@ -68,7 +70,7 @@ def _decompose_operations_to_target_gateset(
68
70
  ValueError: If any input operation fails to convert and `ignore_failures` is False.
69
71
  """
70
72
 
71
- def map_func(op: 'cirq.Operation', moment_index: int):
73
+ def map_func(op: cirq.Operation, moment_index: int):
72
74
  if (
73
75
  context
74
76
  and context.deep
@@ -97,13 +99,13 @@ def _decompose_operations_to_target_gateset(
97
99
 
98
100
  @transformer_api.transformer
99
101
  def optimize_for_target_gateset(
100
- circuit: 'cirq.AbstractCircuit',
102
+ circuit: cirq.AbstractCircuit,
101
103
  *,
102
- context: Optional['cirq.TransformerContext'] = None,
103
- gateset: Optional['cirq.CompilationTargetGateset'] = None,
104
+ context: cirq.TransformerContext | None = None,
105
+ gateset: cirq.CompilationTargetGateset | None = None,
104
106
  ignore_failures: bool = True,
105
- max_num_passes: Union[int, None] = 1,
106
- ) -> 'cirq.Circuit':
107
+ max_num_passes: int | None = 1,
108
+ ) -> cirq.Circuit:
107
109
  """Transforms the given circuit into an equivalent circuit using gates accepted by `gateset`.
108
110
 
109
111
  Repeat max_num_passes times or when `max_num_passes=None` until no further changes can be done
@@ -12,14 +12,18 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Union
15
+ from __future__ import annotations
16
+
17
+ from typing import TYPE_CHECKING
16
18
 
17
19
  import pytest
18
20
 
19
21
  import cirq
20
- from cirq.protocols.decompose_protocol import DecomposeResult
21
22
  from cirq.transformers.optimize_for_target_gateset import _decompose_operations_to_target_gateset
22
23
 
24
+ if TYPE_CHECKING:
25
+ from cirq.protocols.decompose_protocol import DecomposeResult
26
+
23
27
 
24
28
  def test_decompose_operations_raises_on_stuck():
25
29
  c_orig = cirq.Circuit(cirq.X(cirq.NamedQubit("q")).with_tags("ignore"))
@@ -37,7 +41,6 @@ def test_decompose_operations_raises_on_stuck():
37
41
  cirq.testing.assert_same_circuits(c_orig, c_new)
38
42
 
39
43
 
40
- # pylint: disable=line-too-long
41
44
  def test_decompose_operations_to_target_gateset_default():
42
45
  q = cirq.LineQubit.range(2)
43
46
  c_orig = cirq.Circuit(
@@ -70,7 +73,7 @@ m: ═════════════════════════
70
73
  1: ───────Y^-0.5───@───Y^0.5────@───Y^-0.5───@───Y^0.5───────×───────────╫───X───T───Y^-0.5───@───Y^0.5────@───Y^-0.5───@───Y^0.5───T───
71
74
  ║ ║
72
75
  m: ══════════════════════════════════════════════════════════════════════@═══^══════════════════════════════════════════════════════════
73
- ''',
76
+ ''', # noqa: E501
74
77
  )
75
78
 
76
79
 
@@ -121,7 +124,7 @@ class MatrixGateTargetGateset(cirq.CompilationTargetGateset):
121
124
  def num_qubits(self) -> int:
122
125
  return 2
123
126
 
124
- def decompose_to_target_gateset(self, op: 'cirq.Operation', _) -> DecomposeResult:
127
+ def decompose_to_target_gateset(self, op: cirq.Operation, _) -> DecomposeResult:
125
128
  if cirq.num_qubits(op) != 2 or not cirq.has_unitary(op):
126
129
  return NotImplemented
127
130
  return cirq.MatrixGate(cirq.unitary(op), name="M").on(*op.qubits)
@@ -188,7 +191,7 @@ m: ═════════════════════@═══^═
188
191
  ║ ║
189
192
  m: ═══════════════════════════════════════════════════════════════@═══^═════════════════════════════════════════════════════════
190
193
  └────────┘ └────────┘ └────────┘
191
- ''',
194
+ ''', # noqa: E501
192
195
  )
193
196
 
194
197
  with pytest.raises(ValueError, match="Unable to convert"):
@@ -249,7 +252,7 @@ def test_optimize_for_target_gateset_deep():
249
252
 
250
253
 
251
254
  @pytest.mark.parametrize('max_num_passes', [2, None])
252
- def test_optimize_for_target_gateset_multiple_passes(max_num_passes: Union[int, None]):
255
+ def test_optimize_for_target_gateset_multiple_passes(max_num_passes: int | None):
253
256
  gateset = cirq.CZTargetGateset()
254
257
 
255
258
  input_circuit = cirq.Circuit(
@@ -328,7 +331,7 @@ def test_optimize_for_target_gateset_multiple_passes(max_num_passes: Union[int,
328
331
 
329
332
  @pytest.mark.parametrize('max_num_passes', [2, None])
330
333
  def test_optimize_for_target_gateset_multiple_passes_dont_preserve_moment_structure(
331
- max_num_passes: Union[int, None],
334
+ max_num_passes: int | None,
332
335
  ):
333
336
  gateset = cirq.CZTargetGateset(preserve_moment_structure=False)
334
337
 
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Dict, Optional, Set, Tuple, TYPE_CHECKING
15
+ from __future__ import annotations
16
+
17
+ from typing import TYPE_CHECKING
16
18
 
17
19
  from cirq import circuits, ops
18
20
 
@@ -21,8 +23,8 @@ if TYPE_CHECKING:
21
23
 
22
24
 
23
25
  def _get_qubit_mapping_first_and_last_moment(
24
- circuit: 'cirq.AbstractCircuit',
25
- ) -> Dict['cirq.Qid', Tuple[int, int]]:
26
+ circuit: cirq.AbstractCircuit,
27
+ ) -> dict[cirq.Qid, tuple[int, int]]:
26
28
  """Computes `(first_moment_idx, last_moment_idx)` tuple for each qubit in the input circuit.
27
29
 
28
30
  Args:
@@ -41,13 +43,13 @@ def _get_qubit_mapping_first_and_last_moment(
41
43
  return ret
42
44
 
43
45
 
44
- def _is_temp(q: 'cirq.Qid') -> bool:
46
+ def _is_temp(q: cirq.Qid) -> bool:
45
47
  return isinstance(q, (ops.CleanQubit, ops.BorrowableQubit))
46
48
 
47
49
 
48
50
  def map_clean_and_borrowable_qubits(
49
- circuit: 'cirq.AbstractCircuit', *, qm: Optional['cirq.QubitManager'] = None
50
- ) -> 'cirq.Circuit':
51
+ circuit: cirq.AbstractCircuit, *, qm: cirq.QubitManager | None = None
52
+ ) -> cirq.Circuit:
51
53
  """Uses `qm: QubitManager` to map all `CleanQubit`/`BorrowableQubit`s to system qubits.
52
54
 
53
55
  `CleanQubit` and `BorrowableQubit` are internal qubit types that are used as placeholder qubits
@@ -56,7 +58,7 @@ def map_clean_and_borrowable_qubits(
56
58
  This transformer uses the `QubitManager` provided in the input to:
57
59
  - Allocate clean ancilla qubits by delegating to `qm.qalloc` for all `CleanQubit`s.
58
60
  - Allocate dirty qubits for all `BorrowableQubit` types via the following two steps:
59
- 1. First analyse the input circuit and check if there are any suitable system qubits
61
+ 1. First analyze the input circuit and check if there are any suitable system qubits
60
62
  that can be borrowed, i.e. ones which do not have any overlapping operations
61
63
  between circuit[start_index : end_index] where `(start_index, end_index)` is the
62
64
  lifespan of temporary borrowable qubit under consideration. If yes, borrow the system
@@ -82,7 +84,7 @@ def map_clean_and_borrowable_qubits(
82
84
  circuit: Input `cirq.Circuit` containing temporarily allocated
83
85
  `CleanQubit`/`BorrowableQubit`s.
84
86
  qm: An instance of `cirq.QubitManager` specifying the strategy to use for allocating /
85
- / deallocating new ancilla qubits to replace the temporary qubits.
87
+ deallocating new ancilla qubits to replace the temporary qubits.
86
88
 
87
89
  Returns:
88
90
  An updated `cirq.Circuit` with all `CleanQubit`/`BorrowableQubit` mapped to either existing
@@ -97,11 +99,11 @@ def map_clean_and_borrowable_qubits(
97
99
  trivial_map = {q: q for q in all_qubits}
98
100
  # `allocated_map` maintains the mapping of all temporary qubits seen so far, mapping each of
99
101
  # them to either a newly allocated managed ancilla or an existing borrowed system qubit.
100
- allocated_map: Dict['cirq.Qid', 'cirq.Qid'] = {}
101
- to_free: Set['cirq.Qid'] = set()
102
+ allocated_map: dict[cirq.Qid, cirq.Qid] = {}
103
+ to_free: set[cirq.Qid] = set()
102
104
  last_op_idx = -1
103
105
 
104
- def map_func(op: 'cirq.Operation', idx: int) -> 'cirq.OP_TREE':
106
+ def map_func(op: cirq.Operation, idx: int) -> cirq.OP_TREE:
105
107
  nonlocal last_op_idx, to_free
106
108
  assert isinstance(qm, ops.QubitManager)
107
109
 
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import cirq
16
18
 
17
19
 
@@ -66,7 +68,7 @@ def get_decompose_func(gate_type, qm):
66
68
  return decompose_func
67
69
 
68
70
 
69
- def test_map_clean_and_borrowable_qubits_greedy_types():
71
+ def test_map_clean_and_borrowable_qubits_greedy_types() -> None:
70
72
  qm = cirq.ops.SimpleQubitManager()
71
73
  q = cirq.LineQubit.range(2)
72
74
  g = GateAllocInDecompose(1)
@@ -130,7 +132,7 @@ ancilla_1: ───X───X───
130
132
  )
131
133
 
132
134
 
133
- def test_map_clean_and_borrowable_qubits_borrows():
135
+ def test_map_clean_and_borrowable_qubits_borrows() -> None:
134
136
  qm = cirq.ops.SimpleQubitManager()
135
137
  op = GateAllocAndBorrowInDecompose(3).on(cirq.NamedQubit("original"))
136
138
  extra = cirq.LineQubit.range(3)
@@ -233,7 +235,7 @@ original: ────@───@───@───@─────@───@
233
235
  )
234
236
 
235
237
 
236
- def test_map_clean_and_borrowable_qubits_deallocates_only_once():
238
+ def test_map_clean_and_borrowable_qubits_deallocates_only_once() -> None:
237
239
  q = [cirq.ops.BorrowableQubit(i) for i in range(2)] + [cirq.q('q')]
238
240
  circuit = cirq.Circuit(cirq.X.on_each(*q), cirq.Y(q[1]), cirq.Z(q[1]))
239
241
  greedy_mm = cirq.GreedyQubitManager(prefix="a", size=2)
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from collections.abc import Sequence
16
18
  from typing import Any
17
19
 
@@ -32,23 +34,23 @@ class RandomizedMeasurements:
32
34
  For more details on the randomized measurement toolbox see https://arxiv.org/abs/2203.11374
33
35
 
34
36
  Args:
35
- subsystem: The specific subsystem (e.g qubit index) to measure in random basis
36
- rest of the qubits are measured in the computational basis
37
+ subsystem: The specific subsystem (e.g., qubit index) to measure in a random basis.
38
+ The rest of the qubits are measured in the computational basis.
37
39
  """
38
40
  self.subsystem = subsystem
39
41
 
40
42
  def __call__(
41
43
  self,
42
- circuit: "cirq.AbstractCircuit",
44
+ circuit: cirq.AbstractCircuit,
43
45
  unitary_ensemble: str = "pauli",
44
46
  rng: np.random.Generator | None = None,
45
47
  *,
46
48
  context: transformer_api.TransformerContext | None = None,
47
- ) -> "cirq.Circuit":
49
+ ) -> cirq.Circuit:
48
50
  """Apply the transformer to the given circuit. Given an input circuit returns
49
- a new circuit with the pre-measurement unitaries and measurements gates added.
50
- to the qubits in the subsystem provided.If no subsystem is specified in the
51
- construction of this class it defaults to measuring all the qubits in the
51
+ a new circuit with the pre-measurement unitaries and measurement gates added
52
+ to the qubits in the subsystem provided. If no subsystem is specified in the
53
+ construction of this class, it defaults to measuring all the qubits in the
52
54
  randomized bases.
53
55
 
54
56
  Args:
@@ -80,7 +82,7 @@ class RandomizedMeasurements:
80
82
 
81
83
  def random_single_qubit_unitary_moment(
82
84
  self, unitary_ensemble: str, qubits: Sequence[Any], rng: np.random.Generator
83
- ) -> "cirq.Moment":
85
+ ) -> cirq.Moment:
84
86
  """Outputs the cirq moment associated with the pre-measurement rotations.
85
87
 
86
88
  Args:
@@ -115,7 +117,7 @@ class RandomizedMeasurements:
115
117
  return cirq.Moment.from_ops(*op_list)
116
118
 
117
119
 
118
- def _pauli_basis_rotation(rng: np.random.Generator) -> "cirq.Gate":
120
+ def _pauli_basis_rotation(rng: np.random.Generator) -> cirq.Gate:
119
121
  """Randomly generate a Pauli basis rotation.
120
122
 
121
123
  Args:
@@ -127,7 +129,7 @@ def _pauli_basis_rotation(rng: np.random.Generator) -> "cirq.Gate":
127
129
  basis_idx = rng.choice(np.arange(3))
128
130
 
129
131
  if basis_idx == 0:
130
- gate: "cirq.Gate" = cirq.Ry(rads=-np.pi / 2)
132
+ gate: cirq.Gate = cirq.Ry(rads=-np.pi / 2)
131
133
  elif basis_idx == 1:
132
134
  gate = cirq.Rx(rads=np.pi / 2)
133
135
  else:
@@ -135,8 +137,8 @@ def _pauli_basis_rotation(rng: np.random.Generator) -> "cirq.Gate":
135
137
  return gate
136
138
 
137
139
 
138
- def _single_qubit_clifford(rng: np.random.Generator) -> "cirq.Gate":
139
- """Randomly generate a single-qubit Clifford rotation.
140
+ def _single_qubit_clifford(rng: np.random.Generator) -> cirq.Gate:
141
+ """Randomly generates a single-qubit Clifford rotation.
140
142
 
141
143
  Args:
142
144
  rng: Random number generator
@@ -153,8 +155,8 @@ def _single_qubit_clifford(rng: np.random.Generator) -> "cirq.Gate":
153
155
  )
154
156
 
155
157
 
156
- def _single_qubit_cue(rng: np.random.Generator) -> "cirq.Gate":
157
- """Randomly generate a CUE gate.
158
+ def _single_qubit_cue(rng: np.random.Generator) -> cirq.Gate:
159
+ """Randomly generates a CUE gate.
158
160
 
159
161
  Args:
160
162
  rng: Random number generator
@@ -12,13 +12,15 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import pytest
16
18
 
17
19
  import cirq
18
20
  import cirq.transformers.randomized_measurements as rand_meas
19
21
 
20
22
 
21
- def test_randomized_measurements_appends_two_moments_on_returned_circuit():
23
+ def test_randomized_measurements_appends_two_moments_on_returned_circuit() -> None:
22
24
  # Create a 4-qubit circuit
23
25
  q0, q1, q2, q3 = cirq.LineQubit.range(4)
24
26
  circuit_pre = cirq.Circuit(
@@ -34,7 +36,9 @@ def test_randomized_measurements_appends_two_moments_on_returned_circuit():
34
36
  assert num_moments_post == num_moments_pre + 2
35
37
 
36
38
 
37
- def test_append_randomized_measurements_leaves_qubits_not_in_specified_subsystem_unchanged():
39
+ def test_append_randomized_measurements_leaves_qubits_not_in_specified_subsystem_unchanged() -> (
40
+ None
41
+ ):
38
42
  # Create a 4-qubit circuit
39
43
  q0, q1, q2, q3 = cirq.LineQubit.range(4)
40
44
  circuit = cirq.Circuit([cirq.H(q0), cirq.CNOT(q0, q1), cirq.CNOT(q1, q2), cirq.CNOT(q2, q3)])
@@ -46,7 +50,9 @@ def test_append_randomized_measurements_leaves_qubits_not_in_specified_subsystem
46
50
  assert circuit.operation_at(q3, 4) is None
47
51
 
48
52
 
49
- def test_append_randomized_measurements_leaves_qubits_not_in_noncontinuous_subsystem_unchanged():
53
+ def test_append_random_measurements_leaves_qubits_not_in_noncontinuous_subsystem_unchanged() -> (
54
+ None
55
+ ):
50
56
  # Create a 4-qubit circuit
51
57
  q0, q1, q2, q3 = cirq.LineQubit.range(4)
52
58
  circuit = cirq.Circuit([cirq.H(q0), cirq.CNOT(q0, q1), cirq.CNOT(q1, q2), cirq.CNOT(q2, q3)])
@@ -59,7 +65,7 @@ def test_append_randomized_measurements_leaves_qubits_not_in_noncontinuous_subsy
59
65
  assert circuit.operation_at(q3, 4) is None
60
66
 
61
67
 
62
- def test_exception():
68
+ def test_exception() -> None:
63
69
  q0, q1, q2, q3 = cirq.LineQubit.range(4)
64
70
  circuit = cirq.Circuit([cirq.H(q0), cirq.CNOT(q0, q1), cirq.CNOT(q1, q2), cirq.CNOT(q2, q3)])
65
71