qiskit 2.1.0rc1__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.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 (699) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +159 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1335 -0
  6. qiskit/circuit/_add_control.py +338 -0
  7. qiskit/circuit/_classical_resource_map.py +154 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/annotation.py +404 -0
  12. qiskit/circuit/barrier.py +46 -0
  13. qiskit/circuit/classical/__init__.py +41 -0
  14. qiskit/circuit/classical/expr/__init__.py +266 -0
  15. qiskit/circuit/classical/expr/constructors.py +764 -0
  16. qiskit/circuit/classical/expr/expr.py +156 -0
  17. qiskit/circuit/classical/expr/visitors.py +381 -0
  18. qiskit/circuit/classical/types/__init__.py +113 -0
  19. qiskit/circuit/classical/types/ordering.py +229 -0
  20. qiskit/circuit/classical/types/types.py +30 -0
  21. qiskit/circuit/commutation_checker.py +133 -0
  22. qiskit/circuit/commutation_library.py +20 -0
  23. qiskit/circuit/controlflow/__init__.py +59 -0
  24. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  25. qiskit/circuit/controlflow/box.py +188 -0
  26. qiskit/circuit/controlflow/break_loop.py +56 -0
  27. qiskit/circuit/controlflow/builder.py +791 -0
  28. qiskit/circuit/controlflow/continue_loop.py +56 -0
  29. qiskit/circuit/controlflow/control_flow.py +94 -0
  30. qiskit/circuit/controlflow/for_loop.py +218 -0
  31. qiskit/circuit/controlflow/if_else.py +498 -0
  32. qiskit/circuit/controlflow/switch_case.py +411 -0
  33. qiskit/circuit/controlflow/while_loop.py +166 -0
  34. qiskit/circuit/controlledgate.py +274 -0
  35. qiskit/circuit/delay.py +159 -0
  36. qiskit/circuit/duration.py +80 -0
  37. qiskit/circuit/equivalence.py +94 -0
  38. qiskit/circuit/equivalence_library.py +18 -0
  39. qiskit/circuit/exceptions.py +19 -0
  40. qiskit/circuit/gate.py +261 -0
  41. qiskit/circuit/instruction.py +564 -0
  42. qiskit/circuit/instructionset.py +132 -0
  43. qiskit/circuit/library/__init__.py +984 -0
  44. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  45. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  46. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  47. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  48. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  49. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  50. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  51. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  52. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  53. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  54. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  55. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  56. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  57. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  58. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  59. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +506 -0
  60. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +395 -0
  61. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +501 -0
  62. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  63. qiskit/circuit/library/arithmetic/quadratic_form.py +370 -0
  64. qiskit/circuit/library/arithmetic/weighted_adder.py +428 -0
  65. qiskit/circuit/library/basis_change/__init__.py +15 -0
  66. qiskit/circuit/library/basis_change/qft.py +316 -0
  67. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  68. qiskit/circuit/library/blueprintcircuit.py +322 -0
  69. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  70. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  71. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  72. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  73. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  74. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  75. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  76. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  77. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  78. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  79. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  80. qiskit/circuit/library/fourier_checking.py +160 -0
  81. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  82. qiskit/circuit/library/generalized_gates/diagonal.py +163 -0
  83. qiskit/circuit/library/generalized_gates/gms.py +179 -0
  84. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  85. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  86. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  87. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  88. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  89. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  90. qiskit/circuit/library/generalized_gates/permutation.py +202 -0
  91. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  92. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  93. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  94. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  96. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  97. qiskit/circuit/library/generalized_gates/unitary.py +236 -0
  98. qiskit/circuit/library/graph_state.py +172 -0
  99. qiskit/circuit/library/grover_operator.py +583 -0
  100. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  101. qiskit/circuit/library/hidden_linear_function.py +163 -0
  102. qiskit/circuit/library/iqp.py +180 -0
  103. qiskit/circuit/library/n_local/__init__.py +45 -0
  104. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  105. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  106. qiskit/circuit/library/n_local/excitation_preserving.py +301 -0
  107. qiskit/circuit/library/n_local/n_local.py +1478 -0
  108. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  109. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  110. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  111. qiskit/circuit/library/n_local/two_local.py +289 -0
  112. qiskit/circuit/library/overlap.py +183 -0
  113. qiskit/circuit/library/pauli_evolution.py +202 -0
  114. qiskit/circuit/library/phase_estimation.py +177 -0
  115. qiskit/circuit/library/phase_oracle.py +239 -0
  116. qiskit/circuit/library/quantum_volume.py +179 -0
  117. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  118. qiskit/circuit/library/standard_gates/dcx.py +76 -0
  119. qiskit/circuit/library/standard_gates/ecr.py +126 -0
  120. qiskit/circuit/library/standard_gates/equivalence_library.py +1936 -0
  121. qiskit/circuit/library/standard_gates/global_phase.py +83 -0
  122. qiskit/circuit/library/standard_gates/h.py +230 -0
  123. qiskit/circuit/library/standard_gates/i.py +76 -0
  124. qiskit/circuit/library/standard_gates/iswap.py +115 -0
  125. qiskit/circuit/library/standard_gates/p.py +415 -0
  126. qiskit/circuit/library/standard_gates/r.py +108 -0
  127. qiskit/circuit/library/standard_gates/rx.py +269 -0
  128. qiskit/circuit/library/standard_gates/rxx.py +165 -0
  129. qiskit/circuit/library/standard_gates/ry.py +268 -0
  130. qiskit/circuit/library/standard_gates/ryy.py +165 -0
  131. qiskit/circuit/library/standard_gates/rz.py +290 -0
  132. qiskit/circuit/library/standard_gates/rzx.py +211 -0
  133. qiskit/circuit/library/standard_gates/rzz.py +181 -0
  134. qiskit/circuit/library/standard_gates/s.py +424 -0
  135. qiskit/circuit/library/standard_gates/swap.py +268 -0
  136. qiskit/circuit/library/standard_gates/sx.py +303 -0
  137. qiskit/circuit/library/standard_gates/t.py +169 -0
  138. qiskit/circuit/library/standard_gates/u.py +379 -0
  139. qiskit/circuit/library/standard_gates/u1.py +466 -0
  140. qiskit/circuit/library/standard_gates/u2.py +145 -0
  141. qiskit/circuit/library/standard_gates/u3.py +412 -0
  142. qiskit/circuit/library/standard_gates/x.py +1335 -0
  143. qiskit/circuit/library/standard_gates/xx_minus_yy.py +164 -0
  144. qiskit/circuit/library/standard_gates/xx_plus_yy.py +197 -0
  145. qiskit/circuit/library/standard_gates/y.py +253 -0
  146. qiskit/circuit/library/standard_gates/z.py +331 -0
  147. qiskit/circuit/library/templates/__init__.py +92 -0
  148. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  153. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  157. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  158. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  163. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  166. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  167. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  170. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  175. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  179. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  215. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  216. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  217. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  218. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  221. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  222. qiskit/circuit/measure.py +53 -0
  223. qiskit/circuit/operation.py +68 -0
  224. qiskit/circuit/parameter.py +188 -0
  225. qiskit/circuit/parameterexpression.py +737 -0
  226. qiskit/circuit/parametertable.py +119 -0
  227. qiskit/circuit/parametervector.py +140 -0
  228. qiskit/circuit/quantumcircuit.py +7610 -0
  229. qiskit/circuit/quantumcircuitdata.py +137 -0
  230. qiskit/circuit/random/__init__.py +50 -0
  231. qiskit/circuit/random/utils.py +755 -0
  232. qiskit/circuit/reset.py +37 -0
  233. qiskit/circuit/singleton.py +600 -0
  234. qiskit/circuit/store.py +89 -0
  235. qiskit/circuit/tools/__init__.py +16 -0
  236. qiskit/circuit/tools/pi_check.py +185 -0
  237. qiskit/circuit/twirling.py +145 -0
  238. qiskit/compiler/__init__.py +27 -0
  239. qiskit/compiler/transpiler.py +375 -0
  240. qiskit/converters/__init__.py +74 -0
  241. qiskit/converters/circuit_to_dag.py +80 -0
  242. qiskit/converters/circuit_to_dagdependency.py +49 -0
  243. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  244. qiskit/converters/circuit_to_gate.py +107 -0
  245. qiskit/converters/circuit_to_instruction.py +142 -0
  246. qiskit/converters/dag_to_circuit.py +79 -0
  247. qiskit/converters/dag_to_dagdependency.py +54 -0
  248. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  249. qiskit/converters/dagdependency_to_circuit.py +40 -0
  250. qiskit/converters/dagdependency_to_dag.py +48 -0
  251. qiskit/dagcircuit/__init__.py +44 -0
  252. qiskit/dagcircuit/collect_blocks.py +403 -0
  253. qiskit/dagcircuit/dagcircuit.py +24 -0
  254. qiskit/dagcircuit/dagdependency.py +612 -0
  255. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  256. qiskit/dagcircuit/dagdepnode.py +160 -0
  257. qiskit/dagcircuit/dagnode.py +193 -0
  258. qiskit/dagcircuit/exceptions.py +42 -0
  259. qiskit/exceptions.py +153 -0
  260. qiskit/passmanager/__init__.py +258 -0
  261. qiskit/passmanager/base_tasks.py +230 -0
  262. qiskit/passmanager/compilation_status.py +74 -0
  263. qiskit/passmanager/exceptions.py +19 -0
  264. qiskit/passmanager/flow_controllers.py +116 -0
  265. qiskit/passmanager/passmanager.py +353 -0
  266. qiskit/primitives/__init__.py +490 -0
  267. qiskit/primitives/backend_estimator_v2.py +530 -0
  268. qiskit/primitives/backend_sampler_v2.py +339 -0
  269. qiskit/primitives/base/__init__.py +20 -0
  270. qiskit/primitives/base/base_estimator.py +247 -0
  271. qiskit/primitives/base/base_primitive_job.py +78 -0
  272. qiskit/primitives/base/base_primitive_v1.py +45 -0
  273. qiskit/primitives/base/base_result_v1.py +65 -0
  274. qiskit/primitives/base/base_sampler.py +196 -0
  275. qiskit/primitives/base/estimator_result_v1.py +46 -0
  276. qiskit/primitives/base/sampler_result_v1.py +45 -0
  277. qiskit/primitives/base/validation_v1.py +250 -0
  278. qiskit/primitives/containers/__init__.py +26 -0
  279. qiskit/primitives/containers/bindings_array.py +391 -0
  280. qiskit/primitives/containers/bit_array.py +764 -0
  281. qiskit/primitives/containers/data_bin.py +172 -0
  282. qiskit/primitives/containers/estimator_pub.py +222 -0
  283. qiskit/primitives/containers/object_array.py +94 -0
  284. qiskit/primitives/containers/observables_array.py +380 -0
  285. qiskit/primitives/containers/primitive_result.py +53 -0
  286. qiskit/primitives/containers/pub_result.py +51 -0
  287. qiskit/primitives/containers/sampler_pub.py +193 -0
  288. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  289. qiskit/primitives/containers/shape.py +129 -0
  290. qiskit/primitives/primitive_job.py +100 -0
  291. qiskit/primitives/statevector_estimator.py +175 -0
  292. qiskit/primitives/statevector_sampler.py +290 -0
  293. qiskit/primitives/utils.py +72 -0
  294. qiskit/providers/__init__.py +677 -0
  295. qiskit/providers/backend.py +364 -0
  296. qiskit/providers/basic_provider/__init__.py +47 -0
  297. qiskit/providers/basic_provider/basic_provider.py +121 -0
  298. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  299. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  300. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  301. qiskit/providers/basic_provider/exceptions.py +30 -0
  302. qiskit/providers/exceptions.py +33 -0
  303. qiskit/providers/fake_provider/__init__.py +69 -0
  304. qiskit/providers/fake_provider/generic_backend_v2.py +376 -0
  305. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  306. qiskit/providers/job.py +147 -0
  307. qiskit/providers/jobstatus.py +30 -0
  308. qiskit/providers/options.py +273 -0
  309. qiskit/providers/providerutils.py +110 -0
  310. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  311. qiskit/qasm/libs/qelib1.inc +266 -0
  312. qiskit/qasm/libs/stdgates.inc +82 -0
  313. qiskit/qasm2/__init__.py +669 -0
  314. qiskit/qasm2/exceptions.py +27 -0
  315. qiskit/qasm2/export.py +364 -0
  316. qiskit/qasm2/parse.py +438 -0
  317. qiskit/qasm3/__init__.py +466 -0
  318. qiskit/qasm3/ast.py +796 -0
  319. qiskit/qasm3/exceptions.py +27 -0
  320. qiskit/qasm3/experimental.py +70 -0
  321. qiskit/qasm3/exporter.py +1363 -0
  322. qiskit/qasm3/printer.py +620 -0
  323. qiskit/qpy/__init__.py +2141 -0
  324. qiskit/qpy/binary_io/__init__.py +35 -0
  325. qiskit/qpy/binary_io/circuits.py +1687 -0
  326. qiskit/qpy/binary_io/parse_sympy_repr.py +126 -0
  327. qiskit/qpy/binary_io/schedules.py +288 -0
  328. qiskit/qpy/binary_io/value.py +1183 -0
  329. qiskit/qpy/common.py +361 -0
  330. qiskit/qpy/exceptions.py +53 -0
  331. qiskit/qpy/formats.py +458 -0
  332. qiskit/qpy/interface.py +384 -0
  333. qiskit/qpy/type_keys.py +415 -0
  334. qiskit/quantum_info/__init__.py +172 -0
  335. qiskit/quantum_info/analysis/__init__.py +17 -0
  336. qiskit/quantum_info/analysis/average.py +47 -0
  337. qiskit/quantum_info/analysis/distance.py +104 -0
  338. qiskit/quantum_info/analysis/make_observable.py +44 -0
  339. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  340. qiskit/quantum_info/operators/__init__.py +29 -0
  341. qiskit/quantum_info/operators/base_operator.py +145 -0
  342. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  343. qiskit/quantum_info/operators/channel/chi.py +191 -0
  344. qiskit/quantum_info/operators/channel/choi.py +218 -0
  345. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  346. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  347. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  348. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  349. qiskit/quantum_info/operators/channel/superop.py +373 -0
  350. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  351. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  352. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  354. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  355. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  356. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  357. qiskit/quantum_info/operators/linear_op.py +25 -0
  358. qiskit/quantum_info/operators/measures.py +418 -0
  359. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  360. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  361. qiskit/quantum_info/operators/mixins/group.py +171 -0
  362. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  363. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  364. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  365. qiskit/quantum_info/operators/op_shape.py +525 -0
  366. qiskit/quantum_info/operators/operator.py +869 -0
  367. qiskit/quantum_info/operators/operator_utils.py +76 -0
  368. qiskit/quantum_info/operators/predicates.py +183 -0
  369. qiskit/quantum_info/operators/random.py +154 -0
  370. qiskit/quantum_info/operators/scalar_op.py +254 -0
  371. qiskit/quantum_info/operators/symplectic/__init__.py +24 -0
  372. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  373. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  374. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +584 -0
  375. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  377. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  378. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  379. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  380. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  381. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  383. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  384. qiskit/quantum_info/quaternion.py +156 -0
  385. qiskit/quantum_info/random.py +26 -0
  386. qiskit/quantum_info/states/__init__.py +28 -0
  387. qiskit/quantum_info/states/densitymatrix.py +857 -0
  388. qiskit/quantum_info/states/measures.py +288 -0
  389. qiskit/quantum_info/states/quantum_state.py +503 -0
  390. qiskit/quantum_info/states/random.py +157 -0
  391. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  392. qiskit/quantum_info/states/statevector.py +977 -0
  393. qiskit/quantum_info/states/utils.py +247 -0
  394. qiskit/result/__init__.py +61 -0
  395. qiskit/result/counts.py +189 -0
  396. qiskit/result/distributions/__init__.py +17 -0
  397. qiskit/result/distributions/probability.py +100 -0
  398. qiskit/result/distributions/quasi.py +154 -0
  399. qiskit/result/exceptions.py +40 -0
  400. qiskit/result/models.py +241 -0
  401. qiskit/result/postprocess.py +239 -0
  402. qiskit/result/result.py +385 -0
  403. qiskit/result/sampled_expval.py +76 -0
  404. qiskit/result/utils.py +294 -0
  405. qiskit/synthesis/__init__.py +250 -0
  406. qiskit/synthesis/arithmetic/__init__.py +18 -0
  407. qiskit/synthesis/arithmetic/adders/__init__.py +18 -0
  408. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  409. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +107 -0
  410. qiskit/synthesis/arithmetic/adders/rv_ripple_carry_adder.py +156 -0
  411. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  412. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  413. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  414. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  415. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  416. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  417. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  418. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  419. qiskit/synthesis/boolean/__init__.py +13 -0
  420. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  421. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  422. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  423. qiskit/synthesis/clifford/__init__.py +19 -0
  424. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  425. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  426. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  427. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  428. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  429. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  431. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  432. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  433. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +53 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +280 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +316 -0
  442. qiskit/synthesis/evolution/qdrift.py +133 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +227 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +29 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +583 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +205 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +61 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +359 -0
  495. qiskit/transpiler/__init__.py +1352 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +263 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +278 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +197 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +54 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +525 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +292 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +245 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +251 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_clifford_t.py +68 -0
  556. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  557. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  558. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  559. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  560. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  561. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  562. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  563. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  564. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  565. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  566. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  567. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  569. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +633 -0
  570. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  571. qiskit/transpiler/passes/routing/__init__.py +21 -0
  572. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  573. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  574. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  575. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  576. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  581. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  582. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  583. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  584. qiskit/transpiler/passes/routing/sabre_swap.py +465 -0
  585. qiskit/transpiler/passes/routing/star_prerouting.py +433 -0
  586. qiskit/transpiler/passes/routing/utils.py +35 -0
  587. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  588. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  589. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  590. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  591. qiskit/transpiler/passes/scheduling/padding/__init__.py +17 -0
  592. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  593. qiskit/transpiler/passes/scheduling/padding/context_aware_dynamical_decoupling.py +876 -0
  594. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  595. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  599. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  600. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  601. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  602. qiskit/transpiler/passes/synthesis/__init__.py +21 -0
  603. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  604. qiskit/transpiler/passes/synthesis/clifford_unitary_synth_plugin.py +123 -0
  605. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  606. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  607. qiskit/transpiler/passes/synthesis/hls_plugins.py +2338 -0
  608. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  609. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  610. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +318 -0
  611. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  612. qiskit/transpiler/passes/utils/__init__.py +32 -0
  613. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  614. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  615. qiskit/transpiler/passes/utils/check_map.py +78 -0
  616. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  617. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  618. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  619. qiskit/transpiler/passes/utils/error.py +69 -0
  620. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  621. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  622. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  623. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  624. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  625. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  626. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  627. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  628. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  629. qiskit/transpiler/passmanager.py +503 -0
  630. qiskit/transpiler/passmanager_config.py +154 -0
  631. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  632. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1114 -0
  633. qiskit/transpiler/preset_passmanagers/common.py +773 -0
  634. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +443 -0
  635. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  636. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  637. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  638. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  639. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  640. qiskit/transpiler/target.py +905 -0
  641. qiskit/transpiler/timing_constraints.py +59 -0
  642. qiskit/user_config.py +266 -0
  643. qiskit/utils/__init__.py +90 -0
  644. qiskit/utils/classtools.py +146 -0
  645. qiskit/utils/deprecation.py +382 -0
  646. qiskit/utils/lazy_tester.py +363 -0
  647. qiskit/utils/optionals.py +355 -0
  648. qiskit/utils/parallel.py +318 -0
  649. qiskit/utils/units.py +146 -0
  650. qiskit/version.py +84 -0
  651. qiskit/visualization/__init__.py +290 -0
  652. qiskit/visualization/array.py +207 -0
  653. qiskit/visualization/bloch.py +778 -0
  654. qiskit/visualization/circuit/__init__.py +15 -0
  655. qiskit/visualization/circuit/_utils.py +677 -0
  656. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  657. qiskit/visualization/circuit/latex.py +668 -0
  658. qiskit/visualization/circuit/matplotlib.py +2041 -0
  659. qiskit/visualization/circuit/qcstyle.py +130 -0
  660. qiskit/visualization/circuit/styles/__init__.py +13 -0
  661. qiskit/visualization/circuit/styles/bw.json +202 -0
  662. qiskit/visualization/circuit/styles/clifford.json +202 -0
  663. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  664. qiskit/visualization/circuit/styles/iqp.json +214 -0
  665. qiskit/visualization/circuit/styles/textbook.json +202 -0
  666. qiskit/visualization/circuit/text.py +1849 -0
  667. qiskit/visualization/circuit_visualization.py +19 -0
  668. qiskit/visualization/counts_visualization.py +487 -0
  669. qiskit/visualization/dag/__init__.py +13 -0
  670. qiskit/visualization/dag/dagstyle.py +103 -0
  671. qiskit/visualization/dag/styles/__init__.py +13 -0
  672. qiskit/visualization/dag/styles/color.json +10 -0
  673. qiskit/visualization/dag/styles/plain.json +5 -0
  674. qiskit/visualization/dag_visualization.py +389 -0
  675. qiskit/visualization/exceptions.py +21 -0
  676. qiskit/visualization/gate_map.py +1424 -0
  677. qiskit/visualization/library.py +40 -0
  678. qiskit/visualization/pass_manager_visualization.py +312 -0
  679. qiskit/visualization/state_visualization.py +1546 -0
  680. qiskit/visualization/style.py +223 -0
  681. qiskit/visualization/timeline/__init__.py +21 -0
  682. qiskit/visualization/timeline/core.py +495 -0
  683. qiskit/visualization/timeline/drawings.py +260 -0
  684. qiskit/visualization/timeline/generators.py +506 -0
  685. qiskit/visualization/timeline/interface.py +444 -0
  686. qiskit/visualization/timeline/layouts.py +115 -0
  687. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  688. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  689. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  690. qiskit/visualization/timeline/stylesheet.py +301 -0
  691. qiskit/visualization/timeline/types.py +148 -0
  692. qiskit/visualization/transition_visualization.py +369 -0
  693. qiskit/visualization/utils.py +49 -0
  694. qiskit-2.1.0rc1.dist-info/METADATA +221 -0
  695. qiskit-2.1.0rc1.dist-info/RECORD +699 -0
  696. qiskit-2.1.0rc1.dist-info/WHEEL +6 -0
  697. qiskit-2.1.0rc1.dist-info/entry_points.txt +88 -0
  698. qiskit-2.1.0rc1.dist-info/licenses/LICENSE.txt +203 -0
  699. qiskit-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,138 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
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
+ """Translates gates to a target basis using a given equivalence library."""
15
+
16
+ import logging
17
+
18
+ from collections import defaultdict
19
+
20
+ from qiskit.transpiler.basepasses import TransformationPass
21
+ from qiskit._accelerate.basis_translator import base_run
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class BasisTranslator(TransformationPass):
27
+ """Translates gates to a target basis by searching for a set of translations
28
+ from a given EquivalenceLibrary.
29
+
30
+ This pass operates in several steps:
31
+
32
+ * Determine the source basis from the input circuit.
33
+ * Perform a Dijkstra search over basis sets, starting from the device's
34
+ target_basis new gates are being generated using the rules from the provided
35
+ EquivalenceLibrary and the search stops if all gates in the source basis have
36
+ been generated.
37
+ * The found path, as a set of rules from the EquivalenceLibrary, is composed
38
+ into a set of gate replacement rules.
39
+ * The composed replacement rules are applied in-place to each op node which
40
+ is not already in the target_basis.
41
+
42
+ If the target keyword argument is specified and that
43
+ :class:`~qiskit.transpiler.Target` objects contains operations
44
+ which are non-global (i.e. they are defined only for a subset of qubits),
45
+ as calculated by :meth:`~qiskit.transpiler.Target.get_non_global_operation_names`,
46
+ this pass will attempt to match the output translation to those constraints.
47
+ For 1 qubit operations this is straightforward, the pass will perform a
48
+ search using the union of the set of global operations with the set of operations
49
+ defined solely on that qubit. For multi-qubit gates this is a bit more involved,
50
+ while the behavior is initially similar to the single qubit case, just using all
51
+ the qubits the operation is run on (where order is not significant) isn't sufficient.
52
+ We also need to consider any potential local qubits defined on subsets of the
53
+ quantum arguments for the multi-qubit operation. This means the target used for the
54
+ search of a non-global multi-qubit gate is the union of global operations, non-global
55
+ multi-qubit gates sharing the same qubits, and any non-global gates defined on
56
+ any subset of the qubits used.
57
+
58
+
59
+ .. note::
60
+
61
+ In the case of non-global operations it is possible for a single
62
+ execution of this pass to output an incomplete translation if any
63
+ non-global gates are defined on qubits that are a subset of a larger
64
+ multi-qubit gate. For example, if you have a ``u`` gate only defined on
65
+ qubit 0 and an ``x`` gate only on qubit 1 it is possible when
66
+ translating a 2 qubit operation on qubit 0 and 1 that the output might
67
+ have ``u`` on qubit 1 and ``x`` on qubit 0. Typically running this pass
68
+ a second time will correct these issues.
69
+
70
+ .. _translation_errors:
71
+
72
+ Translation Errors
73
+ ------------------
74
+
75
+ This pass will error if there is no path to translate an input gate to
76
+ the specified basis. However, during a typical/default preset passmanager
77
+ this pass gets run multiple times at different stages of the compilation
78
+ pipeline. This means that potentially the input gates that are getting
79
+ translated were not in the input circuit to :func:`~.transpile` as they
80
+ were generated by an intermediate transform in the circuit.
81
+
82
+ When this error occurs it typically means that either the target basis
83
+ is not universal or there are additional equivalence rules needed in the
84
+ :class:`~.EquivalenceLibrary` instance being used by the
85
+ :class:`~.BasisTranslator` pass. You can refer to
86
+ :ref:`custom_basis_gates` for details on adding custom equivalence rules.
87
+ """
88
+
89
+ def __init__(self, equivalence_library, target_basis, target=None, min_qubits=0):
90
+ """Initialize a BasisTranslator instance.
91
+
92
+ Args:
93
+ equivalence_library (EquivalenceLibrary): The equivalence library
94
+ which will be used by the BasisTranslator pass. (Instructions in
95
+ this library will not be unrolled by this pass.)
96
+ target_basis (list[str]): Target basis names to unroll to, e.g. ``['u3', 'cx']``.
97
+ target (Target): The backend compilation target
98
+ min_qubits (int): The minimum number of qubits for operations in the input
99
+ dag to translate.
100
+ """
101
+ super().__init__()
102
+ self._equiv_lib = equivalence_library
103
+ self._target_basis = target_basis
104
+ # Bypass target if it doesn't contain any basis gates (i.e. it's a _FakeTarget), as this
105
+ # not part of the official target model.
106
+ self._target = target if target is not None and len(target.operation_names) > 0 else None
107
+ self._non_global_operations = None
108
+ self._qargs_with_non_global_operation = {}
109
+ self._min_qubits = min_qubits
110
+ if self._target is not None:
111
+ self._non_global_operations = self._target.get_non_global_operation_names()
112
+ self._qargs_with_non_global_operation = defaultdict(set)
113
+ for gate in self._non_global_operations:
114
+ for qarg in self._target[gate]:
115
+ self._qargs_with_non_global_operation[qarg].add(gate)
116
+
117
+ def run(self, dag):
118
+ """Translate an input DAGCircuit to the target basis.
119
+
120
+ Args:
121
+ dag (DAGCircuit): input dag
122
+
123
+ Raises:
124
+ TranspilerError: if the target basis cannot be reached
125
+
126
+ Returns:
127
+ DAGCircuit: translated circuit.
128
+ """
129
+
130
+ return base_run(
131
+ dag,
132
+ self._equiv_lib,
133
+ self._qargs_with_non_global_operation,
134
+ self._min_qubits,
135
+ None if self._target_basis is None else set(self._target_basis),
136
+ self._target,
137
+ None if self._non_global_operations is None else set(self._non_global_operations),
138
+ )
@@ -0,0 +1,137 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2018.
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
+ """Expand a gate in a circuit using its decomposition rules."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from collections.abc import Sequence
18
+ from typing import Type
19
+ from fnmatch import fnmatch
20
+
21
+ from qiskit.transpiler.basepasses import TransformationPass
22
+ from qiskit.transpiler.passes.utils import control_flow
23
+ from qiskit.dagcircuit.dagnode import DAGOpNode
24
+ from qiskit.dagcircuit.dagcircuit import DAGCircuit
25
+ from qiskit.converters.circuit_to_dag import circuit_to_dag
26
+ from qiskit.circuit.instruction import Instruction
27
+
28
+ from ..synthesis import HighLevelSynthesis
29
+
30
+
31
+ class Decompose(TransformationPass):
32
+ """Expand a gate in a circuit using its decomposition rules."""
33
+
34
+ def __init__(
35
+ self,
36
+ gates_to_decompose: (
37
+ str | Type[Instruction] | Sequence[str | Type[Instruction]] | None
38
+ ) = None,
39
+ apply_synthesis: bool = False,
40
+ ) -> None:
41
+ """
42
+ Args:
43
+ gates_to_decompose: optional subset of gates to be decomposed,
44
+ identified by gate label, name or type. Defaults to all gates.
45
+ apply_synthesis: If ``True``, run :class:`.HighLevelSynthesis` to synthesize operations
46
+ that do not have a definition attached.
47
+ """
48
+ super().__init__()
49
+ self.gates_to_decompose = gates_to_decompose
50
+ self.apply_synthesis = apply_synthesis
51
+
52
+ def run(self, dag: DAGCircuit) -> DAGCircuit:
53
+ """Run the Decompose pass on `dag`.
54
+
55
+ Args:
56
+ dag: input dag.
57
+
58
+ Returns:
59
+ output dag where ``gate`` was expanded.
60
+ """
61
+ # We might use HLS to synthesize objects that do not have a definition
62
+ hls = HighLevelSynthesis(qubits_initially_zero=False) if self.apply_synthesis else None
63
+
64
+ # Walk through the DAG and expand each non-basis node
65
+ for node in dag.op_nodes():
66
+ # Check in self.gates_to_decompose if the operation should be decomposed
67
+ if not self._should_decompose(node):
68
+ continue
69
+
70
+ if node.is_control_flow():
71
+ decomposition = control_flow.map_blocks(self.run, node.op)
72
+ dag.substitute_node(node, decomposition, inplace=True)
73
+
74
+ elif getattr(node.op, "definition", None) is None:
75
+ # if we try to synthesize, turn the node into a DAGCircuit and run HLS
76
+ if self.apply_synthesis:
77
+ node_as_dag = _node_to_dag(node)
78
+ synthesized = hls.run(node_as_dag)
79
+ dag.substitute_node_with_dag(node, synthesized)
80
+
81
+ # else: no definition and synthesis not enabled, so we do nothing
82
+ else:
83
+ rule = node.op.definition.data
84
+
85
+ if (
86
+ len(rule) == 1
87
+ and len(node.qargs) == len(rule[0].qubits) == 1 # to preserve gate order
88
+ and len(node.cargs) == len(rule[0].clbits) == 0
89
+ ):
90
+ if node.op.definition.global_phase:
91
+ dag.global_phase += node.op.definition.global_phase
92
+ dag.substitute_node(node, rule[0].operation, inplace=True)
93
+ else:
94
+ decomposition = circuit_to_dag(node.op.definition)
95
+ dag.substitute_node_with_dag(node, decomposition)
96
+
97
+ return dag
98
+
99
+ def _should_decompose(self, node: DAGOpNode) -> bool:
100
+ """Call a decomposition pass on this circuit to decompose one level (shallow decompose)."""
101
+ if self.gates_to_decompose is None: # check if no gates given
102
+ return True
103
+
104
+ if not isinstance(self.gates_to_decompose, list):
105
+ gates = [self.gates_to_decompose]
106
+ else:
107
+ gates = self.gates_to_decompose
108
+
109
+ strings_list = [s for s in gates if isinstance(s, str)]
110
+ gate_type_list = [g for g in gates if isinstance(g, type)]
111
+
112
+ if (
113
+ getattr(node.op, "label", None) is not None
114
+ and node.op.label != ""
115
+ and ( # check if label or label wildcard is given
116
+ node.op.label in gates or any(fnmatch(node.op.label, p) for p in strings_list)
117
+ )
118
+ ):
119
+ return True
120
+ elif node.name in gates or any( # check if name or name wildcard is given
121
+ fnmatch(node.name, p) for p in strings_list
122
+ ):
123
+ return True
124
+ elif any(isinstance(node.op, op) for op in gate_type_list): # check if Gate type given
125
+ return True
126
+ else:
127
+ return False
128
+
129
+
130
+ def _node_to_dag(node: DAGOpNode) -> DAGCircuit:
131
+ # create new dag and apply the operation
132
+ dag = DAGCircuit()
133
+ dag.add_qubits(node.qargs)
134
+ dag.add_clbits(node.cargs)
135
+ dag.apply_operation_back(node.op, node.qargs, node.cargs)
136
+
137
+ return dag
@@ -0,0 +1,175 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022.
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
+ """Translate parameterized gates only, and leave others as they are."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from qiskit.circuit import Instruction, ParameterExpression, Qubit, Clbit
18
+ from qiskit.circuit.equivalence_library import EquivalenceLibrary
19
+ from qiskit.converters import circuit_to_dag
20
+ from qiskit.dagcircuit import DAGCircuit, DAGOpNode
21
+ from qiskit.exceptions import QiskitError
22
+ from qiskit.transpiler.basepasses import TransformationPass
23
+ from qiskit.transpiler.passes.basis.basis_translator import BasisTranslator
24
+ from qiskit.transpiler.target import Target
25
+
26
+
27
+ class TranslateParameterizedGates(TransformationPass):
28
+ """Translate parameterized gates to a supported basis set.
29
+
30
+ Once a parameterized instruction is found that is not in the ``supported_gates`` list,
31
+ the instruction is decomposed one level and the parameterized sub-blocks are recursively
32
+ decomposed. The recursion is stopped once all parameterized gates are in ``supported_gates``,
33
+ or if a gate has no definition and a translation to the basis is attempted (this might happen
34
+ e.g. for the ``UGate`` if it's not in the specified gate list).
35
+
36
+ Example:
37
+
38
+ The following, multiply nested circuit::
39
+
40
+ from qiskit.circuit import QuantumCircuit, ParameterVector
41
+ from qiskit.transpiler.passes import TranslateParameterizedGates
42
+
43
+ x = ParameterVector("x", 4)
44
+ block1 = QuantumCircuit(1)
45
+ block1.rx(x[0], 0)
46
+
47
+ sub_block = QuantumCircuit(2)
48
+ sub_block.cx(0, 1)
49
+ sub_block.rz(x[2], 0)
50
+
51
+ block2 = QuantumCircuit(2)
52
+ block2.ry(x[1], 0)
53
+ block2.append(sub_block.to_gate(), [0, 1])
54
+
55
+ block3 = QuantumCircuit(3)
56
+ block3.ccx(0, 1, 2)
57
+
58
+ circuit = QuantumCircuit(3)
59
+ circuit.append(block1.to_gate(), [1])
60
+ circuit.append(block2.to_gate(), [0, 1])
61
+ circuit.append(block3.to_gate(), [0, 1, 2])
62
+ circuit.cry(x[3], 0, 2)
63
+
64
+ supported_gates = ["rx", "ry", "rz", "cp", "crx", "cry", "crz"]
65
+ unrolled = TranslateParameterizedGates(supported_gates)(circuit)
66
+
67
+ is decomposed to::
68
+
69
+ ┌──────────┐ ┌──────────┐┌─────────────┐
70
+ q_0: ┤ Ry(x[1]) ├──■──┤ Rz(x[2]) ├┤0 ├─────■──────
71
+ ├──────────┤┌─┴─┐└──────────┘│ │ │
72
+ q_1: ┤ Rx(x[0]) ├┤ X ├────────────┤1 circuit-92 ├─────┼──────
73
+ └──────────┘└───┘ │ │┌────┴─────┐
74
+ q_2: ─────────────────────────────┤2 ├┤ Ry(x[3]) ├
75
+ └─────────────┘└──────────┘
76
+
77
+ """
78
+
79
+ def __init__(
80
+ self,
81
+ supported_gates: list[str] | None = None,
82
+ equivalence_library: EquivalenceLibrary | None = None,
83
+ target: Target | None = None,
84
+ ) -> None:
85
+ """
86
+ Args:
87
+ supported_gates: A list of suppported basis gates specified as string. If ``None``,
88
+ a ``target`` must be provided.
89
+ equivalence_library: The equivalence library to translate the gates. Defaults
90
+ to the equivalence library of all Qiskit standard gates.
91
+ target: A :class:`.Target` containing the supported operations. If ``None``,
92
+ ``supported_gates`` must be set. Note that this argument takes precedence over
93
+ ``supported_gates``, if both are set.
94
+
95
+ Raises:
96
+ ValueError: If neither of ``supported_gates`` and ``target`` are passed.
97
+ """
98
+ super().__init__()
99
+
100
+ # get the default equivalence library, if none has been set
101
+ if equivalence_library is None:
102
+ from qiskit.circuit.library.standard_gates.equivalence_library import _sel
103
+
104
+ equivalence_library = _sel
105
+
106
+ # The target takes precedence over the supported_gates argument. If neither are set,
107
+ # raise an error.
108
+ if target is not None:
109
+ supported_gates = target.operation_names
110
+ elif supported_gates is None:
111
+ raise ValueError("One of ``supported_gates`` or ``target`` must be specified.")
112
+
113
+ self._supported_gates = supported_gates
114
+ self._target = target
115
+ self._translator = BasisTranslator(equivalence_library, supported_gates, target=target)
116
+
117
+ def run(self, dag: DAGCircuit) -> DAGCircuit:
118
+ """Run the transpiler pass.
119
+
120
+ Args:
121
+ dag: The DAG circuit in which the parameterized gates should be unrolled.
122
+
123
+ Returns:
124
+ A DAG where the parameterized gates have been unrolled.
125
+
126
+ Raises:
127
+ QiskitError: If the circuit cannot be unrolled.
128
+ """
129
+ for node in dag.op_nodes():
130
+ # check whether it is parameterized and we need to decompose it
131
+ if _is_parameterized(node.op) and not _is_supported(
132
+ node, self._supported_gates, self._target
133
+ ):
134
+ definition = node.op.definition
135
+
136
+ if definition is not None:
137
+ # recurse to unroll further parameterized blocks
138
+ unrolled = self.run(circuit_to_dag(definition))
139
+ else:
140
+ # if we hit a base case, try to translate to the specified basis
141
+ try:
142
+ unrolled = self._translator.run(_instruction_to_dag(node.op))
143
+ except Exception as exc:
144
+ raise QiskitError("Failed to translate final block.") from exc
145
+
146
+ # replace with unrolled (or translated) dag
147
+ dag.substitute_node_with_dag(node, unrolled)
148
+
149
+ return dag
150
+
151
+
152
+ def _is_parameterized(op: Instruction) -> bool:
153
+ return any(
154
+ isinstance(param, ParameterExpression) and len(param.parameters) > 0 for param in op.params
155
+ )
156
+
157
+
158
+ def _is_supported(node: DAGOpNode, supported_gates: list[str], target: Target | None) -> bool:
159
+ """Check whether the node is supported.
160
+
161
+ If the target is provided, check using the target, otherwise the supported_gates are used.
162
+ """
163
+ if target is not None:
164
+ return target.instruction_supported(node.op.name)
165
+
166
+ return node.op.name in supported_gates
167
+
168
+
169
+ def _instruction_to_dag(op: Instruction) -> DAGCircuit:
170
+ dag = DAGCircuit()
171
+ dag.add_qubits([Qubit() for _ in range(op.num_qubits)])
172
+ dag.add_qubits([Clbit() for _ in range(op.num_clbits)])
173
+ dag.apply_operation_back(op, dag.qubits, dag.clbits, check=False)
174
+
175
+ return dag
@@ -0,0 +1,84 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2018.
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
+ """Recursively expands 3q+ gates until the circuit only contains 2q or 1q gates."""
14
+
15
+ from qiskit.transpiler.basepasses import TransformationPass
16
+ from qiskit.transpiler.passes.utils import control_flow
17
+ from qiskit.exceptions import QiskitError
18
+ from qiskit.circuit import ControlFlowOp
19
+ from qiskit.converters.circuit_to_dag import circuit_to_dag
20
+
21
+
22
+ class Unroll3qOrMore(TransformationPass):
23
+ """Recursively expands 3q+ gates until the circuit only contains 2q or 1q gates."""
24
+
25
+ def __init__(self, target=None, basis_gates=None):
26
+ """Initialize the Unroll3qOrMore pass
27
+
28
+ Args:
29
+ target (Target): The target object representing the compilation
30
+ target. If specified any multi-qubit instructions in the
31
+ circuit when the pass is run that are supported by the target
32
+ device will be left in place. If both this and ``basis_gates``
33
+ are specified only the target will be checked.
34
+ basis_gates (list): A list of basis gate names that the target
35
+ device supports. If specified any gate names in the circuit
36
+ which are present in this list will not be unrolled. If both
37
+ this and ``target`` are specified only the target will be used
38
+ for checking which gates are supported.
39
+ """
40
+ super().__init__()
41
+ self.target = target
42
+ self.basis_gates = None
43
+ if basis_gates is not None:
44
+ self.basis_gates = set(basis_gates)
45
+
46
+ def run(self, dag):
47
+ """Run the Unroll3qOrMore pass on `dag`.
48
+
49
+ Args:
50
+ dag(DAGCircuit): input dag
51
+ Returns:
52
+ DAGCircuit: output dag with maximum node degrees of 2
53
+ Raises:
54
+ QiskitError: if a 3q+ gate is not decomposable
55
+ """
56
+ for node in dag.multi_qubit_ops():
57
+
58
+ if isinstance(node.op, ControlFlowOp):
59
+ dag.substitute_node(node, control_flow.map_blocks(self.run, node.op))
60
+ continue
61
+
62
+ if self.target is not None:
63
+ # Treat target instructions as global since this pass can be run
64
+ # prior to layout and routing we don't have physical qubits from
65
+ # the circuit yet
66
+ if node.name in self.target:
67
+ continue
68
+ elif self.basis_gates is not None and node.name in self.basis_gates:
69
+ continue
70
+
71
+ # TODO: allow choosing other possible decompositions
72
+ rule = node.op.definition.data
73
+ if not rule:
74
+ if rule == []: # empty node
75
+ dag.remove_op_node(node)
76
+ continue
77
+ raise QiskitError(
78
+ "Cannot unroll all 3q or more gates. "
79
+ f"No rule to expand instruction {node.op.name}."
80
+ )
81
+ decomposition = circuit_to_dag(node.op.definition, copy_operations=False)
82
+ decomposition = self.run(decomposition) # recursively unroll
83
+ dag.substitute_node_with_dag(node, decomposition)
84
+ return dag
@@ -0,0 +1,110 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
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
+ """Unrolls instructions with custom definitions."""
14
+
15
+ from qiskit.exceptions import QiskitError
16
+ from qiskit.transpiler.basepasses import TransformationPass
17
+ from qiskit.transpiler.passes.utils import control_flow
18
+ from qiskit.circuit import ControlledGate, ControlFlowOp
19
+ from qiskit.converters.circuit_to_dag import circuit_to_dag
20
+
21
+
22
+ class UnrollCustomDefinitions(TransformationPass):
23
+ """Unrolls instructions with custom definitions."""
24
+
25
+ def __init__(self, equivalence_library, basis_gates=None, target=None, min_qubits=0):
26
+ """Unrolls instructions with custom definitions.
27
+
28
+ Args:
29
+ equivalence_library (EquivalenceLibrary): The equivalence library
30
+ which will be used by the BasisTranslator pass. (Instructions in
31
+ this library will not be unrolled by this pass.)
32
+ basis_gates (Optional[list[str]]): Target basis names to unroll to, e.g. ``['u3', 'cx']``.
33
+ Ignored if ``target`` is also specified.
34
+ target (Optional[Target]): The :class:`~.Target` object corresponding to the compilation
35
+ target. When specified, any argument specified for ``basis_gates`` is ignored.
36
+ min_qubits (int): The minimum number of qubits for operations in the input
37
+ dag to translate.
38
+ """
39
+
40
+ super().__init__()
41
+ self._equiv_lib = equivalence_library
42
+ self._basis_gates = basis_gates
43
+ self._target = target
44
+ self._min_qubits = min_qubits
45
+
46
+ def run(self, dag):
47
+ """Run the UnrollCustomDefinitions pass on `dag`.
48
+
49
+ Args:
50
+ dag (DAGCircuit): input dag
51
+
52
+ Raises:
53
+ QiskitError: if unable to unroll given the basis due to undefined
54
+ decomposition rules (such as a bad basis) or excessive recursion.
55
+
56
+ Returns:
57
+ DAGCircuit: output unrolled dag
58
+ """
59
+
60
+ if self._basis_gates is None and self._target is None:
61
+ return dag
62
+
63
+ device_insts = {"measure", "reset", "barrier", "snapshot", "delay", "store"}
64
+ if self._target is None:
65
+ device_insts |= set(self._basis_gates)
66
+
67
+ for node in dag.op_nodes():
68
+ if isinstance(node.op, ControlFlowOp):
69
+ dag.substitute_node(
70
+ node,
71
+ control_flow.map_blocks(self.run, node.op),
72
+ )
73
+ continue
74
+
75
+ if getattr(node.op, "_directive", False):
76
+ continue
77
+
78
+ if len(node.qargs) < self._min_qubits:
79
+ continue
80
+
81
+ controlled_gate_open_ctrl = isinstance(node.op, ControlledGate) and node.op._open_ctrl
82
+ if not controlled_gate_open_ctrl:
83
+ if self._target is not None:
84
+ inst_supported = self._target.instruction_supported(
85
+ operation_name=node.op.name,
86
+ qargs=tuple(dag.find_bit(x).index for x in node.qargs),
87
+ )
88
+ else:
89
+ inst_supported = node.name in device_insts
90
+
91
+ if inst_supported or self._equiv_lib.has_entry(node.op):
92
+ continue
93
+ try:
94
+ unrolled = getattr(node.op, "definition", None)
95
+ except TypeError as err:
96
+ raise QiskitError(f"Error decomposing node {node.name}: {err}") from err
97
+
98
+ if unrolled is None:
99
+ # opaque node
100
+ raise QiskitError(
101
+ f"Cannot unroll the circuit to the given basis, {str(self._basis_gates)}. "
102
+ f"Instruction {node.op.name} not found in equivalence library "
103
+ "and no rule found to expand."
104
+ )
105
+
106
+ decomposition = circuit_to_dag(unrolled, copy_operations=False)
107
+ unrolled_dag = self.run(decomposition)
108
+ dag.substitute_node_with_dag(node, unrolled_dag)
109
+
110
+ return dag
@@ -0,0 +1,26 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2018.
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
+ """Module containing transpiler layout passes."""
14
+
15
+ from .set_layout import SetLayout
16
+ from .trivial_layout import TrivialLayout
17
+ from .dense_layout import DenseLayout
18
+ from .sabre_layout import SabreLayout
19
+ from .csp_layout import CSPLayout
20
+ from .vf2_layout import VF2Layout
21
+ from .vf2_post_layout import VF2PostLayout
22
+ from .apply_layout import ApplyLayout
23
+ from .layout_2q_distance import Layout2qDistance
24
+ from .enlarge_with_ancilla import EnlargeWithAncilla
25
+ from .full_ancilla_allocation import FullAncillaAllocation
26
+ from .sabre_pre_layout import SabrePreLayout