qiskit 1.3.0b1__cp39-abi3-macosx_10_9_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (825) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +127 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +365 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1270 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3264 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +48 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +503 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +163 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +106 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +295 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +261 -0
  54. qiskit/circuit/instruction.py +676 -0
  55. qiskit/circuit/instructionset.py +177 -0
  56. qiskit/circuit/library/__init__.py +572 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +331 -0
  80. qiskit/circuit/library/blueprintcircuit.py +216 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +54 -0
  87. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  88. qiskit/circuit/library/data_preparation/pauli_feature_map.py +343 -0
  89. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  90. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  91. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  92. qiskit/circuit/library/fourier_checking.py +97 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +165 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +121 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +312 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +256 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +192 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +97 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +86 -0
  111. qiskit/circuit/library/grover_operator.py +311 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +98 -0
  114. qiskit/circuit/library/iqp.py +96 -0
  115. qiskit/circuit/library/n_local/__init__.py +33 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +164 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +256 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +173 -0
  119. qiskit/circuit/library/n_local/n_local.py +1071 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +141 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +287 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +186 -0
  123. qiskit/circuit/library/n_local/two_local.py +282 -0
  124. qiskit/circuit/library/overlap.py +117 -0
  125. qiskit/circuit/library/pauli_evolution.py +184 -0
  126. qiskit/circuit/library/phase_estimation.py +99 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +115 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +123 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +257 -0
  135. qiskit/circuit/library/standard_gates/i.py +75 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +433 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +302 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +297 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +318 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +314 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +395 -0
  152. qiskit/circuit/library/standard_gates/u1.py +451 -0
  153. qiskit/circuit/library/standard_gates/u2.py +146 -0
  154. qiskit/circuit/library/standard_gates/u3.py +408 -0
  155. qiskit/circuit/library/standard_gates/x.py +1527 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +261 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +33 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +174 -0
  238. qiskit/circuit/parameterexpression.py +559 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6793 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +604 -0
  249. qiskit/circuit/store.py +95 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/compiler/__init__.py +33 -0
  253. qiskit/compiler/assembler.py +668 -0
  254. qiskit/compiler/scheduler.py +107 -0
  255. qiskit/compiler/sequencer.py +69 -0
  256. qiskit/compiler/transpiler.py +478 -0
  257. qiskit/converters/__init__.py +74 -0
  258. qiskit/converters/circuit_to_dag.py +78 -0
  259. qiskit/converters/circuit_to_dagdependency.py +51 -0
  260. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  261. qiskit/converters/circuit_to_gate.py +107 -0
  262. qiskit/converters/circuit_to_instruction.py +155 -0
  263. qiskit/converters/dag_to_circuit.py +77 -0
  264. qiskit/converters/dag_to_dagdependency.py +55 -0
  265. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  266. qiskit/converters/dagdependency_to_circuit.py +42 -0
  267. qiskit/converters/dagdependency_to_dag.py +49 -0
  268. qiskit/dagcircuit/__init__.py +44 -0
  269. qiskit/dagcircuit/collect_blocks.py +391 -0
  270. qiskit/dagcircuit/dagcircuit.py +24 -0
  271. qiskit/dagcircuit/dagdependency.py +633 -0
  272. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  273. qiskit/dagcircuit/dagdepnode.py +160 -0
  274. qiskit/dagcircuit/dagnode.py +176 -0
  275. qiskit/dagcircuit/exceptions.py +42 -0
  276. qiskit/exceptions.py +153 -0
  277. qiskit/passmanager/__init__.py +240 -0
  278. qiskit/passmanager/base_tasks.py +230 -0
  279. qiskit/passmanager/compilation_status.py +74 -0
  280. qiskit/passmanager/exceptions.py +19 -0
  281. qiskit/passmanager/flow_controllers.py +116 -0
  282. qiskit/passmanager/passmanager.py +333 -0
  283. qiskit/primitives/__init__.py +481 -0
  284. qiskit/primitives/backend_estimator.py +483 -0
  285. qiskit/primitives/backend_estimator_v2.py +434 -0
  286. qiskit/primitives/backend_sampler.py +222 -0
  287. qiskit/primitives/backend_sampler_v2.py +296 -0
  288. qiskit/primitives/base/__init__.py +20 -0
  289. qiskit/primitives/base/base_estimator.py +252 -0
  290. qiskit/primitives/base/base_primitive.py +45 -0
  291. qiskit/primitives/base/base_primitive_job.py +78 -0
  292. qiskit/primitives/base/base_result.py +65 -0
  293. qiskit/primitives/base/base_sampler.py +204 -0
  294. qiskit/primitives/base/estimator_result.py +46 -0
  295. qiskit/primitives/base/sampler_result.py +45 -0
  296. qiskit/primitives/base/validation.py +231 -0
  297. qiskit/primitives/containers/__init__.py +26 -0
  298. qiskit/primitives/containers/bindings_array.py +389 -0
  299. qiskit/primitives/containers/bit_array.py +741 -0
  300. qiskit/primitives/containers/data_bin.py +165 -0
  301. qiskit/primitives/containers/estimator_pub.py +222 -0
  302. qiskit/primitives/containers/object_array.py +94 -0
  303. qiskit/primitives/containers/observables_array.py +279 -0
  304. qiskit/primitives/containers/primitive_result.py +53 -0
  305. qiskit/primitives/containers/pub_result.py +51 -0
  306. qiskit/primitives/containers/sampler_pub.py +193 -0
  307. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  308. qiskit/primitives/containers/shape.py +129 -0
  309. qiskit/primitives/estimator.py +172 -0
  310. qiskit/primitives/primitive_job.py +81 -0
  311. qiskit/primitives/sampler.py +162 -0
  312. qiskit/primitives/statevector_estimator.py +174 -0
  313. qiskit/primitives/statevector_sampler.py +292 -0
  314. qiskit/primitives/utils.py +247 -0
  315. qiskit/providers/__init__.py +803 -0
  316. qiskit/providers/backend.py +656 -0
  317. qiskit/providers/backend_compat.py +452 -0
  318. qiskit/providers/basic_provider/__init__.py +45 -0
  319. qiskit/providers/basic_provider/basic_provider.py +101 -0
  320. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  321. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  322. qiskit/providers/basic_provider/basic_simulator.py +811 -0
  323. qiskit/providers/basic_provider/exceptions.py +30 -0
  324. qiskit/providers/exceptions.py +45 -0
  325. qiskit/providers/fake_provider/__init__.py +105 -0
  326. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  350. qiskit/providers/fake_provider/fake_1q.py +91 -0
  351. qiskit/providers/fake_provider/fake_backend.py +165 -0
  352. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  353. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  354. qiskit/providers/fake_provider/fake_pulse_backend.py +44 -0
  355. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  356. qiskit/providers/fake_provider/generic_backend_v2.py +1019 -0
  357. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  358. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  359. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  360. qiskit/providers/job.py +147 -0
  361. qiskit/providers/jobstatus.py +30 -0
  362. qiskit/providers/models/__init__.py +89 -0
  363. qiskit/providers/models/backendconfiguration.py +1040 -0
  364. qiskit/providers/models/backendproperties.py +517 -0
  365. qiskit/providers/models/backendstatus.py +94 -0
  366. qiskit/providers/models/jobstatus.py +66 -0
  367. qiskit/providers/models/pulsedefaults.py +303 -0
  368. qiskit/providers/options.py +273 -0
  369. qiskit/providers/provider.py +95 -0
  370. qiskit/providers/providerutils.py +110 -0
  371. qiskit/pulse/__init__.py +158 -0
  372. qiskit/pulse/builder.py +2213 -0
  373. qiskit/pulse/calibration_entries.py +378 -0
  374. qiskit/pulse/channels.py +225 -0
  375. qiskit/pulse/configuration.py +245 -0
  376. qiskit/pulse/exceptions.py +43 -0
  377. qiskit/pulse/filters.py +309 -0
  378. qiskit/pulse/instruction_schedule_map.py +409 -0
  379. qiskit/pulse/instructions/__init__.py +67 -0
  380. qiskit/pulse/instructions/acquire.py +148 -0
  381. qiskit/pulse/instructions/delay.py +69 -0
  382. qiskit/pulse/instructions/directives.py +146 -0
  383. qiskit/pulse/instructions/frequency.py +132 -0
  384. qiskit/pulse/instructions/instruction.py +268 -0
  385. qiskit/pulse/instructions/phase.py +149 -0
  386. qiskit/pulse/instructions/play.py +97 -0
  387. qiskit/pulse/instructions/reference.py +98 -0
  388. qiskit/pulse/instructions/snapshot.py +80 -0
  389. qiskit/pulse/library/__init__.py +97 -0
  390. qiskit/pulse/library/continuous.py +430 -0
  391. qiskit/pulse/library/pulse.py +146 -0
  392. qiskit/pulse/library/samplers/__init__.py +15 -0
  393. qiskit/pulse/library/samplers/decorators.py +295 -0
  394. qiskit/pulse/library/samplers/strategies.py +71 -0
  395. qiskit/pulse/library/symbolic_pulses.py +1960 -0
  396. qiskit/pulse/library/waveform.py +134 -0
  397. qiskit/pulse/macros.py +262 -0
  398. qiskit/pulse/parameter_manager.py +445 -0
  399. qiskit/pulse/parser.py +314 -0
  400. qiskit/pulse/reference_manager.py +58 -0
  401. qiskit/pulse/schedule.py +1855 -0
  402. qiskit/pulse/transforms/__init__.py +106 -0
  403. qiskit/pulse/transforms/alignments.py +404 -0
  404. qiskit/pulse/transforms/base_transforms.py +71 -0
  405. qiskit/pulse/transforms/canonicalization.py +498 -0
  406. qiskit/pulse/transforms/dag.py +115 -0
  407. qiskit/pulse/utils.py +149 -0
  408. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  409. qiskit/qasm/libs/qelib1.inc +266 -0
  410. qiskit/qasm/libs/stdgates.inc +82 -0
  411. qiskit/qasm2/__init__.py +654 -0
  412. qiskit/qasm2/exceptions.py +27 -0
  413. qiskit/qasm2/export.py +370 -0
  414. qiskit/qasm2/parse.py +408 -0
  415. qiskit/qasm3/__init__.py +366 -0
  416. qiskit/qasm3/ast.py +630 -0
  417. qiskit/qasm3/exceptions.py +27 -0
  418. qiskit/qasm3/experimental.py +70 -0
  419. qiskit/qasm3/exporter.py +1273 -0
  420. qiskit/qasm3/printer.py +577 -0
  421. qiskit/qobj/__init__.py +75 -0
  422. qiskit/qobj/common.py +81 -0
  423. qiskit/qobj/converters/__init__.py +18 -0
  424. qiskit/qobj/converters/lo_config.py +177 -0
  425. qiskit/qobj/converters/pulse_instruction.py +895 -0
  426. qiskit/qobj/pulse_qobj.py +709 -0
  427. qiskit/qobj/qasm_qobj.py +708 -0
  428. qiskit/qobj/utils.py +46 -0
  429. qiskit/qpy/__init__.py +1641 -0
  430. qiskit/qpy/binary_io/__init__.py +36 -0
  431. qiskit/qpy/binary_io/circuits.py +1460 -0
  432. qiskit/qpy/binary_io/schedules.py +636 -0
  433. qiskit/qpy/binary_io/value.py +728 -0
  434. qiskit/qpy/common.py +306 -0
  435. qiskit/qpy/exceptions.py +53 -0
  436. qiskit/qpy/formats.py +394 -0
  437. qiskit/qpy/interface.py +341 -0
  438. qiskit/qpy/type_keys.py +572 -0
  439. qiskit/quantum_info/__init__.py +158 -0
  440. qiskit/quantum_info/analysis/__init__.py +17 -0
  441. qiskit/quantum_info/analysis/average.py +47 -0
  442. qiskit/quantum_info/analysis/distance.py +102 -0
  443. qiskit/quantum_info/analysis/make_observable.py +44 -0
  444. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  445. qiskit/quantum_info/operators/__init__.py +28 -0
  446. qiskit/quantum_info/operators/base_operator.py +145 -0
  447. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  448. qiskit/quantum_info/operators/channel/chi.py +191 -0
  449. qiskit/quantum_info/operators/channel/choi.py +218 -0
  450. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  451. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  452. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  453. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  454. qiskit/quantum_info/operators/channel/superop.py +377 -0
  455. qiskit/quantum_info/operators/channel/transformations.py +468 -0
  456. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  457. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  458. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  460. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  461. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  462. qiskit/quantum_info/operators/linear_op.py +25 -0
  463. qiskit/quantum_info/operators/measures.py +418 -0
  464. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  465. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  466. qiskit/quantum_info/operators/mixins/group.py +171 -0
  467. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  468. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  469. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  470. qiskit/quantum_info/operators/op_shape.py +525 -0
  471. qiskit/quantum_info/operators/operator.py +819 -0
  472. qiskit/quantum_info/operators/operator_utils.py +76 -0
  473. qiskit/quantum_info/operators/predicates.py +183 -0
  474. qiskit/quantum_info/operators/random.py +154 -0
  475. qiskit/quantum_info/operators/scalar_op.py +254 -0
  476. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  477. qiskit/quantum_info/operators/symplectic/base_pauli.py +727 -0
  478. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  479. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  480. qiskit/quantum_info/operators/symplectic/pauli.py +751 -0
  481. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  483. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  484. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1175 -0
  485. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  486. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  487. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  489. qiskit/quantum_info/quaternion.py +156 -0
  490. qiskit/quantum_info/random.py +26 -0
  491. qiskit/quantum_info/states/__init__.py +28 -0
  492. qiskit/quantum_info/states/densitymatrix.py +845 -0
  493. qiskit/quantum_info/states/measures.py +288 -0
  494. qiskit/quantum_info/states/quantum_state.py +503 -0
  495. qiskit/quantum_info/states/random.py +157 -0
  496. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  497. qiskit/quantum_info/states/statevector.py +958 -0
  498. qiskit/quantum_info/states/utils.py +247 -0
  499. qiskit/result/__init__.py +73 -0
  500. qiskit/result/counts.py +189 -0
  501. qiskit/result/distributions/__init__.py +17 -0
  502. qiskit/result/distributions/probability.py +100 -0
  503. qiskit/result/distributions/quasi.py +154 -0
  504. qiskit/result/exceptions.py +40 -0
  505. qiskit/result/mitigation/__init__.py +13 -0
  506. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  507. qiskit/result/mitigation/correlated_readout_mitigator.py +269 -0
  508. qiskit/result/mitigation/local_readout_mitigator.py +320 -0
  509. qiskit/result/mitigation/utils.py +160 -0
  510. qiskit/result/models.py +234 -0
  511. qiskit/result/postprocess.py +239 -0
  512. qiskit/result/result.py +392 -0
  513. qiskit/result/sampled_expval.py +75 -0
  514. qiskit/result/utils.py +295 -0
  515. qiskit/scheduler/__init__.py +40 -0
  516. qiskit/scheduler/config.py +35 -0
  517. qiskit/scheduler/lowering.py +187 -0
  518. qiskit/scheduler/methods/__init__.py +15 -0
  519. qiskit/scheduler/methods/basic.py +137 -0
  520. qiskit/scheduler/schedule_circuit.py +67 -0
  521. qiskit/scheduler/sequence.py +102 -0
  522. qiskit/synthesis/__init__.py +195 -0
  523. qiskit/synthesis/clifford/__init__.py +19 -0
  524. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  525. qiskit/synthesis/clifford/clifford_decompose_bm.py +47 -0
  526. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  527. qiskit/synthesis/clifford/clifford_decompose_greedy.py +57 -0
  528. qiskit/synthesis/clifford/clifford_decompose_layers.py +446 -0
  529. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  530. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  531. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  532. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  533. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  534. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  535. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  536. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  537. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  538. qiskit/synthesis/evolution/__init__.py +20 -0
  539. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  540. qiskit/synthesis/evolution/lie_trotter.py +143 -0
  541. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  542. qiskit/synthesis/evolution/product_formula.py +384 -0
  543. qiskit/synthesis/evolution/qdrift.py +131 -0
  544. qiskit/synthesis/evolution/suzuki_trotter.py +155 -0
  545. qiskit/synthesis/linear/__init__.py +26 -0
  546. qiskit/synthesis/linear/cnot_synth.py +69 -0
  547. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  548. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  549. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  550. qiskit/synthesis/linear_phase/__init__.py +17 -0
  551. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  552. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  553. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  554. qiskit/synthesis/multi_controlled/__init__.py +23 -0
  555. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  556. qiskit/synthesis/one_qubit/__init__.py +15 -0
  557. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  558. qiskit/synthesis/permutation/__init__.py +18 -0
  559. qiskit/synthesis/permutation/permutation_full.py +78 -0
  560. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  561. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  562. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  563. qiskit/synthesis/qft/__init__.py +16 -0
  564. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  565. qiskit/synthesis/qft/qft_decompose_lnn.py +78 -0
  566. qiskit/synthesis/stabilizer/__init__.py +16 -0
  567. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  568. qiskit/synthesis/stabilizer/stabilizer_decompose.py +193 -0
  569. qiskit/synthesis/two_qubit/__init__.py +19 -0
  570. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  571. qiskit/synthesis/two_qubit/two_qubit_decompose.py +759 -0
  572. qiskit/synthesis/two_qubit/weyl.py +97 -0
  573. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  574. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  575. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  576. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  577. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  578. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  579. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  580. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  581. qiskit/synthesis/unitary/__init__.py +13 -0
  582. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  583. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  584. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  585. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  586. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  587. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  588. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  589. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  590. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  591. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  592. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  593. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  594. qiskit/synthesis/unitary/qsd.py +288 -0
  595. qiskit/transpiler/__init__.py +1283 -0
  596. qiskit/transpiler/basepasses.py +221 -0
  597. qiskit/transpiler/coupling.py +500 -0
  598. qiskit/transpiler/exceptions.py +59 -0
  599. qiskit/transpiler/instruction_durations.py +281 -0
  600. qiskit/transpiler/layout.py +737 -0
  601. qiskit/transpiler/passes/__init__.py +310 -0
  602. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  603. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  604. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  605. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  606. qiskit/transpiler/passes/analysis/depth.py +33 -0
  607. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  608. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  609. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  610. qiskit/transpiler/passes/analysis/size.py +36 -0
  611. qiskit/transpiler/passes/analysis/width.py +27 -0
  612. qiskit/transpiler/passes/basis/__init__.py +19 -0
  613. qiskit/transpiler/passes/basis/basis_translator.py +693 -0
  614. qiskit/transpiler/passes/basis/decompose.py +98 -0
  615. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  616. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  617. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  618. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  619. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  620. qiskit/transpiler/passes/calibration/builders.py +20 -0
  621. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  622. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  623. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  624. qiskit/transpiler/passes/calibration/rzx_builder.py +395 -0
  625. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  626. qiskit/transpiler/passes/layout/__init__.py +26 -0
  627. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  628. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  629. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  630. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  631. qiskit/transpiler/passes/layout/disjoint_utils.py +217 -0
  632. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  633. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  634. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  635. qiskit/transpiler/passes/layout/sabre_layout.py +482 -0
  636. qiskit/transpiler/passes/layout/sabre_pre_layout.py +220 -0
  637. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  638. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  639. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  640. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  641. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  642. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  643. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  644. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  645. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  646. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  647. qiskit/transpiler/passes/optimization/collect_cliffords.py +88 -0
  648. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  649. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  650. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  651. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  652. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  653. qiskit/transpiler/passes/optimization/consolidate_blocks.py +232 -0
  654. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  655. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  656. qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
  657. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  658. qiskit/transpiler/passes/optimization/inverse_cancellation.py +93 -0
  659. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  660. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  661. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +260 -0
  662. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  663. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  664. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  665. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  666. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  667. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  668. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  669. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  670. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  671. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  672. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  673. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  674. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  675. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  676. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  677. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  678. qiskit/transpiler/passes/routing/__init__.py +22 -0
  679. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  680. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  681. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  682. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  683. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  684. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  685. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  686. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  687. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  688. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  689. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  690. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  691. qiskit/transpiler/passes/routing/sabre_swap.py +443 -0
  692. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  693. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  694. qiskit/transpiler/passes/routing/utils.py +35 -0
  695. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  696. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  697. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  698. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  699. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  700. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +105 -0
  701. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  702. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  703. qiskit/transpiler/passes/scheduling/base_scheduler.py +308 -0
  704. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +307 -0
  705. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  706. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  707. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +441 -0
  708. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  709. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  710. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  711. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  712. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +90 -0
  713. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  714. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +160 -0
  715. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  716. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  717. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +691 -0
  718. qiskit/transpiler/passes/synthesis/hls_plugins.py +928 -0
  719. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  720. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  721. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  722. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  723. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1055 -0
  724. qiskit/transpiler/passes/utils/__init__.py +33 -0
  725. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  726. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  727. qiskit/transpiler/passes/utils/check_map.py +78 -0
  728. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  729. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  730. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +88 -0
  731. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  732. qiskit/transpiler/passes/utils/error.py +69 -0
  733. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  734. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  735. qiskit/transpiler/passes/utils/gate_direction.py +349 -0
  736. qiskit/transpiler/passes/utils/gates_basis.py +74 -0
  737. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  738. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  739. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  740. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  741. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  742. qiskit/transpiler/passmanager.py +490 -0
  743. qiskit/transpiler/passmanager_config.py +198 -0
  744. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  745. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1019 -0
  746. qiskit/transpiler/preset_passmanagers/common.py +647 -0
  747. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +543 -0
  748. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  749. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  750. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  751. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  752. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  753. qiskit/transpiler/target.py +1261 -0
  754. qiskit/transpiler/timing_constraints.py +59 -0
  755. qiskit/user_config.py +262 -0
  756. qiskit/utils/__init__.py +89 -0
  757. qiskit/utils/classtools.py +146 -0
  758. qiskit/utils/deprecation.py +490 -0
  759. qiskit/utils/lazy_tester.py +363 -0
  760. qiskit/utils/multiprocessing.py +56 -0
  761. qiskit/utils/optionals.py +347 -0
  762. qiskit/utils/parallel.py +191 -0
  763. qiskit/utils/units.py +143 -0
  764. qiskit/version.py +84 -0
  765. qiskit/visualization/__init__.py +288 -0
  766. qiskit/visualization/array.py +204 -0
  767. qiskit/visualization/bloch.py +778 -0
  768. qiskit/visualization/circuit/__init__.py +15 -0
  769. qiskit/visualization/circuit/_utils.py +675 -0
  770. qiskit/visualization/circuit/circuit_visualization.py +726 -0
  771. qiskit/visualization/circuit/latex.py +661 -0
  772. qiskit/visualization/circuit/matplotlib.py +2029 -0
  773. qiskit/visualization/circuit/qcstyle.py +278 -0
  774. qiskit/visualization/circuit/styles/__init__.py +13 -0
  775. qiskit/visualization/circuit/styles/bw.json +202 -0
  776. qiskit/visualization/circuit/styles/clifford.json +202 -0
  777. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  778. qiskit/visualization/circuit/styles/iqp.json +214 -0
  779. qiskit/visualization/circuit/styles/textbook.json +202 -0
  780. qiskit/visualization/circuit/text.py +1844 -0
  781. qiskit/visualization/circuit_visualization.py +19 -0
  782. qiskit/visualization/counts_visualization.py +481 -0
  783. qiskit/visualization/dag_visualization.py +316 -0
  784. qiskit/visualization/exceptions.py +21 -0
  785. qiskit/visualization/gate_map.py +1485 -0
  786. qiskit/visualization/library.py +37 -0
  787. qiskit/visualization/pass_manager_visualization.py +319 -0
  788. qiskit/visualization/pulse_v2/__init__.py +21 -0
  789. qiskit/visualization/pulse_v2/core.py +901 -0
  790. qiskit/visualization/pulse_v2/device_info.py +173 -0
  791. qiskit/visualization/pulse_v2/drawings.py +253 -0
  792. qiskit/visualization/pulse_v2/events.py +254 -0
  793. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  794. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  795. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  796. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  797. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  798. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  799. qiskit/visualization/pulse_v2/interface.py +456 -0
  800. qiskit/visualization/pulse_v2/layouts.py +387 -0
  801. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  802. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  803. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  804. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  805. qiskit/visualization/pulse_v2/types.py +242 -0
  806. qiskit/visualization/state_visualization.py +1518 -0
  807. qiskit/visualization/timeline/__init__.py +21 -0
  808. qiskit/visualization/timeline/core.py +457 -0
  809. qiskit/visualization/timeline/drawings.py +260 -0
  810. qiskit/visualization/timeline/generators.py +506 -0
  811. qiskit/visualization/timeline/interface.py +424 -0
  812. qiskit/visualization/timeline/layouts.py +115 -0
  813. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  814. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  815. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  816. qiskit/visualization/timeline/stylesheet.py +301 -0
  817. qiskit/visualization/timeline/types.py +148 -0
  818. qiskit/visualization/transition_visualization.py +369 -0
  819. qiskit/visualization/utils.py +49 -0
  820. qiskit-1.3.0b1.dist-info/LICENSE.txt +203 -0
  821. qiskit-1.3.0b1.dist-info/METADATA +221 -0
  822. qiskit-1.3.0b1.dist-info/RECORD +825 -0
  823. qiskit-1.3.0b1.dist-info/WHEEL +5 -0
  824. qiskit-1.3.0b1.dist-info/entry_points.txt +57 -0
  825. qiskit-1.3.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,691 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022, 2023.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """
14
+ High-level-synthesis transpiler pass.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import typing
20
+ from functools import partial
21
+ from collections.abc import Callable
22
+
23
+ import numpy as np
24
+
25
+ from qiskit.circuit.annotated_operation import Modifier
26
+ from qiskit.circuit.operation import Operation
27
+ from qiskit.circuit.instruction import Instruction
28
+ from qiskit.converters import circuit_to_dag, dag_to_circuit
29
+ from qiskit.transpiler.basepasses import TransformationPass
30
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
31
+ from qiskit.circuit import ControlledGate, EquivalenceLibrary, equivalence
32
+ from qiskit.transpiler.passes.utils import control_flow
33
+ from qiskit.transpiler.target import Target
34
+ from qiskit.transpiler.coupling import CouplingMap
35
+ from qiskit.dagcircuit.dagcircuit import DAGCircuit
36
+ from qiskit.transpiler.exceptions import TranspilerError
37
+
38
+ from qiskit.circuit.annotated_operation import (
39
+ AnnotatedOperation,
40
+ InverseModifier,
41
+ ControlModifier,
42
+ PowerModifier,
43
+ )
44
+
45
+ from .plugin import HighLevelSynthesisPluginManager
46
+ from .qubit_tracker import QubitTracker
47
+
48
+ if typing.TYPE_CHECKING:
49
+ from qiskit.dagcircuit import DAGOpNode
50
+
51
+
52
+ class HLSConfig:
53
+ """The high-level-synthesis config allows to specify a list of "methods" used by
54
+ :class:`~.HighLevelSynthesis` transformation pass to synthesize different types
55
+ of higher-level objects.
56
+
57
+ A higher-level object is an object of type :class:`~.Operation` (e.g., :class:`.Clifford` or
58
+ :class:`.LinearFunction`). Each object is referred to by its :attr:`~.Operation.name` field
59
+ (e.g., ``"clifford"`` for :class:`.Clifford` objects), and the applicable synthesis methods are
60
+ tied to this name.
61
+
62
+ In the config, each method is specified in one of several ways:
63
+
64
+ 1. a tuple consisting of the name of a known synthesis plugin and a dictionary providing
65
+ additional arguments for the algorithm.
66
+ 2. a tuple consisting of an instance of :class:`.HighLevelSynthesisPlugin` and additional
67
+ arguments for the algorithm.
68
+ 3. a single string of a known synthesis plugin
69
+ 4. a single instance of :class:`.HighLevelSynthesisPlugin`.
70
+
71
+ The following example illustrates different ways how a config file can be created::
72
+
73
+ from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig
74
+ from qiskit.transpiler.passes.synthesis.high_level_synthesis import ACGSynthesisPermutation
75
+
76
+ # All the ways to specify hls_config are equivalent
77
+ hls_config = HLSConfig(permutation=[("acg", {})])
78
+ hls_config = HLSConfig(permutation=["acg"])
79
+ hls_config = HLSConfig(permutation=[(ACGSynthesisPermutation(), {})])
80
+ hls_config = HLSConfig(permutation=[ACGSynthesisPermutation()])
81
+
82
+ The names of the synthesis plugins should be declared in ``entry-points`` table for
83
+ ``qiskit.synthesis`` in ``pyproject.toml``, in the form
84
+ <higher-level-object-name>.<synthesis-method-name>.
85
+
86
+ The standard higher-level-objects are recommended to have a synthesis method
87
+ called "default", which would be called automatically when synthesizing these objects,
88
+ without having to explicitly set these methods in the config.
89
+
90
+ To avoid synthesizing a given higher-level-object, one can give it an empty list of methods.
91
+
92
+ For an explicit example of using such config files, refer to the documentation for
93
+ :class:`~.HighLevelSynthesis`.
94
+
95
+ For an overview of the complete process of using high-level synthesis, see
96
+ :ref:`using-high-level-synthesis-plugins`.
97
+ """
98
+
99
+ def __init__(
100
+ self,
101
+ use_default_on_unspecified: bool = True,
102
+ plugin_selection: str = "sequential",
103
+ plugin_evaluation_fn: Callable[[QuantumCircuit], int] | None = None,
104
+ **kwargs,
105
+ ):
106
+ """Creates a high-level-synthesis config.
107
+
108
+ Args:
109
+ use_default_on_unspecified: if True, every higher-level-object without an
110
+ explicitly specified list of methods will be synthesized using the "default"
111
+ algorithm if it exists.
112
+ plugin_selection: if set to ``"sequential"`` (default), for every higher-level-object
113
+ the synthesis pass will consider the specified methods sequentially, stopping
114
+ at the first method that is able to synthesize the object. If set to ``"all"``,
115
+ all the specified methods will be considered, and the best synthesized circuit,
116
+ according to ``plugin_evaluation_fn`` will be chosen.
117
+ plugin_evaluation_fn: a callable that evaluates the quality of the synthesized
118
+ quantum circuit; a smaller value means a better circuit. If ``None``, the
119
+ quality of the circuit its size (i.e. the number of gates that it contains).
120
+ kwargs: a dictionary mapping higher-level-objects to lists of synthesis methods.
121
+ """
122
+ self.use_default_on_unspecified = use_default_on_unspecified
123
+ self.plugin_selection = plugin_selection
124
+ self.plugin_evaluation_fn = (
125
+ plugin_evaluation_fn if plugin_evaluation_fn is not None else lambda qc: qc.size()
126
+ )
127
+ self.methods = {}
128
+
129
+ for key, value in kwargs.items():
130
+ self.set_methods(key, value)
131
+
132
+ def set_methods(self, hls_name, hls_methods):
133
+ """Sets the list of synthesis methods for a given higher-level-object. This overwrites
134
+ the lists of methods if also set previously."""
135
+ self.methods[hls_name] = hls_methods
136
+
137
+
138
+ class HighLevelSynthesis(TransformationPass):
139
+ r"""Synthesize higher-level objects and unroll custom definitions.
140
+
141
+ The input to this pass is a DAG that may contain higher-level objects,
142
+ including abstract mathematical objects (e.g., objects of type :class:`.LinearFunction`),
143
+ annotated operations (objects of type :class:`.AnnotatedOperation`), and
144
+ custom gates.
145
+
146
+ In the most common use-case when either ``basis_gates`` or ``target`` is specified,
147
+ all higher-level objects are synthesized, so the output is a :class:`.DAGCircuit`
148
+ without such objects.
149
+ More precisely, every gate in the output DAG is either directly supported by the target,
150
+ or is in ``equivalence_library``.
151
+
152
+ The abstract mathematical objects are synthesized using synthesis plugins, applying
153
+ synthesis methods specified in the high-level-synthesis config (refer to the documentation
154
+ for :class:`~.HLSConfig`).
155
+
156
+ As an example, let us assume that ``op_a`` and ``op_b`` are names of two higher-level objects,
157
+ that ``op_a``-objects have two synthesis methods ``default`` which does require any additional
158
+ parameters and ``other`` with two optional integer parameters ``option_1`` and ``option_2``,
159
+ that ``op_b``-objects have a single synthesis method ``default``, and ``qc`` is a quantum
160
+ circuit containing ``op_a`` and ``op_b`` objects. The following code snippet::
161
+
162
+ hls_config = HLSConfig(op_b=[("other", {"option_1": 7, "option_2": 4})])
163
+ pm = PassManager([HighLevelSynthesis(hls_config=hls_config)])
164
+ transpiled_qc = pm.run(qc)
165
+
166
+ shows how to run the alternative synthesis method ``other`` for ``op_b``-objects, while using the
167
+ ``default`` methods for all other high-level objects, including ``op_a``-objects.
168
+
169
+ The annotated operations (consisting of a base operation and a list of inverse, control and power
170
+ modifiers) are synthesizing recursively, first synthesizing the base operation, and then applying
171
+ synthesis methods for creating inverted, controlled, or powered versions of that).
172
+
173
+ The custom gates are synthesized by recursively unrolling their definitions, until every gate
174
+ is either supported by the target or is in the equivalence library.
175
+
176
+ When neither ``basis_gates`` nor ``target`` is specified, the pass synthesizes only the top-level
177
+ abstract mathematical objects and annotated operations, without descending into the gate
178
+ ``definitions``. This is consistent with the older behavior of the pass, allowing to synthesize
179
+ some higher-level objects using plugins and leaving the other gates untouched.
180
+
181
+ The high-level-synthesis passes information about available auxiliary qubits, and whether their
182
+ state is clean (defined as :math:`|0\rangle`) or dirty (unknown state) to the synthesis routine
183
+ via the respective arguments ``"num_clean_ancillas"`` and ``"num_dirty_ancillas"``.
184
+ If ``qubits_initially_zero`` is ``True`` (default), the qubits are assumed to be in the
185
+ :math:`|0\rangle` state. When appending a synthesized block using auxiliary qubits onto the
186
+ circuit, we first use the clean auxiliary qubits.
187
+
188
+ .. note::
189
+
190
+ Synthesis methods are assumed to maintain the state of the auxiliary qubits.
191
+ Concretely this means that clean auxiliary qubits must still be in the :math:`|0\rangle`
192
+ state after the synthesized block, while dirty auxiliary qubits are re-used only
193
+ as dirty qubits.
194
+
195
+ """
196
+
197
+ def __init__(
198
+ self,
199
+ hls_config: HLSConfig | None = None,
200
+ coupling_map: CouplingMap | None = None,
201
+ target: Target | None = None,
202
+ use_qubit_indices: bool = False,
203
+ equivalence_library: EquivalenceLibrary | None = None,
204
+ basis_gates: list[str] | None = None,
205
+ min_qubits: int = 0,
206
+ qubits_initially_zero: bool = True,
207
+ ):
208
+ r"""
209
+ HighLevelSynthesis initializer.
210
+
211
+ Args:
212
+ hls_config: Optional, the high-level-synthesis config that specifies synthesis methods
213
+ and parameters for various high-level-objects in the circuit. If it is not specified,
214
+ the default synthesis methods and parameters will be used.
215
+ coupling_map: Optional, directed graph represented as a coupling map.
216
+ target: Optional, the backend target to use for this pass. If it is specified,
217
+ it will be used instead of the coupling map.
218
+ use_qubit_indices: a flag indicating whether this synthesis pass is running before or after
219
+ the layout is set, that is, whether the qubit indices of higher-level-objects correspond
220
+ to qubit indices on the target backend.
221
+ equivalence_library: The equivalence library used (instructions in this library will not
222
+ be unrolled by this pass).
223
+ basis_gates: Optional, target basis names to unroll to, e.g. `['u3', 'cx']`.
224
+ Ignored if ``target`` is also specified.
225
+ min_qubits: The minimum number of qubits for operations in the input
226
+ dag to translate.
227
+ qubits_initially_zero: Indicates whether the qubits are initially in the state
228
+ :math:`|0\rangle`. This allows the high-level-synthesis to use clean auxiliary qubits
229
+ (i.e. in the zero state) to synthesize an operation.
230
+ """
231
+ super().__init__()
232
+
233
+ if hls_config is not None:
234
+ self.hls_config = hls_config
235
+ else:
236
+ # When the config file is not provided, we will use the "default" method
237
+ # to synthesize Operations (when available).
238
+ self.hls_config = HLSConfig(True)
239
+
240
+ self.hls_plugin_manager = HighLevelSynthesisPluginManager()
241
+ self._coupling_map = coupling_map
242
+ self._target = target
243
+ self._use_qubit_indices = use_qubit_indices
244
+ self.qubits_initially_zero = qubits_initially_zero
245
+ if target is not None:
246
+ self._coupling_map = self._target.build_coupling_map()
247
+ self._equiv_lib = equivalence_library
248
+ self._basis_gates = basis_gates
249
+ self._min_qubits = min_qubits
250
+
251
+ self._top_level_only = self._basis_gates is None and self._target is None
252
+
253
+ # include path for when target exists but target.num_qubits is None (BasicSimulator)
254
+ if not self._top_level_only and (self._target is None or self._target.num_qubits is None):
255
+ basic_insts = {"measure", "reset", "barrier", "snapshot", "delay", "store"}
256
+ self._device_insts = basic_insts | set(self._basis_gates)
257
+ else:
258
+ self._device_insts = set()
259
+
260
+ def run(self, dag: DAGCircuit) -> DAGCircuit:
261
+ """Run the HighLevelSynthesis pass on `dag`.
262
+
263
+ Args:
264
+ dag: input dag.
265
+
266
+ Returns:
267
+ Output dag with higher-level operations synthesized.
268
+
269
+ Raises:
270
+ TranspilerError: when the transpiler is unable to synthesize the given DAG
271
+ (for instance, when the specified synthesis method is not available).
272
+ """
273
+ qubits = tuple(dag.find_bit(q).index for q in dag.qubits)
274
+ if self.qubits_initially_zero:
275
+ clean, dirty = set(qubits), set()
276
+ else:
277
+ clean, dirty = set(), set(qubits)
278
+
279
+ tracker = QubitTracker(qubits=qubits, clean=clean, dirty=dirty)
280
+ return self._run(dag, tracker)
281
+
282
+ def _run(self, dag: DAGCircuit, tracker: QubitTracker) -> DAGCircuit:
283
+ # Check if HighLevelSynthesis can be skipped.
284
+ for node in dag.op_nodes():
285
+ qubits = tuple(dag.find_bit(q).index for q in node.qargs)
286
+ if not self._definitely_skip_node(node, qubits, dag):
287
+ break
288
+ else:
289
+ # The for-loop terminates without reaching the break statement
290
+ return dag
291
+
292
+ # Start by analyzing the nodes in the DAG. This for-loop is a first version of a potentially
293
+ # more elaborate approach to find good operation/ancilla allocations. It greedily iterates
294
+ # over the nodes, checking whether we can synthesize them, while keeping track of the
295
+ # qubit states. It does not trade-off allocations and just gives all available qubits
296
+ # to the current operation (a "the-first-takes-all" approach).
297
+ synthesized_nodes = {}
298
+
299
+ for node in dag.topological_op_nodes():
300
+ qubits = tuple(dag.find_bit(q).index for q in node.qargs)
301
+ synthesized = None
302
+ used_qubits = None
303
+
304
+ # check if synthesis for the operation can be skipped
305
+ if self._definitely_skip_node(node, qubits, dag):
306
+ pass
307
+
308
+ # next check control flow
309
+ elif node.is_control_flow():
310
+ dag.substitute_node(
311
+ node,
312
+ control_flow.map_blocks(partial(self._run, tracker=tracker.copy()), node.op),
313
+ propagate_condition=False,
314
+ )
315
+
316
+ # now we are free to synthesize
317
+ else:
318
+ # this returns the synthesized operation and the qubits it acts on -- note that this
319
+ # may be different from the original qubits, since we may use auxiliary qubits
320
+ synthesized, used_qubits = self._synthesize_operation(node.op, qubits, tracker)
321
+
322
+ # if the synthesis changed the operation (i.e. it is not None), store the result
323
+ # and mark the operation qubits as used
324
+ if synthesized is not None:
325
+ synthesized_nodes[node] = (synthesized, used_qubits)
326
+ tracker.used(qubits) # assumes that auxiliary are returned in the same state
327
+
328
+ # if the synthesis did not change anything, just update the qubit tracker
329
+ # other cases can be added: swaps, controlled gates (e.g. if control is 0), ...
330
+ else:
331
+ if node.op.name in ["id", "delay", "barrier"]:
332
+ pass # tracker not updated, these are no-ops
333
+ elif node.op.name == "reset":
334
+ tracker.reset(qubits) # reset qubits to 0
335
+ else:
336
+ tracker.used(qubits) # any other op used the clean state up
337
+
338
+ # we did not change anything just return the input
339
+ if len(synthesized_nodes) == 0:
340
+ return dag
341
+
342
+ # Otherwise, we will rebuild with the new operations. Note that we could also
343
+ # check if no operation changed in size and substitute in-place, but rebuilding is
344
+ # generally as fast or faster, unless very few operations are changed.
345
+ out = dag.copy_empty_like()
346
+ index_to_qubit = dict(enumerate(dag.qubits))
347
+
348
+ for node in dag.topological_op_nodes():
349
+ if node in synthesized_nodes:
350
+ op, qubits = synthesized_nodes[node]
351
+ qargs = tuple(index_to_qubit[index] for index in qubits)
352
+ if isinstance(op, Operation):
353
+ out.apply_operation_back(op, qargs, cargs=[])
354
+ continue
355
+
356
+ if isinstance(op, QuantumCircuit):
357
+ op = circuit_to_dag(op, copy_operations=False)
358
+
359
+ if isinstance(op, DAGCircuit):
360
+ qubit_map = {
361
+ qubit: index_to_qubit[index] for index, qubit in zip(qubits, op.qubits)
362
+ }
363
+ clbit_map = dict(zip(op.clbits, node.cargs))
364
+ for sub_node in op.op_nodes():
365
+ out.apply_operation_back(
366
+ sub_node.op,
367
+ tuple(qubit_map[qarg] for qarg in sub_node.qargs),
368
+ tuple(clbit_map[carg] for carg in sub_node.cargs),
369
+ )
370
+ out.global_phase += op.global_phase
371
+ else:
372
+ raise RuntimeError(f"Unexpected synthesized type: {type(op)}")
373
+ else:
374
+ out.apply_operation_back(node.op, node.qargs, node.cargs, check=False)
375
+
376
+ return out
377
+
378
+ def _synthesize_operation(
379
+ self,
380
+ operation: Operation,
381
+ qubits: tuple[int],
382
+ tracker: QubitTracker,
383
+ ) -> tuple[QuantumCircuit | Operation | DAGCircuit | None, list[int] | None]:
384
+ # Try to synthesize the operation. We'll go through the following options:
385
+ # (1) Annotations: if the operator is annotated, synthesize the base operation
386
+ # and then apply the modifiers. Returns a circuit (e.g. applying a power)
387
+ # or operation (e.g adding control on an X gate).
388
+ # (2) High-level objects: try running the battery of high-level synthesis plugins (e.g.
389
+ # if the operation is a Clifford). Returns a circuit.
390
+ # (3) Unrolling custom definitions: try defining the operation if it is not yet
391
+ # in the set of supported instructions. Returns a circuit.
392
+ # If any of the above were triggered, we will recurse and go again through these steps
393
+ # until no further change occurred. At this point, we convert circuits to DAGs (the final
394
+ # possible return type). If there was no change, we just return ``None``.
395
+ synthesized = None
396
+
397
+ # Try synthesizing via AnnotatedOperation. This is faster than an isinstance check
398
+ # but a bit less safe since someone could create operations with a ``modifiers`` attribute.
399
+ if len(modifiers := getattr(operation, "modifiers", [])) > 0:
400
+ # The base operation must be synthesized without using potential control qubits
401
+ # used in the modifiers.
402
+ num_ctrl = sum(
403
+ mod.num_ctrl_qubits for mod in modifiers if isinstance(mod, ControlModifier)
404
+ )
405
+ baseop_qubits = qubits[num_ctrl:] # reminder: control qubits are the first ones
406
+ baseop_tracker = tracker.copy(drop=qubits[:num_ctrl]) # no access to control qubits
407
+
408
+ # get qubits of base operation
409
+ synthesized_base_op, _ = self._synthesize_operation(
410
+ operation.base_op, baseop_qubits, baseop_tracker
411
+ )
412
+ if synthesized_base_op is None:
413
+ synthesized_base_op = operation.base_op
414
+ elif isinstance(synthesized_base_op, DAGCircuit):
415
+ synthesized_base_op = dag_to_circuit(synthesized_base_op)
416
+
417
+ synthesized = self._apply_annotations(synthesized_base_op, operation.modifiers)
418
+
419
+ # If it was no AnnotatedOperation, try synthesizing via HLS or by unrolling.
420
+ else:
421
+ # Try synthesis via HLS -- which will return ``None`` if unsuccessful.
422
+ indices = qubits if self._use_qubit_indices else None
423
+ if len(hls_methods := self._methods_to_try(operation.name)) > 0:
424
+ synthesized = self._synthesize_op_using_plugins(
425
+ hls_methods,
426
+ operation,
427
+ indices,
428
+ tracker.num_clean(qubits),
429
+ tracker.num_dirty(qubits),
430
+ )
431
+
432
+ # If HLS did not apply, or was unsuccessful, try unrolling custom definitions.
433
+ if synthesized is None and not self._top_level_only:
434
+ synthesized = self._unroll_custom_definition(operation, indices)
435
+
436
+ if synthesized is None:
437
+ # if we didn't synthesize, there was nothing to unroll, so just set the used qubits
438
+ used_qubits = qubits
439
+
440
+ else:
441
+ # if it has been synthesized, recurse and finally store the decomposition
442
+ if isinstance(synthesized, Operation):
443
+ re_synthesized, qubits = self._synthesize_operation(
444
+ synthesized, qubits, tracker.copy()
445
+ )
446
+ if re_synthesized is not None:
447
+ synthesized = re_synthesized
448
+ used_qubits = qubits
449
+
450
+ elif isinstance(synthesized, QuantumCircuit):
451
+ aux_qubits = tracker.borrow(synthesized.num_qubits - len(qubits), qubits)
452
+ used_qubits = qubits + tuple(aux_qubits)
453
+ as_dag = circuit_to_dag(synthesized, copy_operations=False)
454
+
455
+ # map used qubits to subcircuit
456
+ new_qubits = [as_dag.find_bit(q).index for q in as_dag.qubits]
457
+ qubit_map = dict(zip(used_qubits, new_qubits))
458
+
459
+ synthesized = self._run(as_dag, tracker.copy(qubit_map))
460
+ if synthesized.num_qubits() != len(used_qubits):
461
+ raise RuntimeError(
462
+ f"Mismatching number of qubits, using {synthesized.num_qubits()} "
463
+ f"but have {len(used_qubits)}."
464
+ )
465
+
466
+ else:
467
+ raise RuntimeError(f"Unexpected synthesized type: {type(synthesized)}")
468
+
469
+ if synthesized is not None and used_qubits is None:
470
+ raise RuntimeError("Failed to find qubit indices on", synthesized)
471
+
472
+ return synthesized, used_qubits
473
+
474
+ def _unroll_custom_definition(
475
+ self, inst: Instruction, qubits: list[int] | None
476
+ ) -> QuantumCircuit | None:
477
+ # check if the operation is already supported natively
478
+ if not (isinstance(inst, ControlledGate) and inst._open_ctrl):
479
+ # include path for when target exists but target.num_qubits is None (BasicSimulator)
480
+ inst_supported = self._instruction_supported(inst.name, qubits)
481
+ if inst_supported or (self._equiv_lib is not None and self._equiv_lib.has_entry(inst)):
482
+ return None # we support this operation already
483
+
484
+ # if not, try to get the definition
485
+ try:
486
+ definition = inst.definition
487
+ except (TypeError, AttributeError) as err:
488
+ raise TranspilerError(f"HighLevelSynthesis was unable to define {inst.name}.") from err
489
+
490
+ if definition is None:
491
+ raise TranspilerError(f"HighLevelSynthesis was unable to synthesize {inst}.")
492
+
493
+ return definition
494
+
495
+ def _methods_to_try(self, name: str):
496
+ """Get a sequence of methods to try for a given op name."""
497
+ if (methods := self.hls_config.methods.get(name)) is not None:
498
+ # the operation's name appears in the user-provided config,
499
+ # we use the list of methods provided by the user
500
+ return methods
501
+ if (
502
+ self.hls_config.use_default_on_unspecified
503
+ and "default" in self.hls_plugin_manager.method_names(name)
504
+ ):
505
+ # the operation's name does not appear in the user-specified config,
506
+ # we use the "default" method when instructed to do so and the "default"
507
+ # method is available
508
+ return ["default"]
509
+ return []
510
+
511
+ def _synthesize_op_using_plugins(
512
+ self,
513
+ hls_methods: list,
514
+ op: Operation,
515
+ qubits: list[int] | None,
516
+ num_clean_ancillas: int = 0,
517
+ num_dirty_ancillas: int = 0,
518
+ ) -> QuantumCircuit | None:
519
+ """
520
+ Attempts to synthesize op using plugin mechanism.
521
+
522
+ The arguments ``num_clean_ancillas`` and ``num_dirty_ancillas`` specify
523
+ the number of clean and dirty qubits available to synthesize the given
524
+ operation. A synthesis method does not need to use these additional qubits.
525
+
526
+ Returns either the synthesized circuit or None (which may occur
527
+ when no synthesis methods is available or specified, or when there is
528
+ an insufficient number of auxiliary qubits).
529
+ """
530
+ hls_plugin_manager = self.hls_plugin_manager
531
+
532
+ best_decomposition = None
533
+ best_score = np.inf
534
+
535
+ for method in hls_methods:
536
+ # There are two ways to specify a synthesis method. The more explicit
537
+ # way is to specify it as a tuple consisting of a synthesis algorithm and a
538
+ # list of additional arguments, e.g.,
539
+ # ("kms", {"all_mats": 1, "max_paths": 100, "orig_circuit": 0}), or
540
+ # ("pmh", {}).
541
+ # When the list of additional arguments is empty, one can also specify
542
+ # just the synthesis algorithm, e.g.,
543
+ # "pmh".
544
+ if isinstance(method, tuple):
545
+ plugin_specifier, plugin_args = method
546
+ else:
547
+ plugin_specifier = method
548
+ plugin_args = {}
549
+
550
+ # There are two ways to specify a synthesis algorithm being run,
551
+ # either by name, e.g. "kms" (which then should be specified in entry_points),
552
+ # or directly as a class inherited from HighLevelSynthesisPlugin (which then
553
+ # does not need to be specified in entry_points).
554
+ if isinstance(plugin_specifier, str):
555
+ if plugin_specifier not in hls_plugin_manager.method_names(op.name):
556
+ raise TranspilerError(
557
+ f"Specified method: {plugin_specifier} not found in available "
558
+ f"plugins for {op.name}"
559
+ )
560
+ plugin_method = hls_plugin_manager.method(op.name, plugin_specifier)
561
+ else:
562
+ plugin_method = plugin_specifier
563
+
564
+ # Set the number of available clean and dirty auxiliary qubits via plugin args.
565
+ plugin_args["num_clean_ancillas"] = num_clean_ancillas
566
+ plugin_args["num_dirty_ancillas"] = num_dirty_ancillas
567
+
568
+ decomposition = plugin_method.run(
569
+ op,
570
+ coupling_map=self._coupling_map,
571
+ target=self._target,
572
+ qubits=qubits,
573
+ **plugin_args,
574
+ )
575
+
576
+ # The synthesis methods that are not suited for the given higher-level-object
577
+ # will return None.
578
+ if decomposition is not None:
579
+ if self.hls_config.plugin_selection == "sequential":
580
+ # In the "sequential" mode the first successful decomposition is
581
+ # returned.
582
+ best_decomposition = decomposition
583
+ break
584
+
585
+ # In the "run everything" mode we update the best decomposition
586
+ # discovered
587
+ current_score = self.hls_config.plugin_evaluation_fn(decomposition)
588
+ if current_score < best_score:
589
+ best_decomposition = decomposition
590
+ best_score = current_score
591
+
592
+ return best_decomposition
593
+
594
+ def _apply_annotations(
595
+ self, synthesized: Operation | QuantumCircuit, modifiers: list[Modifier]
596
+ ) -> QuantumCircuit:
597
+ """
598
+ Recursively synthesizes annotated operations.
599
+ Returns either the synthesized operation or None (which occurs when the operation
600
+ is not an annotated operation).
601
+ """
602
+ for modifier in modifiers:
603
+ if isinstance(modifier, InverseModifier):
604
+ # Both QuantumCircuit and Gate have inverse method
605
+ synthesized = synthesized.inverse()
606
+
607
+ elif isinstance(modifier, ControlModifier):
608
+ # Both QuantumCircuit and Gate have control method, however for circuits
609
+ # it is more efficient to avoid constructing the controlled quantum circuit.
610
+ if isinstance(synthesized, QuantumCircuit):
611
+ synthesized = synthesized.to_gate()
612
+
613
+ synthesized = synthesized.control(
614
+ num_ctrl_qubits=modifier.num_ctrl_qubits,
615
+ label=None,
616
+ ctrl_state=modifier.ctrl_state,
617
+ annotated=False,
618
+ )
619
+
620
+ if isinstance(synthesized, AnnotatedOperation):
621
+ raise TranspilerError(
622
+ "HighLevelSynthesis failed to synthesize the control modifier."
623
+ )
624
+
625
+ elif isinstance(modifier, PowerModifier):
626
+ # QuantumCircuit has power method, and Gate needs to be converted
627
+ # to a quantum circuit.
628
+ if not isinstance(synthesized, QuantumCircuit):
629
+ synthesized = _instruction_to_circuit(synthesized)
630
+
631
+ synthesized = synthesized.power(modifier.power)
632
+
633
+ else:
634
+ raise TranspilerError(f"Unknown modifier {modifier}.")
635
+
636
+ return synthesized
637
+
638
+ def _definitely_skip_node(
639
+ self, node: DAGOpNode, qubits: tuple[int] | None, dag: DAGCircuit
640
+ ) -> bool:
641
+ """Fast-path determination of whether a node can certainly be skipped (i.e. nothing will
642
+ attempt to synthesise it) without accessing its Python-space `Operation`.
643
+
644
+ This is tightly coupled to `_recursively_handle_op`; it exists as a temporary measure to
645
+ avoid Python-space `Operation` creation from a `DAGOpNode` if we wouldn't do anything to the
646
+ node (which is _most_ nodes)."""
647
+
648
+ if (
649
+ dag.has_calibration_for(node)
650
+ or len(node.qargs) < self._min_qubits
651
+ or node.is_directive()
652
+ ):
653
+ return True
654
+
655
+ return (
656
+ # The fast path is just for Rust-space standard gates (which excludes
657
+ # `AnnotatedOperation`).
658
+ node.is_standard_gate()
659
+ # We don't have the fast-path for controlled gates over 3 or more qubits.
660
+ # However, we most probably want the fast-path for controlled 2-qubit gates
661
+ # (such as CX, CZ, CY, CH, CRX, and so on), so "_definitely_skip_node" should
662
+ # not immediately return False when encountering a controlled gate over 2 qubits.
663
+ and not (node.is_controlled_gate() and node.num_qubits >= 3)
664
+ # If there are plugins to try, they need to be tried.
665
+ and not self._methods_to_try(node.name)
666
+ # If all the above constraints hold, and it's already supported or the basis translator
667
+ # can handle it, we'll leave it be.
668
+ and (
669
+ self._instruction_supported(node.name, qubits)
670
+ # This uses unfortunately private details of `EquivalenceLibrary`, but so does the
671
+ # `BasisTranslator`, and this is supposed to just be temporary til this is moved
672
+ # into Rust space.
673
+ or (
674
+ self._equiv_lib is not None
675
+ and equivalence.Key(name=node.name, num_qubits=node.num_qubits)
676
+ in self._equiv_lib._key_to_node_index
677
+ )
678
+ )
679
+ )
680
+
681
+ def _instruction_supported(self, name: str, qubits: tuple[int] | None) -> bool:
682
+ # include path for when target exists but target.num_qubits is None (BasicSimulator)
683
+ if self._target is None or self._target.num_qubits is None:
684
+ return name in self._device_insts
685
+ return self._target.instruction_supported(operation_name=name, qargs=qubits)
686
+
687
+
688
+ def _instruction_to_circuit(inst: Instruction) -> QuantumCircuit:
689
+ circuit = QuantumCircuit(inst.num_qubits, inst.num_clbits)
690
+ circuit.append(inst, circuit.qubits, circuit.clbits)
691
+ return circuit