cirq-core 1.4.0.dev20240529225110__py3-none-any.whl → 1.5.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 (590) hide show
  1. cirq/__init__.py +587 -569
  2. cirq/_compat.py +9 -0
  3. cirq/_compat_test.py +11 -9
  4. cirq/_import.py +7 -8
  5. cirq/_version.py +31 -1
  6. cirq/_version_test.py +1 -1
  7. cirq/circuits/__init__.py +15 -9
  8. cirq/circuits/_block_diagram_drawer.py +1 -2
  9. cirq/circuits/_block_diagram_drawer_test.py +3 -3
  10. cirq/circuits/_box_drawing_character_data.py +0 -1
  11. cirq/circuits/_box_drawing_character_data_test.py +2 -2
  12. cirq/circuits/_bucket_priority_queue.py +0 -1
  13. cirq/circuits/_bucket_priority_queue_test.py +1 -1
  14. cirq/circuits/circuit.py +336 -234
  15. cirq/circuits/circuit_operation.py +102 -52
  16. cirq/circuits/circuit_operation_test.py +85 -4
  17. cirq/circuits/circuit_test.py +101 -32
  18. cirq/circuits/frozen_circuit.py +36 -32
  19. cirq/circuits/insert_strategy.py +10 -0
  20. cirq/circuits/insert_strategy_test.py +20 -0
  21. cirq/circuits/moment.py +79 -80
  22. cirq/circuits/moment_test.py +105 -2
  23. cirq/circuits/optimization_pass.py +15 -15
  24. cirq/circuits/optimization_pass_test.py +8 -9
  25. cirq/circuits/qasm_output.py +64 -33
  26. cirq/circuits/qasm_output_test.py +63 -2
  27. cirq/circuits/text_diagram_drawer.py +26 -56
  28. cirq/circuits/text_diagram_drawer_test.py +5 -4
  29. cirq/contrib/__init__.py +2 -2
  30. cirq/contrib/acquaintance/__init__.py +44 -29
  31. cirq/contrib/acquaintance/bipartite.py +8 -7
  32. cirq/contrib/acquaintance/bipartite_test.py +11 -1
  33. cirq/contrib/acquaintance/devices.py +5 -4
  34. cirq/contrib/acquaintance/devices_test.py +5 -1
  35. cirq/contrib/acquaintance/executor.py +18 -21
  36. cirq/contrib/acquaintance/executor_test.py +3 -2
  37. cirq/contrib/acquaintance/gates.py +36 -27
  38. cirq/contrib/acquaintance/gates_test.py +1 -1
  39. cirq/contrib/acquaintance/inspection_utils.py +10 -9
  40. cirq/contrib/acquaintance/inspection_utils_test.py +6 -1
  41. cirq/contrib/acquaintance/mutation_utils.py +10 -10
  42. cirq/contrib/acquaintance/optimizers.py +7 -6
  43. cirq/contrib/acquaintance/optimizers_test.py +1 -1
  44. cirq/contrib/acquaintance/permutation.py +22 -21
  45. cirq/contrib/acquaintance/permutation_test.py +1 -1
  46. cirq/contrib/acquaintance/shift.py +8 -6
  47. cirq/contrib/acquaintance/shift_swap_network.py +6 -4
  48. cirq/contrib/acquaintance/strategies/__init__.py +9 -3
  49. cirq/contrib/acquaintance/strategies/complete.py +4 -3
  50. cirq/contrib/acquaintance/strategies/cubic.py +5 -3
  51. cirq/contrib/acquaintance/strategies/quartic_paired.py +8 -6
  52. cirq/contrib/acquaintance/topological_sort.py +4 -2
  53. cirq/contrib/bayesian_network/__init__.py +3 -1
  54. cirq/contrib/bayesian_network/bayesian_network_gate.py +5 -3
  55. cirq/contrib/circuitdag/__init__.py +1 -1
  56. cirq/contrib/circuitdag/circuit_dag.py +24 -24
  57. cirq/contrib/circuitdag/circuit_dag_test.py +1 -1
  58. cirq/contrib/custom_simulators/custom_state_simulator.py +10 -8
  59. cirq/contrib/custom_simulators/custom_state_simulator_test.py +15 -11
  60. cirq/contrib/graph_device/__init__.py +8 -8
  61. cirq/contrib/graph_device/graph_device.py +8 -8
  62. cirq/contrib/graph_device/graph_device_test.py +0 -1
  63. cirq/contrib/graph_device/hypergraph_test.py +1 -0
  64. cirq/contrib/json.py +1 -2
  65. cirq/contrib/json_test.py +2 -2
  66. cirq/contrib/noise_models/__init__.py +5 -6
  67. cirq/contrib/noise_models/noise_models.py +8 -6
  68. cirq/contrib/paulistring/__init__.py +22 -10
  69. cirq/contrib/paulistring/clifford_optimize.py +1 -1
  70. cirq/contrib/paulistring/clifford_optimize_test.py +0 -1
  71. cirq/contrib/paulistring/clifford_target_gateset.py +15 -12
  72. cirq/contrib/paulistring/optimize.py +2 -2
  73. cirq/contrib/paulistring/optimize_test.py +0 -1
  74. cirq/contrib/paulistring/pauli_string_dag_test.py +0 -1
  75. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +379 -0
  76. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +523 -0
  77. cirq/contrib/paulistring/pauli_string_optimize.py +3 -1
  78. cirq/contrib/paulistring/pauli_string_optimize_test.py +1 -3
  79. cirq/contrib/paulistring/recombine.py +2 -2
  80. cirq/contrib/paulistring/recombine_test.py +2 -2
  81. cirq/contrib/paulistring/separate.py +3 -4
  82. cirq/contrib/qasm_import/__init__.py +2 -2
  83. cirq/contrib/qasm_import/_lexer.py +21 -26
  84. cirq/contrib/qasm_import/_lexer_test.py +90 -6
  85. cirq/contrib/qasm_import/_parser.py +238 -47
  86. cirq/contrib/qasm_import/_parser_test.py +514 -59
  87. cirq/contrib/qasm_import/qasm_test.py +1 -1
  88. cirq/contrib/qcircuit/__init__.py +6 -4
  89. cirq/contrib/qcircuit/qcircuit_diagram.py +5 -2
  90. cirq/contrib/qcircuit/qcircuit_pdf.py +1 -2
  91. cirq/{experiments/grid_parallel_two_qubit_xeb_test.py → contrib/qcircuit/qcircuit_pdf_test.py} +13 -12
  92. cirq/contrib/qcircuit/qcircuit_test.py +1 -1
  93. cirq/contrib/quantum_volume/__init__.py +7 -7
  94. cirq/contrib/quantum_volume/quantum_volume.py +6 -11
  95. cirq/contrib/quantum_volume/quantum_volume_test.py +3 -1
  96. cirq/contrib/quimb/__init__.py +16 -13
  97. cirq/contrib/quimb/density_matrix.py +1 -1
  98. cirq/contrib/quimb/mps_simulator.py +27 -28
  99. cirq/contrib/quimb/mps_simulator_test.py +5 -0
  100. cirq/contrib/quimb/state_vector.py +3 -10
  101. cirq/contrib/quirk/__init__.py +1 -1
  102. cirq/contrib/quirk/export_to_quirk.py +3 -3
  103. cirq/contrib/routing/__init__.py +12 -9
  104. cirq/contrib/routing/device.py +1 -1
  105. cirq/contrib/routing/device_test.py +1 -2
  106. cirq/contrib/routing/greedy.py +7 -5
  107. cirq/contrib/routing/greedy_test.py +5 -3
  108. cirq/contrib/routing/initialization.py +3 -1
  109. cirq/contrib/routing/initialization_test.py +1 -1
  110. cirq/contrib/routing/swap_network.py +6 -6
  111. cirq/contrib/routing/utils.py +6 -4
  112. cirq/contrib/routing/utils_test.py +1 -2
  113. cirq/{type_workarounds.py → contrib/shuffle_circuits/__init__.py} +5 -10
  114. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +250 -0
  115. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +363 -0
  116. cirq/contrib/svg/__init__.py +1 -1
  117. cirq/contrib/svg/svg.py +12 -10
  118. cirq/contrib/svg/svg_test.py +3 -2
  119. cirq/devices/__init__.py +34 -25
  120. cirq/devices/device.py +16 -12
  121. cirq/devices/device_test.py +1 -0
  122. cirq/devices/grid_device_metadata.py +16 -12
  123. cirq/devices/grid_device_metadata_test.py +2 -1
  124. cirq/devices/grid_qubit.py +31 -26
  125. cirq/devices/grid_qubit_test.py +30 -1
  126. cirq/devices/insertion_noise_model.py +6 -6
  127. cirq/devices/insertion_noise_model_test.py +1 -1
  128. cirq/devices/line_qubit.py +28 -20
  129. cirq/devices/line_qubit_test.py +26 -0
  130. cirq/devices/named_topologies.py +12 -10
  131. cirq/devices/named_topologies_test.py +5 -4
  132. cirq/devices/noise_model.py +29 -33
  133. cirq/devices/noise_properties.py +2 -2
  134. cirq/devices/noise_properties_test.py +2 -2
  135. cirq/devices/noise_utils.py +3 -3
  136. cirq/devices/superconducting_qubits_noise_properties.py +2 -2
  137. cirq/devices/superconducting_qubits_noise_properties_test.py +3 -3
  138. cirq/devices/thermal_noise_model.py +2 -1
  139. cirq/devices/unconstrained_device.py +1 -1
  140. cirq/devices/unconstrained_device_test.py +6 -0
  141. cirq/experiments/__init__.py +51 -34
  142. cirq/experiments/qubit_characterizations.py +17 -15
  143. cirq/experiments/qubit_characterizations_test.py +4 -6
  144. cirq/experiments/random_quantum_circuit_generation.py +10 -9
  145. cirq/experiments/random_quantum_circuit_generation_test.py +21 -4
  146. cirq/experiments/readout_confusion_matrix.py +73 -8
  147. cirq/experiments/readout_confusion_matrix_test.py +104 -1
  148. cirq/experiments/single_qubit_readout_calibration.py +8 -6
  149. cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
  150. cirq/experiments/t1_decay_experiment.py +4 -5
  151. cirq/experiments/t1_decay_experiment_test.py +1 -2
  152. cirq/experiments/t2_decay_experiment.py +0 -1
  153. cirq/experiments/t2_decay_experiment_test.py +1 -2
  154. cirq/experiments/two_qubit_xeb.py +157 -33
  155. cirq/experiments/two_qubit_xeb_test.py +38 -22
  156. cirq/experiments/xeb_fitting.py +99 -19
  157. cirq/experiments/xeb_fitting_test.py +64 -25
  158. cirq/experiments/xeb_sampling.py +14 -18
  159. cirq/experiments/xeb_simulation.py +4 -3
  160. cirq/experiments/xeb_simulation_test.py +20 -14
  161. cirq/experiments/z_phase_calibration.py +368 -0
  162. cirq/experiments/z_phase_calibration_test.py +241 -0
  163. cirq/interop/__init__.py +4 -1
  164. cirq/interop/quirk/__init__.py +7 -4
  165. cirq/interop/quirk/cells/__init__.py +17 -6
  166. cirq/interop/quirk/cells/arithmetic_cells.py +8 -8
  167. cirq/interop/quirk/cells/arithmetic_cells_test.py +1 -1
  168. cirq/interop/quirk/cells/cell.py +6 -6
  169. cirq/interop/quirk/cells/composite_cell.py +5 -5
  170. cirq/interop/quirk/cells/composite_cell_test.py +1 -1
  171. cirq/interop/quirk/cells/control_cells.py +1 -1
  172. cirq/interop/quirk/cells/frequency_space_cells.py +2 -2
  173. cirq/interop/quirk/cells/ignored_cells.py +1 -1
  174. cirq/interop/quirk/cells/input_cells.py +1 -1
  175. cirq/interop/quirk/cells/input_cells_test.py +1 -1
  176. cirq/interop/quirk/cells/input_rotation_cells.py +1 -1
  177. cirq/interop/quirk/cells/input_rotation_cells_test.py +1 -1
  178. cirq/interop/quirk/cells/measurement_cells.py +1 -1
  179. cirq/interop/quirk/cells/parse.py +8 -7
  180. cirq/interop/quirk/cells/parse_test.py +2 -2
  181. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +1 -1
  182. cirq/interop/quirk/cells/swap_cell_test.py +1 -1
  183. cirq/interop/quirk/cells/unsupported_cells.py +1 -1
  184. cirq/interop/quirk/url_to_circuit.py +7 -7
  185. cirq/interop/quirk/url_to_circuit_test.py +1 -1
  186. cirq/ion/__init__.py +4 -2
  187. cirq/json_resolver_cache.py +15 -7
  188. cirq/linalg/__init__.py +62 -51
  189. cirq/linalg/combinators.py +4 -4
  190. cirq/linalg/combinators_test.py +4 -1
  191. cirq/linalg/decompositions.py +15 -40
  192. cirq/linalg/decompositions_test.py +16 -22
  193. cirq/linalg/diagonalize.py +1 -1
  194. cirq/linalg/diagonalize_test.py +1 -1
  195. cirq/linalg/operator_spaces.py +20 -4
  196. cirq/linalg/operator_spaces_test.py +15 -2
  197. cirq/linalg/predicates.py +3 -3
  198. cirq/linalg/predicates_test.py +1 -0
  199. cirq/linalg/tolerance.py +2 -2
  200. cirq/linalg/transformations.py +30 -12
  201. cirq/linalg/transformations_test.py +13 -0
  202. cirq/neutral_atoms/__init__.py +2 -2
  203. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +0 -1
  204. cirq/ops/__init__.py +172 -132
  205. cirq/ops/arithmetic_operation.py +2 -2
  206. cirq/ops/arithmetic_operation_test.py +2 -2
  207. cirq/ops/boolean_hamiltonian.py +3 -2
  208. cirq/ops/classically_controlled_operation.py +39 -12
  209. cirq/ops/classically_controlled_operation_test.py +147 -1
  210. cirq/ops/clifford_gate.py +38 -36
  211. cirq/ops/clifford_gate_test.py +75 -1
  212. cirq/ops/common_channels.py +16 -45
  213. cirq/ops/common_channels_test.py +10 -0
  214. cirq/ops/common_gate_families.py +1 -1
  215. cirq/ops/common_gate_families_test.py +1 -0
  216. cirq/ops/common_gates.py +48 -49
  217. cirq/ops/common_gates_test.py +18 -2
  218. cirq/ops/control_values.py +3 -3
  219. cirq/ops/control_values_test.py +2 -1
  220. cirq/ops/controlled_gate.py +36 -23
  221. cirq/ops/controlled_gate_test.py +70 -3
  222. cirq/ops/controlled_operation.py +6 -5
  223. cirq/ops/controlled_operation_test.py +7 -3
  224. cirq/ops/dense_pauli_string.py +11 -11
  225. cirq/ops/diagonal_gate.py +2 -2
  226. cirq/ops/diagonal_gate_test.py +1 -0
  227. cirq/ops/eigen_gate.py +16 -36
  228. cirq/ops/eigen_gate_test.py +60 -10
  229. cirq/ops/fourier_transform.py +1 -3
  230. cirq/ops/fourier_transform_test.py +2 -1
  231. cirq/ops/fsim_gate.py +42 -3
  232. cirq/ops/fsim_gate_test.py +21 -0
  233. cirq/ops/gate_operation.py +8 -8
  234. cirq/ops/gate_operation_test.py +4 -2
  235. cirq/ops/gateset_test.py +11 -2
  236. cirq/ops/global_phase_op.py +8 -7
  237. cirq/ops/global_phase_op_test.py +1 -1
  238. cirq/ops/greedy_qubit_manager_test.py +5 -0
  239. cirq/ops/identity.py +14 -4
  240. cirq/ops/identity_test.py +24 -0
  241. cirq/ops/kraus_channel.py +1 -0
  242. cirq/ops/kraus_channel_test.py +3 -1
  243. cirq/ops/linear_combinations.py +27 -21
  244. cirq/ops/linear_combinations_test.py +23 -4
  245. cirq/ops/matrix_gates.py +24 -8
  246. cirq/ops/measure_util.py +2 -2
  247. cirq/ops/measurement_gate.py +7 -4
  248. cirq/ops/measurement_gate_test.py +2 -1
  249. cirq/ops/mixed_unitary_channel.py +1 -0
  250. cirq/ops/mixed_unitary_channel_test.py +3 -1
  251. cirq/ops/named_qubit.py +8 -1
  252. cirq/ops/op_tree.py +3 -30
  253. cirq/ops/op_tree_test.py +4 -0
  254. cirq/ops/parallel_gate.py +2 -3
  255. cirq/ops/parallel_gate_test.py +2 -1
  256. cirq/ops/parity_gates.py +7 -8
  257. cirq/ops/parity_gates_test.py +1 -0
  258. cirq/ops/pauli_gates.py +5 -11
  259. cirq/ops/pauli_gates_test.py +1 -0
  260. cirq/ops/pauli_interaction_gate.py +11 -5
  261. cirq/ops/pauli_interaction_gate_test.py +2 -3
  262. cirq/ops/pauli_measurement_gate.py +6 -5
  263. cirq/ops/pauli_measurement_gate_test.py +1 -0
  264. cirq/ops/pauli_string.py +115 -130
  265. cirq/ops/pauli_string_phasor.py +21 -20
  266. cirq/ops/pauli_string_phasor_test.py +13 -3
  267. cirq/ops/pauli_string_raw_types.py +1 -0
  268. cirq/ops/pauli_string_test.py +192 -55
  269. cirq/ops/pauli_sum_exponential.py +3 -4
  270. cirq/ops/pauli_sum_exponential_test.py +0 -1
  271. cirq/ops/permutation_gate.py +2 -2
  272. cirq/ops/permutation_gate_test.py +1 -1
  273. cirq/ops/phased_iswap_gate.py +6 -7
  274. cirq/ops/phased_iswap_gate_test.py +21 -5
  275. cirq/ops/phased_x_gate.py +11 -25
  276. cirq/ops/phased_x_gate_test.py +19 -3
  277. cirq/ops/phased_x_z_gate.py +12 -11
  278. cirq/ops/projector.py +4 -5
  279. cirq/ops/qubit_manager.py +2 -1
  280. cirq/ops/qubit_manager_test.py +2 -1
  281. cirq/ops/qubit_order.py +1 -1
  282. cirq/ops/random_gate_channel.py +1 -1
  283. cirq/ops/random_gate_channel_test.py +0 -6
  284. cirq/ops/raw_types.py +146 -50
  285. cirq/ops/raw_types_test.py +37 -3
  286. cirq/ops/state_preparation_channel.py +2 -2
  287. cirq/ops/state_preparation_channel_test.py +2 -1
  288. cirq/ops/swap_gates.py +9 -4
  289. cirq/ops/three_qubit_gates.py +8 -8
  290. cirq/ops/three_qubit_gates_test.py +1 -0
  291. cirq/ops/two_qubit_diagonal_gate.py +4 -3
  292. cirq/ops/uniform_superposition_gate.py +4 -4
  293. cirq/ops/uniform_superposition_gate_test.py +1 -0
  294. cirq/ops/wait_gate.py +6 -8
  295. cirq/protocols/__init__.py +135 -83
  296. cirq/protocols/act_on_protocol.py +1 -1
  297. cirq/protocols/act_on_protocol_test.py +1 -1
  298. cirq/protocols/apply_channel_protocol.py +3 -3
  299. cirq/protocols/apply_mixture_protocol.py +15 -9
  300. cirq/protocols/apply_mixture_protocol_test.py +11 -0
  301. cirq/protocols/apply_unitary_protocol.py +2 -2
  302. cirq/protocols/apply_unitary_protocol_test.py +2 -1
  303. cirq/protocols/approximate_equality_protocol.py +7 -8
  304. cirq/protocols/approximate_equality_protocol_test.py +3 -1
  305. cirq/protocols/circuit_diagram_info_protocol.py +8 -6
  306. cirq/protocols/circuit_diagram_info_protocol_test.py +5 -0
  307. cirq/protocols/commutes_protocol.py +6 -6
  308. cirq/protocols/control_key_protocol.py +1 -1
  309. cirq/protocols/decompose_protocol.py +4 -5
  310. cirq/protocols/decompose_protocol_test.py +2 -1
  311. cirq/protocols/equal_up_to_global_phase_protocol.py +3 -3
  312. cirq/protocols/equal_up_to_global_phase_protocol_test.py +7 -0
  313. cirq/protocols/has_stabilizer_effect_protocol.py +5 -5
  314. cirq/protocols/has_unitary_protocol.py +1 -1
  315. cirq/protocols/has_unitary_protocol_test.py +8 -7
  316. cirq/protocols/hash_from_pickle_test.py +120 -0
  317. cirq/protocols/inverse_protocol.py +1 -1
  318. cirq/protocols/json_serialization.py +14 -1
  319. cirq/protocols/json_serialization_test.py +28 -7
  320. cirq/protocols/json_test_data/BitMaskKeyCondition.json +86 -0
  321. cirq/protocols/json_test_data/BitMaskKeyCondition.repr +7 -0
  322. cirq/protocols/json_test_data/Concat.json +19 -0
  323. cirq/protocols/json_test_data/Concat.repr +1 -0
  324. cirq/protocols/json_test_data/README.md +4 -2
  325. cirq/protocols/json_test_data/SympyCondition.json +60 -15
  326. cirq/protocols/json_test_data/SympyCondition.repr +4 -1
  327. cirq/protocols/json_test_data/_InverseCompositeGate.json +10 -0
  328. cirq/protocols/json_test_data/_InverseCompositeGate.repr +1 -0
  329. cirq/protocols/json_test_data/__init__.py +1 -1
  330. cirq/protocols/json_test_data/sympy.And.json +13 -0
  331. cirq/protocols/json_test_data/sympy.And.repr +1 -0
  332. cirq/protocols/json_test_data/sympy.Indexed.json +18 -0
  333. cirq/protocols/json_test_data/sympy.Indexed.repr +1 -0
  334. cirq/protocols/json_test_data/sympy.IndexedBase.json +9 -0
  335. cirq/protocols/json_test_data/sympy.IndexedBase.repr +1 -0
  336. cirq/protocols/json_test_data/sympy.Not.json +9 -0
  337. cirq/protocols/json_test_data/sympy.Not.repr +1 -0
  338. cirq/protocols/json_test_data/sympy.Or.json +13 -0
  339. cirq/protocols/json_test_data/sympy.Or.repr +1 -0
  340. cirq/protocols/json_test_data/sympy.Xor.json +13 -0
  341. cirq/protocols/json_test_data/sympy.Xor.repr +1 -0
  342. cirq/protocols/kraus_protocol.py +8 -8
  343. cirq/protocols/kraus_protocol_test.py +0 -1
  344. cirq/protocols/measurement_key_protocol.py +1 -1
  345. cirq/protocols/measurement_key_protocol_test.py +7 -7
  346. cirq/protocols/mixture_protocol.py +6 -4
  347. cirq/protocols/mixture_protocol_test.py +21 -13
  348. cirq/protocols/pauli_expansion_protocol.py +1 -0
  349. cirq/protocols/pow_protocol.py +1 -1
  350. cirq/protocols/qasm.py +25 -6
  351. cirq/protocols/qasm_test.py +17 -0
  352. cirq/protocols/qid_shape_protocol.py +2 -2
  353. cirq/protocols/resolve_parameters.py +2 -3
  354. cirq/protocols/resolve_parameters_test.py +2 -1
  355. cirq/protocols/trace_distance_bound.py +1 -1
  356. cirq/protocols/trace_distance_bound_test.py +1 -0
  357. cirq/protocols/unitary_protocol.py +3 -3
  358. cirq/protocols/unitary_protocol_test.py +1 -1
  359. cirq/qis/__init__.py +48 -35
  360. cirq/qis/channels_test.py +0 -9
  361. cirq/qis/clifford_tableau.py +46 -26
  362. cirq/qis/clifford_tableau_test.py +2 -1
  363. cirq/qis/entropy.py +115 -0
  364. cirq/qis/entropy_test.py +43 -0
  365. cirq/qis/measures.py +5 -4
  366. cirq/qis/measures_test.py +7 -0
  367. cirq/qis/noise_utils_test.py +4 -4
  368. cirq/qis/quantum_state_representation.py +1 -1
  369. cirq/qis/states.py +7 -7
  370. cirq/sim/__init__.py +55 -37
  371. cirq/sim/classical_simulator.py +7 -6
  372. cirq/sim/classical_simulator_test.py +3 -1
  373. cirq/sim/clifford/__init__.py +17 -9
  374. cirq/sim/clifford/clifford_simulator.py +5 -4
  375. cirq/sim/clifford/clifford_simulator_test.py +32 -9
  376. cirq/sim/clifford/clifford_tableau_simulation_state.py +1 -1
  377. cirq/sim/clifford/stabilizer_simulation_state.py +1 -1
  378. cirq/sim/clifford/stabilizer_state_ch_form.py +4 -3
  379. cirq/sim/density_matrix_simulator.py +3 -2
  380. cirq/sim/density_matrix_simulator_test.py +12 -4
  381. cirq/sim/density_matrix_utils.py +1 -1
  382. cirq/sim/mux.py +2 -2
  383. cirq/sim/simulation_state.py +4 -5
  384. cirq/sim/simulation_state_base.py +2 -2
  385. cirq/sim/simulation_state_test.py +1 -1
  386. cirq/sim/simulation_utils.py +3 -1
  387. cirq/sim/simulation_utils_test.py +2 -3
  388. cirq/sim/simulator.py +7 -6
  389. cirq/sim/simulator_base.py +5 -5
  390. cirq/sim/simulator_test.py +14 -3
  391. cirq/sim/sparse_simulator.py +4 -3
  392. cirq/sim/sparse_simulator_test.py +17 -9
  393. cirq/sim/state_vector.py +2 -2
  394. cirq/sim/state_vector_simulation_state_test.py +1 -1
  395. cirq/sim/state_vector_simulator.py +4 -4
  396. cirq/sim/state_vector_test.py +27 -32
  397. cirq/study/__init__.py +27 -21
  398. cirq/study/flatten_expressions.py +5 -6
  399. cirq/study/flatten_expressions_test.py +1 -1
  400. cirq/study/resolver.py +14 -11
  401. cirq/study/resolver_test.py +10 -1
  402. cirq/study/result.py +3 -3
  403. cirq/study/sweepable.py +15 -9
  404. cirq/study/sweepable_test.py +27 -0
  405. cirq/study/sweeps.py +65 -10
  406. cirq/study/sweeps_test.py +123 -0
  407. cirq/testing/__init__.py +86 -57
  408. cirq/testing/_compat_test_data/module_a/__init__.py +2 -2
  409. cirq/testing/_compat_test_data/module_a/sub/subsub/__init__.py +1 -1
  410. cirq/testing/circuit_compare.py +3 -4
  411. cirq/testing/circuit_compare_test.py +7 -8
  412. cirq/testing/consistent_act_on.py +3 -3
  413. cirq/testing/consistent_channels_test.py +2 -1
  414. cirq/testing/consistent_controlled_gate_op.py +3 -2
  415. cirq/testing/consistent_controlled_gate_op_test.py +2 -3
  416. cirq/testing/consistent_decomposition.py +1 -1
  417. cirq/testing/consistent_decomposition_test.py +1 -2
  418. cirq/testing/consistent_pauli_expansion_test.py +1 -1
  419. cirq/testing/consistent_phase_by.py +1 -1
  420. cirq/testing/consistent_phase_by_test.py +1 -2
  421. cirq/testing/consistent_protocols.py +11 -11
  422. cirq/testing/consistent_protocols_test.py +4 -5
  423. cirq/testing/consistent_qasm.py +8 -12
  424. cirq/testing/consistent_qasm_test.py +1 -1
  425. cirq/testing/consistent_resolve_parameters.py +2 -1
  426. cirq/testing/consistent_specified_has_unitary_test.py +1 -1
  427. cirq/testing/consistent_unitary.py +3 -1
  428. cirq/testing/consistent_unitary_test.py +3 -3
  429. cirq/testing/devices.py +1 -1
  430. cirq/testing/devices_test.py +1 -0
  431. cirq/testing/equals_tester.py +2 -4
  432. cirq/testing/equals_tester_test.py +6 -5
  433. cirq/testing/equivalent_basis_map.py +1 -0
  434. cirq/testing/equivalent_basis_map_test.py +0 -1
  435. cirq/testing/gate_features_test.py +5 -0
  436. cirq/testing/json.py +4 -4
  437. cirq/testing/lin_alg_utils_test.py +1 -1
  438. cirq/testing/order_tester.py +1 -1
  439. cirq/testing/order_tester_test.py +1 -1
  440. cirq/testing/pytest_utils.py +57 -0
  441. cirq/testing/pytest_utils_test.py +35 -0
  442. cirq/testing/random_circuit.py +2 -2
  443. cirq/testing/random_circuit_test.py +2 -2
  444. cirq/testing/routing_devices_test.py +2 -1
  445. cirq/testing/sample_circuits.py +1 -1
  446. cirq/testing/sample_gates.py +5 -4
  447. cirq/testing/sample_gates_test.py +2 -2
  448. cirq/transformers/__init__.py +101 -82
  449. cirq/transformers/align.py +12 -1
  450. cirq/transformers/align_test.py +13 -0
  451. cirq/transformers/analytical_decompositions/__init__.py +27 -24
  452. cirq/transformers/analytical_decompositions/clifford_decomposition.py +2 -1
  453. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +1 -1
  454. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +1 -1
  455. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  456. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +1 -1
  457. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +1 -1
  458. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +2 -2
  459. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +4 -4
  460. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +99 -24
  461. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +105 -14
  462. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +1 -1
  463. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +1 -1
  464. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -0
  465. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +3 -4
  466. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +1 -1
  467. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +2 -1
  468. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -1
  469. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -6
  470. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +2 -2
  471. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +1 -1
  472. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +1 -2
  473. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -2
  474. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -2
  475. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -1
  476. cirq/transformers/drop_empty_moments.py +1 -0
  477. cirq/transformers/drop_negligible_operations.py +1 -0
  478. cirq/transformers/dynamical_decoupling.py +255 -43
  479. cirq/transformers/dynamical_decoupling_test.py +730 -17
  480. cirq/transformers/eject_phased_paulis.py +29 -15
  481. cirq/transformers/eject_phased_paulis_test.py +3 -8
  482. cirq/transformers/eject_z.py +3 -2
  483. cirq/transformers/eject_z_test.py +3 -3
  484. cirq/transformers/gauge_compiling/__init__.py +25 -9
  485. cirq/transformers/gauge_compiling/cphase_gauge.py +146 -0
  486. cirq/transformers/gauge_compiling/cphase_gauge_test.py +42 -0
  487. cirq/transformers/gauge_compiling/cz_gauge.py +4 -4
  488. cirq/transformers/gauge_compiling/gauge_compiling.py +245 -6
  489. cirq/transformers/gauge_compiling/gauge_compiling_test.py +107 -2
  490. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +39 -2
  491. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +10 -1
  492. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -2
  493. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -2
  494. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +23 -5
  495. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +3 -2
  496. cirq/transformers/heuristic_decompositions/__init__.py +3 -3
  497. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +2 -1
  498. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +1 -1
  499. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +4 -4
  500. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +4 -4
  501. cirq/transformers/insertion_sort.py +64 -0
  502. cirq/transformers/insertion_sort_test.py +34 -0
  503. cirq/transformers/measurement_transformers.py +14 -1
  504. cirq/transformers/measurement_transformers_test.py +35 -0
  505. cirq/transformers/merge_k_qubit_gates.py +2 -2
  506. cirq/transformers/merge_single_qubit_gates.py +1 -1
  507. cirq/transformers/merge_single_qubit_gates_test.py +1 -1
  508. cirq/transformers/noise_adding.py +115 -0
  509. cirq/transformers/noise_adding_test.py +54 -0
  510. cirq/transformers/optimize_for_target_gateset.py +1 -1
  511. cirq/transformers/optimize_for_target_gateset_test.py +3 -2
  512. cirq/transformers/qubit_management_transformers.py +1 -1
  513. cirq/transformers/randomized_measurements.py +171 -0
  514. cirq/transformers/randomized_measurements_test.py +68 -0
  515. cirq/transformers/routing/__init__.py +14 -5
  516. cirq/transformers/routing/initial_mapper.py +1 -1
  517. cirq/transformers/routing/initial_mapper_test.py +1 -0
  518. cirq/transformers/routing/line_initial_mapper.py +3 -2
  519. cirq/transformers/routing/mapping_manager.py +2 -2
  520. cirq/transformers/routing/mapping_manager_test.py +2 -2
  521. cirq/transformers/routing/route_circuit_cqc.py +3 -2
  522. cirq/transformers/routing/route_circuit_cqc_test.py +2 -1
  523. cirq/transformers/routing/visualize_routed_circuit.py +1 -0
  524. cirq/transformers/routing/visualize_routed_circuit_test.py +1 -0
  525. cirq/transformers/stratify.py +2 -2
  526. cirq/transformers/synchronize_terminal_measurements.py +2 -1
  527. cirq/transformers/target_gatesets/__init__.py +7 -5
  528. cirq/transformers/target_gatesets/compilation_target_gateset.py +16 -3
  529. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +2 -0
  530. cirq/transformers/target_gatesets/cz_gateset.py +5 -1
  531. cirq/transformers/target_gatesets/cz_gateset_test.py +23 -2
  532. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +1 -1
  533. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +3 -2
  534. cirq/transformers/transformer_api.py +5 -4
  535. cirq/transformers/transformer_api_test.py +11 -3
  536. cirq/transformers/transformer_primitives.py +9 -31
  537. cirq/transformers/transformer_primitives_test.py +6 -5
  538. cirq/value/__init__.py +51 -30
  539. cirq/value/abc_alt.py +1 -2
  540. cirq/value/angle.py +2 -0
  541. cirq/value/classical_data.py +1 -0
  542. cirq/value/condition.py +149 -3
  543. cirq/value/condition_test.py +254 -0
  544. cirq/value/digits.py +1 -1
  545. cirq/value/duration.py +4 -4
  546. cirq/value/duration_test.py +2 -1
  547. cirq/value/linear_dict.py +85 -24
  548. cirq/value/linear_dict_test.py +94 -3
  549. cirq/value/measurement_key.py +9 -2
  550. cirq/value/periodic_value.py +2 -3
  551. cirq/value/periodic_value_test.py +5 -0
  552. cirq/value/probability.py +1 -0
  553. cirq/value/random_state.py +1 -1
  554. cirq/value/timestamp.py +2 -4
  555. cirq/value/timestamp_test.py +2 -1
  556. cirq/value/type_alias.py +2 -2
  557. cirq/value/value_equality_attr.py +14 -2
  558. cirq/value/value_equality_attr_test.py +1 -1
  559. cirq/vis/__init__.py +9 -6
  560. cirq/vis/density_matrix.py +1 -1
  561. cirq/vis/density_matrix_test.py +2 -5
  562. cirq/vis/heatmap.py +49 -12
  563. cirq/vis/heatmap_test.py +168 -4
  564. cirq/vis/histogram.py +1 -1
  565. cirq/vis/histogram_test.py +1 -2
  566. cirq/vis/state_histogram.py +7 -5
  567. cirq/vis/state_histogram_test.py +2 -2
  568. cirq/work/__init__.py +19 -13
  569. cirq/work/collector.py +2 -2
  570. cirq/work/observable_grouping.py +2 -2
  571. cirq/work/observable_measurement.py +3 -3
  572. cirq/work/observable_measurement_data.py +5 -2
  573. cirq/work/observable_measurement_test.py +8 -8
  574. cirq/work/observable_readout_calibration.py +2 -2
  575. cirq/work/observable_readout_calibration_test.py +2 -1
  576. cirq/work/observable_settings.py +8 -7
  577. cirq/work/observable_settings_test.py +3 -2
  578. cirq/work/pauli_sum_collector.py +1 -1
  579. cirq/work/sampler.py +8 -20
  580. cirq/work/sampler_test.py +4 -3
  581. cirq/work/zeros_sampler.py +1 -1
  582. cirq_core-1.5.0.dist-info/METADATA +125 -0
  583. {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/RECORD +586 -552
  584. {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/WHEEL +1 -1
  585. cirq/experiments/grid_parallel_two_qubit_xeb.py +0 -62
  586. cirq/protocols/json_test_data/GridParallelXEBMetadata.json +0 -119
  587. cirq/protocols/json_test_data/GridParallelXEBMetadata.repr +0 -1
  588. cirq_core-1.4.0.dev20240529225110.dist-info/METADATA +0 -50
  589. {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/LICENSE +0 -0
  590. {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/top_level.txt +0 -0
@@ -12,14 +12,14 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- import collections
15
+ from __future__ import annotations
16
16
 
17
- from typing import cast, Dict, List, Optional, Sequence, Union, TYPE_CHECKING
17
+ import collections
18
+ from typing import cast, Dict, List, Optional, Sequence, TYPE_CHECKING, Union
18
19
 
19
20
  from cirq import circuits, ops, transformers
20
-
21
- from cirq.contrib.acquaintance.gates import SwapNetworkGate, AcquaintanceOpportunityGate
22
21
  from cirq.contrib.acquaintance.devices import get_acquaintance_size
22
+ from cirq.contrib.acquaintance.gates import AcquaintanceOpportunityGate, SwapNetworkGate
23
23
  from cirq.contrib.acquaintance.permutation import PermutationGate
24
24
 
25
25
  if TYPE_CHECKING:
@@ -28,7 +28,7 @@ if TYPE_CHECKING:
28
28
  STRATEGY_GATE = Union[AcquaintanceOpportunityGate, PermutationGate]
29
29
 
30
30
 
31
- def rectify_acquaintance_strategy(circuit: 'cirq.Circuit', acquaint_first: bool = True) -> None:
31
+ def rectify_acquaintance_strategy(circuit: cirq.Circuit, acquaint_first: bool = True) -> None:
32
32
  """Splits moments so that they contain either only acquaintance or permutation gates.
33
33
 
34
34
  Orders resulting moments so that the first one is of the same type as the previous one.
@@ -57,10 +57,10 @@ def rectify_acquaintance_strategy(circuit: 'cirq.Circuit', acquaint_first: bool
57
57
 
58
58
 
59
59
  def replace_acquaintance_with_swap_network(
60
- circuit: 'cirq.Circuit',
61
- qubit_order: Sequence['cirq.Qid'],
60
+ circuit: cirq.Circuit,
61
+ qubit_order: Sequence[cirq.Qid],
62
62
  acquaintance_size: Optional[int] = 0,
63
- swap_gate: 'cirq.Gate' = ops.SWAP,
63
+ swap_gate: cirq.Gate = ops.SWAP,
64
64
  ) -> bool:
65
65
  """Replace every rectified moment with acquaintance gates with a generalized swap network.
66
66
 
@@ -106,10 +106,10 @@ class ExposeAcquaintanceGates:
106
106
  not get_acquaintance_size(op) or isinstance(op.gate, AcquaintanceOpportunityGate)
107
107
  )
108
108
 
109
- def optimize_circuit(self, circuit: 'cirq.Circuit') -> None:
109
+ def optimize_circuit(self, circuit: cirq.Circuit) -> None:
110
110
  circuit._moments = [*transformers.expand_composite(circuit, no_decomp=self.no_decomp)]
111
111
 
112
- def __call__(self, circuit: 'cirq.Circuit') -> None:
112
+ def __call__(self, circuit: cirq.Circuit) -> None:
113
113
  self.optimize_circuit(circuit)
114
114
 
115
115
 
@@ -12,20 +12,21 @@
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 typing import cast, FrozenSet, List, Sequence, Set, TYPE_CHECKING
16
18
 
17
19
  from cirq import circuits
18
-
19
- from cirq.contrib.acquaintance.gates import acquaint
20
20
  from cirq.contrib.acquaintance.executor import AcquaintanceOperation
21
- from cirq.contrib.acquaintance.mutation_utils import expose_acquaintance_gates
21
+ from cirq.contrib.acquaintance.gates import acquaint
22
22
  from cirq.contrib.acquaintance.inspection_utils import LogicalAnnotator
23
+ from cirq.contrib.acquaintance.mutation_utils import expose_acquaintance_gates
23
24
 
24
25
  if TYPE_CHECKING:
25
26
  import cirq
26
27
 
27
28
 
28
- def remove_redundant_acquaintance_opportunities(strategy: 'cirq.Circuit') -> int:
29
+ def remove_redundant_acquaintance_opportunities(strategy: cirq.Circuit) -> int:
29
30
  """Removes redundant acquaintance opportunities."""
30
31
 
31
32
  qubits = sorted(strategy.all_qubits())
@@ -35,11 +36,11 @@ def remove_redundant_acquaintance_opportunities(strategy: 'cirq.Circuit') -> int
35
36
  annotated_strategy = strategy.copy()
36
37
  LogicalAnnotator(mapping)(annotated_strategy)
37
38
 
38
- new_moments: List['cirq.Moment'] = []
39
+ new_moments: List[cirq.Moment] = []
39
40
  acquaintance_opps: Set[FrozenSet[int]] = set()
40
41
  n_removed = 0
41
42
  for moment in annotated_strategy:
42
- new_moment: List['cirq.Operation'] = []
43
+ new_moment: List[cirq.Operation] = []
43
44
  for op in moment:
44
45
  if isinstance(op, AcquaintanceOperation):
45
46
  opp = frozenset(cast(Sequence[int], op.logical_indices))
@@ -12,8 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  import cirq
15
- import cirq.testing as ct
16
15
  import cirq.contrib.acquaintance as cca
16
+ import cirq.testing as ct
17
17
 
18
18
 
19
19
  def test_remove_redundant_acquaintance_opportunities():
@@ -12,22 +12,25 @@
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 abc
18
+ from types import NotImplementedType
16
19
  from typing import (
17
20
  Any,
18
21
  cast,
19
22
  Dict,
20
23
  Iterable,
24
+ Iterator,
21
25
  Optional,
22
26
  Sequence,
23
27
  Tuple,
28
+ TYPE_CHECKING,
24
29
  TypeVar,
25
30
  Union,
26
- TYPE_CHECKING,
27
31
  )
28
32
 
29
33
  from cirq import circuits, ops, protocols, transformers, value
30
- from cirq.type_workarounds import NotImplementedType
31
34
 
32
35
  if TYPE_CHECKING:
33
36
  import cirq
@@ -50,7 +53,7 @@ class PermutationGate(ops.Gate, metaclass=abc.ABCMeta):
50
53
  qubits (e.g. SWAP or fermionic swap).
51
54
  """
52
55
 
53
- def __init__(self, num_qubits: int, swap_gate: 'cirq.Gate' = ops.SWAP) -> None:
56
+ def __init__(self, num_qubits: int, swap_gate: cirq.Gate = ops.SWAP) -> None:
54
57
  self._num_qubits = num_qubits
55
58
  self.swap_gate = swap_gate
56
59
 
@@ -63,7 +66,7 @@ class PermutationGate(ops.Gate, metaclass=abc.ABCMeta):
63
66
  the s[i]-th element."""
64
67
 
65
68
  def update_mapping(
66
- self, mapping: Dict[ops.Qid, LogicalIndex], keys: Sequence['cirq.Qid']
69
+ self, mapping: Dict[ops.Qid, LogicalIndex], keys: Sequence[cirq.Qid]
67
70
  ) -> None:
68
71
  """Updates a mapping (in place) from qubits to logical indices.
69
72
 
@@ -95,8 +98,8 @@ class PermutationGate(ops.Gate, metaclass=abc.ABCMeta):
95
98
  raise IndexError('key is out of bounds.')
96
99
 
97
100
  def _circuit_diagram_info_(
98
- self, args: 'cirq.CircuitDiagramInfoArgs'
99
- ) -> Union[str, Iterable[str], 'cirq.CircuitDiagramInfo']:
101
+ self, args: cirq.CircuitDiagramInfoArgs
102
+ ) -> Union[str, Iterable[str], cirq.CircuitDiagramInfo]:
100
103
  if args.known_qubit_count is None:
101
104
  return NotImplemented
102
105
  permutation = self.permutation()
@@ -117,14 +120,12 @@ class MappingDisplayGate(ops.Gate):
117
120
  def num_qubits(self) -> int:
118
121
  return self._num_qubits
119
122
 
120
- def _circuit_diagram_info_(
121
- self, args: 'cirq.CircuitDiagramInfoArgs'
122
- ) -> 'cirq.CircuitDiagramInfo':
123
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
123
124
  wire_symbols = tuple('' if i is None else str(i) for i in self.indices)
124
125
  return protocols.CircuitDiagramInfo(wire_symbols, connected=False)
125
126
 
126
127
 
127
- def display_mapping(circuit: 'cirq.Circuit', initial_mapping: LogicalMapping) -> None:
128
+ def display_mapping(circuit: cirq.Circuit, initial_mapping: LogicalMapping) -> None:
128
129
  """Inserts display gates between moments to indicate the mapping throughout
129
130
  the circuit."""
130
131
  qubits = sorted(circuit.all_qubits())
@@ -146,13 +147,13 @@ def display_mapping(circuit: 'cirq.Circuit', initial_mapping: LogicalMapping) ->
146
147
  class SwapPermutationGate(PermutationGate):
147
148
  """Generic swap gate."""
148
149
 
149
- def __init__(self, swap_gate: 'cirq.Gate' = ops.SWAP):
150
+ def __init__(self, swap_gate: cirq.Gate = ops.SWAP):
150
151
  super().__init__(2, swap_gate)
151
152
 
152
153
  def permutation(self) -> Dict[int, int]:
153
154
  return {0: 1, 1: 0}
154
155
 
155
- def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
156
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
156
157
  yield self.swap_gate(*qubits)
157
158
 
158
159
  def __repr__(self) -> str:
@@ -185,7 +186,7 @@ class LinearPermutationGate(PermutationGate):
185
186
  sorting network."""
186
187
 
187
188
  def __init__(
188
- self, num_qubits: int, permutation: Dict[int, int], swap_gate: 'cirq.Gate' = ops.SWAP
189
+ self, num_qubits: int, permutation: Dict[int, int], swap_gate: cirq.Gate = ops.SWAP
189
190
  ) -> None:
190
191
  """Initializes a linear permutation gate.
191
192
 
@@ -201,7 +202,7 @@ class LinearPermutationGate(PermutationGate):
201
202
  def permutation(self) -> Dict[int, int]:
202
203
  return self._permutation
203
204
 
204
- def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
205
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
205
206
  swap_gate = SwapPermutationGate(self.swap_gate)
206
207
  n_qubits = len(qubits)
207
208
  mapping = {i: self._permutation.get(i, i) for i in range(n_qubits)}
@@ -237,7 +238,7 @@ class LinearPermutationGate(PermutationGate):
237
238
  return NotImplemented
238
239
 
239
240
 
240
- def update_mapping(mapping: Dict[ops.Qid, LogicalIndex], operations: 'cirq.OP_TREE') -> None:
241
+ def update_mapping(mapping: Dict[ops.Qid, LogicalIndex], operations: cirq.OP_TREE) -> None:
241
242
  """Updates a mapping (in place) from qubits to logical indices according to
242
243
  a set of permutation gates. Any gates other than permutation gates are
243
244
  ignored.
@@ -252,8 +253,8 @@ def update_mapping(mapping: Dict[ops.Qid, LogicalIndex], operations: 'cirq.OP_TR
252
253
 
253
254
 
254
255
  def get_logical_operations(
255
- operations: 'cirq.OP_TREE', initial_mapping: Dict[ops.Qid, ops.Qid]
256
- ) -> Iterable['cirq.Operation']:
256
+ operations: cirq.OP_TREE, initial_mapping: Dict[ops.Qid, ops.Qid]
257
+ ) -> Iterable[cirq.Operation]:
257
258
  """Gets the logical operations specified by the physical operations and
258
259
  initial mapping.
259
260
 
@@ -299,10 +300,10 @@ class DecomposePermutationGates:
299
300
  not all([isinstance(op, ops.GateOperation), isinstance(op.gate, PermutationGate)])
300
301
  )
301
302
 
302
- def optimize_circuit(self, circuit: 'cirq.Circuit') -> None:
303
+ def optimize_circuit(self, circuit: cirq.Circuit) -> None:
303
304
  circuit._moments = [*transformers.expand_composite(circuit, no_decomp=self.no_decomp)]
304
305
 
305
- def __call__(self, circuit: 'cirq.Circuit') -> None:
306
+ def __call__(self, circuit: cirq.Circuit) -> None:
306
307
  self.optimize_circuit(circuit)
307
308
 
308
309
 
@@ -310,7 +311,7 @@ EXPAND_PERMUTATION_GATES = DecomposePermutationGates(keep_swap_permutations=True
310
311
  DECOMPOSE_PERMUTATION_GATES = DecomposePermutationGates(keep_swap_permutations=False)
311
312
 
312
313
 
313
- def return_to_initial_mapping(circuit: 'cirq.Circuit', swap_gate: 'cirq.Gate' = ops.SWAP) -> None:
314
+ def return_to_initial_mapping(circuit: cirq.Circuit, swap_gate: cirq.Gate = ops.SWAP) -> None:
314
315
  qubits = sorted(circuit.all_qubits())
315
316
  n_qubits = len(qubits)
316
317
 
@@ -322,7 +323,7 @@ def return_to_initial_mapping(circuit: 'cirq.Circuit', swap_gate: 'cirq.Gate' =
322
323
  circuit.append(returning_permutation_op)
323
324
 
324
325
 
325
- def uses_consistent_swap_gate(circuit: 'cirq.Circuit', swap_gate: 'cirq.Gate') -> bool:
326
+ def uses_consistent_swap_gate(circuit: cirq.Circuit, swap_gate: cirq.Gate) -> bool:
326
327
  for op in circuit.all_operations():
327
328
  if isinstance(op, ops.GateOperation) and isinstance(op.gate, PermutationGate):
328
329
  if op.gate.swap_gate != swap_gate:
@@ -17,8 +17,8 @@ import random
17
17
  import pytest
18
18
 
19
19
  import cirq
20
- import cirq.testing as ct
21
20
  import cirq.contrib.acquaintance as cca
21
+ import cirq.testing as ct
22
22
 
23
23
 
24
24
  def test_swap_permutation_gate():
@@ -12,11 +12,13 @@
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 itertools
16
- from typing import Any, Dict, Sequence, Tuple, TYPE_CHECKING
18
+ from typing import Any, Dict, Iterator, Sequence, Tuple, TYPE_CHECKING
17
19
 
18
20
  from cirq import ops, value
19
- from cirq.contrib.acquaintance.permutation import SwapPermutationGate, PermutationGate
21
+ from cirq.contrib.acquaintance.permutation import PermutationGate, SwapPermutationGate
20
22
 
21
23
  if TYPE_CHECKING:
22
24
  import cirq
@@ -26,7 +28,7 @@ if TYPE_CHECKING:
26
28
  class CircularShiftGate(PermutationGate):
27
29
  """Performs a cyclical permutation of the qubits to the left by a specified amount."""
28
30
 
29
- def __init__(self, num_qubits: int, shift: int, swap_gate: 'cirq.Gate' = ops.SWAP) -> None:
31
+ def __init__(self, num_qubits: int, shift: int, swap_gate: cirq.Gate = ops.SWAP) -> None:
30
32
  """Construct a circular shift gate.
31
33
 
32
34
  Args:
@@ -47,7 +49,7 @@ class CircularShiftGate(PermutationGate):
47
49
  def _value_equality_values_(self) -> Any:
48
50
  return self.shift, self.swap_gate, self.num_qubits()
49
51
 
50
- def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
52
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
51
53
  n = len(qubits)
52
54
  left_shift = self.shift % n
53
55
  right_shift = n - left_shift
@@ -58,9 +60,9 @@ class CircularShiftGate(PermutationGate):
58
60
  for k in range(i, j, 2):
59
61
  yield swap_gate(*qubits[k : k + 2])
60
62
 
61
- def _circuit_diagram_info_(self, args: 'cirq.CircuitDiagramInfoArgs') -> Tuple[str, ...]:
63
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> Tuple[str, ...]:
62
64
  if args.known_qubit_count is None:
63
- return NotImplemented
65
+ return NotImplemented # pragma: no cover
64
66
  direction_symbols = ('╲', '╱') if args.use_unicode_characters else ('\\', '/')
65
67
  wire_symbols = tuple(
66
68
  direction_symbols[int(i >= self.shift)]
@@ -12,9 +12,11 @@
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 functools
16
18
  import itertools
17
- from typing import Dict, Iterable, Optional, Sequence, Tuple, TYPE_CHECKING
19
+ from typing import Dict, Iterable, Iterator, Optional, Sequence, Tuple, TYPE_CHECKING
18
20
 
19
21
  from cirq import ops
20
22
  from cirq.contrib.acquaintance.gates import acquaint
@@ -51,7 +53,7 @@ class ShiftSwapNetworkGate(PermutationGate):
51
53
  self,
52
54
  left_part_lens: Iterable[int],
53
55
  right_part_lens: Iterable[int],
54
- swap_gate: 'cirq.Gate' = ops.SWAP,
56
+ swap_gate: cirq.Gate = ops.SWAP,
55
57
  ) -> None:
56
58
 
57
59
  self.part_lens = {'left': tuple(left_part_lens), 'right': tuple(right_part_lens)}
@@ -65,7 +67,7 @@ class ShiftSwapNetworkGate(PermutationGate):
65
67
  def acquaintance_size(self) -> int:
66
68
  return sum(max(self.part_lens[side]) for side in ('left', 'right'))
67
69
 
68
- def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
70
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
69
71
  part_lens = list(itertools.chain(*(self.part_lens[side] for side in ('left', 'right'))))
70
72
 
71
73
  n_qubits = 0
@@ -110,7 +112,7 @@ class ShiftSwapNetworkGate(PermutationGate):
110
112
  )
111
113
  )
112
114
 
113
- def _circuit_diagram_info_(self, args: 'cirq.CircuitDiagramInfoArgs') -> Tuple[str, ...]:
115
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> Tuple[str, ...]:
114
116
  qubit_count = self.qubit_count()
115
117
  assert args.known_qubit_count in (None, qubit_count)
116
118
 
@@ -14,6 +14,12 @@
14
14
 
15
15
  """Acquaintance strategies."""
16
16
 
17
- from cirq.contrib.acquaintance.strategies.complete import complete_acquaintance_strategy
18
- from cirq.contrib.acquaintance.strategies.cubic import cubic_acquaintance_strategy
19
- from cirq.contrib.acquaintance.strategies.quartic_paired import quartic_paired_acquaintance_strategy
17
+ from cirq.contrib.acquaintance.strategies.complete import (
18
+ complete_acquaintance_strategy as complete_acquaintance_strategy,
19
+ )
20
+ from cirq.contrib.acquaintance.strategies.cubic import (
21
+ cubic_acquaintance_strategy as cubic_acquaintance_strategy,
22
+ )
23
+ from cirq.contrib.acquaintance.strategies.quartic_paired import (
24
+ quartic_paired_acquaintance_strategy as quartic_paired_acquaintance_strategy,
25
+ )
@@ -12,10 +12,11 @@
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 typing import Sequence, TYPE_CHECKING
16
18
 
17
19
  from cirq import circuits, ops
18
-
19
20
  from cirq.contrib.acquaintance.gates import acquaint
20
21
  from cirq.contrib.acquaintance.mutation_utils import (
21
22
  expose_acquaintance_gates,
@@ -27,8 +28,8 @@ if TYPE_CHECKING:
27
28
 
28
29
 
29
30
  def complete_acquaintance_strategy(
30
- qubit_order: Sequence['cirq.Qid'], acquaintance_size: int = 0, swap_gate: 'cirq.Gate' = ops.SWAP
31
- ) -> 'cirq.Circuit':
31
+ qubit_order: Sequence[cirq.Qid], acquaintance_size: int = 0, swap_gate: cirq.Gate = ops.SWAP
32
+ ) -> cirq.Circuit:
32
33
  """Returns an acquaintance strategy with can handle the given number of qubits.
33
34
 
34
35
  Args:
@@ -12,8 +12,10 @@
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 itertools
16
- from typing import Iterable, Sequence, Tuple, TypeVar, TYPE_CHECKING
18
+ from typing import Iterable, Sequence, Tuple, TYPE_CHECKING, TypeVar
17
19
 
18
20
  from cirq import circuits, ops
19
21
  from cirq.contrib.acquaintance.gates import acquaint
@@ -35,8 +37,8 @@ def skip_and_wrap_around(items: Sequence[TItem]) -> Tuple[TItem, ...]:
35
37
 
36
38
 
37
39
  def cubic_acquaintance_strategy(
38
- qubits: Iterable['cirq.Qid'], swap_gate: 'cirq.Gate' = ops.SWAP
39
- ) -> 'cirq.Circuit':
40
+ qubits: Iterable[cirq.Qid], swap_gate: cirq.Gate = ops.SWAP
41
+ ) -> cirq.Circuit:
40
42
  """Acquaints every triple of qubits.
41
43
 
42
44
  Exploits the fact that in a simple linear swap network every pair of
@@ -12,9 +12,11 @@
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 typing import cast, Iterable, List, Sequence, Tuple, TYPE_CHECKING
16
18
 
17
- from cirq import circuits, ops
19
+ from cirq import circuits
18
20
  from cirq.contrib.acquaintance.gates import acquaint, SwapNetworkGate
19
21
  from cirq.contrib.acquaintance.mutation_utils import expose_acquaintance_gates
20
22
 
@@ -22,7 +24,7 @@ if TYPE_CHECKING:
22
24
  import cirq
23
25
 
24
26
 
25
- def qubit_pairs_to_qubit_order(qubit_pairs: Sequence[Sequence['cirq.Qid']]) -> List['cirq.Qid']:
27
+ def qubit_pairs_to_qubit_order(qubit_pairs: Sequence[Sequence[cirq.Qid]]) -> List[cirq.Qid]:
26
28
  """Takes a sequence of qubit pairs and returns a sequence in which every
27
29
  pair is at distance two.
28
30
 
@@ -33,7 +35,7 @@ def qubit_pairs_to_qubit_order(qubit_pairs: Sequence[Sequence['cirq.Qid']]) -> L
33
35
  if set(len(qubit_pair) for qubit_pair in qubit_pairs) != set((2,)):
34
36
  raise ValueError('set(len(qubit_pair) for qubit_pair in qubit_pairs) != set((2,))')
35
37
  n_pairs = len(qubit_pairs)
36
- qubits: List['cirq.Qid'] = []
38
+ qubits: List[cirq.Qid] = []
37
39
  for i in range(0, 2 * (n_pairs // 2), 2):
38
40
  qubits += [
39
41
  qubit_pairs[i][0],
@@ -47,15 +49,15 @@ def qubit_pairs_to_qubit_order(qubit_pairs: Sequence[Sequence['cirq.Qid']]) -> L
47
49
 
48
50
 
49
51
  def quartic_paired_acquaintance_strategy(
50
- qubit_pairs: Iterable[Tuple['cirq.Qid', ops.Qid]]
51
- ) -> Tuple['cirq.Circuit', Sequence['cirq.Qid']]:
52
+ qubit_pairs: Iterable[Tuple[cirq.Qid, cirq.Qid]],
53
+ ) -> Tuple[cirq.Circuit, Sequence[cirq.Qid]]:
52
54
  """Acquaintance strategy for pairs of pairs.
53
55
 
54
56
  Implements UpCCGSD ansatz from arXiv:1810.02327.
55
57
  """
56
58
 
57
59
  qubit_pairs = tuple(
58
- cast(Tuple['cirq.Qid', ops.Qid], tuple(qubit_pair)) for qubit_pair in qubit_pairs
60
+ cast(Tuple['cirq.Qid', 'cirq.Qid'], tuple(qubit_pair)) for qubit_pair in qubit_pairs
59
61
  )
60
62
  qubits = qubit_pairs_to_qubit_order(qubit_pairs)
61
63
  n_qubits = len(qubits)
@@ -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 operator
16
18
  import random
17
19
  from typing import Any, Callable, cast, Iterable, TYPE_CHECKING
@@ -25,8 +27,8 @@ if TYPE_CHECKING:
25
27
 
26
28
 
27
29
  def is_topologically_sorted(
28
- dag: 'cirq.contrib.CircuitDag',
29
- operations: 'cirq.OP_TREE',
30
+ dag: cirq.contrib.CircuitDag,
31
+ operations: cirq.OP_TREE,
30
32
  equals: Callable[[ops.Operation, ops.Operation], bool] = operator.eq,
31
33
  ) -> bool:
32
34
  """Whether a given order of operations is consistent with the DAG.
@@ -12,4 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from cirq.contrib.bayesian_network.bayesian_network_gate import BayesianNetworkGate
15
+ from cirq.contrib.bayesian_network.bayesian_network_gate import (
16
+ BayesianNetworkGate as BayesianNetworkGate,
17
+ )
@@ -12,8 +12,10 @@
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 math
16
- from typing import Any, cast, Dict, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union
18
+ from typing import Any, cast, Dict, Iterator, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union
17
19
 
18
20
  from sympy.combinatorics import GrayCode
19
21
 
@@ -158,7 +160,7 @@ class BayesianNetworkGate(raw_types.Gate):
158
160
  raise ValueError('Conditional prob should be between 0 and 1.')
159
161
  self._arc_probs = arc_probs
160
162
 
161
- def _decompose_(self, qubits: Sequence['raw_types.Qid']) -> 'cirq.OP_TREE':
163
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
162
164
  parameter_names = [init_prob[0] for init_prob in self._init_probs]
163
165
  qubit_map = dict(zip(parameter_names, qubits))
164
166
 
@@ -188,7 +190,7 @@ class BayesianNetworkGate(raw_types.Gate):
188
190
  init_probs: List[List[Union[str, Optional[float]]]],
189
191
  arc_probs: List[List[Union[str, List[str], List[float]]]],
190
192
  **kwargs,
191
- ) -> 'BayesianNetworkGate':
193
+ ) -> BayesianNetworkGate:
192
194
  converted_init_probs = cast(
193
195
  List[Tuple[str, Optional[float]]],
194
196
  [(param, init_prob) for param, init_prob in init_probs],
@@ -14,4 +14,4 @@
14
14
 
15
15
  """Tools for representing a Circuit as a directed acyclic graph."""
16
16
 
17
- from cirq.contrib.circuitdag.circuit_dag import CircuitDag, Unique
17
+ from cirq.contrib.circuitdag.circuit_dag import CircuitDag as CircuitDag, Unique as Unique
@@ -11,16 +11,16 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- from typing import Any, Callable, Dict, Generic, Iterator, TypeVar, cast, TYPE_CHECKING
14
+
15
+ from __future__ import annotations
15
16
 
16
17
  import functools
18
+ from typing import Any, Callable, cast, Dict, Generic, Iterator, TypeVar
19
+
17
20
  import networkx
18
21
 
22
+ import cirq
19
23
  from cirq import ops
20
- from cirq.circuits import circuit
21
-
22
- if TYPE_CHECKING:
23
- import cirq
24
24
 
25
25
  T = TypeVar('T')
26
26
 
@@ -50,7 +50,7 @@ class Unique(Generic[T]):
50
50
  return id(self) < id(other)
51
51
 
52
52
 
53
- def _disjoint_qubits(op1: 'cirq.Operation', op2: 'cirq.Operation') -> bool:
53
+ def _disjoint_qubits(op1: cirq.Operation, op2: cirq.Operation) -> bool:
54
54
  """Returns true only if the operations have qubits in common."""
55
55
  return not set(op1.qubits) & set(op2.qubits)
56
56
 
@@ -72,7 +72,7 @@ class CircuitDag(networkx.DiGraph):
72
72
 
73
73
  def __init__(
74
74
  self,
75
- can_reorder: Callable[['cirq.Operation', 'cirq.Operation'], bool] = _disjoint_qubits,
75
+ can_reorder: Callable[[cirq.Operation, cirq.Operation], bool] = _disjoint_qubits,
76
76
  incoming_graph_data: Any = None,
77
77
  ) -> None:
78
78
  """Initializes a CircuitDag.
@@ -93,27 +93,27 @@ class CircuitDag(networkx.DiGraph):
93
93
  self.can_reorder = can_reorder
94
94
 
95
95
  @staticmethod
96
- def make_node(op: 'cirq.Operation') -> Unique:
96
+ def make_node(op: cirq.Operation) -> Unique:
97
97
  return Unique(op)
98
98
 
99
99
  @staticmethod
100
100
  def from_circuit(
101
- circuit: circuit.Circuit,
102
- can_reorder: Callable[['cirq.Operation', 'cirq.Operation'], bool] = _disjoint_qubits,
103
- ) -> 'CircuitDag':
101
+ circuit: cirq.Circuit,
102
+ can_reorder: Callable[[cirq.Operation, cirq.Operation], bool] = _disjoint_qubits,
103
+ ) -> CircuitDag:
104
104
  return CircuitDag.from_ops(circuit.all_operations(), can_reorder=can_reorder)
105
105
 
106
106
  @staticmethod
107
107
  def from_ops(
108
- *operations: 'cirq.OP_TREE',
109
- can_reorder: Callable[['cirq.Operation', 'cirq.Operation'], bool] = _disjoint_qubits,
110
- ) -> 'CircuitDag':
108
+ *operations: cirq.OP_TREE,
109
+ can_reorder: Callable[[cirq.Operation, cirq.Operation], bool] = _disjoint_qubits,
110
+ ) -> CircuitDag:
111
111
  dag = CircuitDag(can_reorder=can_reorder)
112
112
  for op in ops.flatten_op_tree(operations):
113
113
  dag.append(cast(ops.Operation, op))
114
114
  return dag
115
115
 
116
- def append(self, op: 'cirq.Operation') -> None:
116
+ def append(self, op: cirq.Operation) -> None:
117
117
  new_node = self.make_node(op)
118
118
  for node in list(self.nodes()):
119
119
  if not self.can_reorder(node.val, op):
@@ -142,21 +142,21 @@ class CircuitDag(networkx.DiGraph):
142
142
 
143
143
  __hash__ = None # type: ignore
144
144
 
145
- def ordered_nodes(self) -> Iterator[Unique['cirq.Operation']]:
145
+ def ordered_nodes(self) -> Iterator[Unique[cirq.Operation]]:
146
146
  if not self.nodes():
147
147
  return
148
148
  g = self.copy()
149
149
 
150
- def get_root_node(some_node: Unique['cirq.Operation']) -> Unique['cirq.Operation']:
150
+ def get_root_node(some_node: Unique[cirq.Operation]) -> Unique[cirq.Operation]:
151
151
  pred = g.pred
152
152
  while pred[some_node]:
153
153
  some_node = next(iter(pred[some_node]))
154
154
  return some_node
155
155
 
156
- def get_first_node() -> Unique['cirq.Operation']:
156
+ def get_first_node() -> Unique[cirq.Operation]:
157
157
  return get_root_node(next(iter(g.nodes())))
158
158
 
159
- def get_next_node(succ: networkx.classes.coreviews.AtlasView) -> Unique['cirq.Operation']:
159
+ def get_next_node(succ: networkx.classes.coreviews.AtlasView) -> Unique[cirq.Operation]:
160
160
  if succ:
161
161
  return get_root_node(next(iter(succ)))
162
162
 
@@ -173,18 +173,18 @@ class CircuitDag(networkx.DiGraph):
173
173
 
174
174
  node = get_next_node(succ)
175
175
 
176
- def all_operations(self) -> Iterator['cirq.Operation']:
176
+ def all_operations(self) -> Iterator[cirq.Operation]:
177
177
  return (node.val for node in self.ordered_nodes())
178
178
 
179
179
  def all_qubits(self):
180
180
  return frozenset(q for node in self.nodes for q in node.val.qubits)
181
181
 
182
- def to_circuit(self) -> circuit.Circuit:
183
- return circuit.Circuit(self.all_operations(), strategy=circuit.InsertStrategy.EARLIEST)
182
+ def to_circuit(self) -> cirq.Circuit:
183
+ return cirq.Circuit(self.all_operations(), strategy=cirq.InsertStrategy.EARLIEST)
184
184
 
185
185
  def findall_nodes_until_blocked(
186
- self, is_blocker: Callable[['cirq.Operation'], bool]
187
- ) -> Iterator[Unique['cirq.Operation']]:
186
+ self, is_blocker: Callable[[cirq.Operation], bool]
187
+ ) -> Iterator[Unique[cirq.Operation]]:
188
188
  """Finds all nodes before blocking ones.
189
189
 
190
190
  Args: