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,425 @@
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
+ Unitary Synthesis Transpiler Pass
15
+ """
16
+
17
+ from __future__ import annotations
18
+ from typing import Any
19
+
20
+ from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
21
+ from qiskit.circuit import CircuitInstruction
22
+ from qiskit.converters import circuit_to_dag, dag_to_circuit
23
+ from qiskit.dagcircuit.dagcircuit import DAGCircuit
24
+ from qiskit.dagcircuit.dagnode import DAGOpNode
25
+ from qiskit.synthesis.one_qubit import one_qubit_decompose
26
+
27
+ from qiskit.transpiler.basepasses import TransformationPass
28
+ from qiskit.transpiler.coupling import CouplingMap
29
+ from qiskit.transpiler.exceptions import TranspilerError
30
+ from qiskit.transpiler.passes.synthesis import plugin
31
+ from qiskit.transpiler.target import Target
32
+
33
+ from qiskit._accelerate.unitary_synthesis import run_main_loop
34
+
35
+
36
+ def _choose_bases(basis_gates, basis_dict=None):
37
+ """Find the matching basis string keys from the list of basis gates from the target."""
38
+ if basis_gates is None:
39
+ basis_set = set()
40
+ else:
41
+ basis_set = set(basis_gates)
42
+
43
+ if basis_dict is None:
44
+ basis_dict = one_qubit_decompose.ONE_QUBIT_EULER_BASIS_GATES
45
+
46
+ out_basis = []
47
+ for basis, gates in basis_dict.items():
48
+ if set(gates).issubset(basis_set):
49
+ out_basis.append(basis)
50
+
51
+ return out_basis
52
+
53
+
54
+ class UnitarySynthesis(TransformationPass):
55
+ """Synthesize gates according to their basis gates."""
56
+
57
+ def __init__(
58
+ self,
59
+ basis_gates: list[str] = None,
60
+ approximation_degree: float | None = 1.0,
61
+ coupling_map: CouplingMap = None,
62
+ pulse_optimize: bool | None = None,
63
+ natural_direction: bool | None = None,
64
+ synth_gates: list[str] | None = None,
65
+ method: str = "default",
66
+ min_qubits: int = 0,
67
+ plugin_config: dict = None,
68
+ target: Target = None,
69
+ ):
70
+ """Synthesize unitaries over some basis gates.
71
+
72
+ This pass can approximate 2-qubit unitaries given some
73
+ gate fidelities (via ``target``).
74
+ More approximation can be forced by setting a heuristic dial
75
+ ``approximation_degree``.
76
+
77
+ Args:
78
+ basis_gates (list[str]): List of gate names to target. If this is
79
+ not specified the ``target`` argument must be used. If both this
80
+ and the ``target`` are specified the value of ``target`` will
81
+ be used and this will be ignored.
82
+ approximation_degree (float): heuristic dial used for circuit approximation
83
+ (1.0=no approximation, 0.0=maximal approximation). Approximation can
84
+ make the synthesized circuit cheaper at the cost of straying from
85
+ the original unitary. If None, approximation is done based on gate fidelities.
86
+ coupling_map (CouplingMap): the coupling map of the target
87
+ in case synthesis is done on a physical circuit. The
88
+ directionality of the coupling_map will be taken into
89
+ account if ``pulse_optimize`` is ``True``/``None`` and ``natural_direction``
90
+ is ``True``/``None``.
91
+ pulse_optimize (bool): Whether to optimize pulses during
92
+ synthesis. A value of ``None`` will attempt it but fall
93
+ back if it does not succeed. A value of ``True`` will raise
94
+ an error if pulse-optimized synthesis does not succeed.
95
+ natural_direction (bool): Whether to apply synthesis considering
96
+ directionality of 2-qubit gates. Only applies when
97
+ ``pulse_optimize`` is ``True`` or ``None``. The natural direction is
98
+ determined by first checking to see whether the
99
+ coupling map is unidirectional. If there is no
100
+ coupling map or the coupling map is bidirectional,
101
+ the gate direction with the shorter
102
+ duration from the target properties will be used. If
103
+ set to True, and a natural direction can not be
104
+ determined, raises :class:`.TranspilerError`. If set to None, no
105
+ exception will be raised if a natural direction can
106
+ not be determined.
107
+ synth_gates (list[str]): List of gates to synthesize. If None and
108
+ ``pulse_optimize`` is False or None, default to
109
+ ``['unitary']``. If ``None`` and ``pulse_optimize == True``,
110
+ default to ``['unitary', 'swap']``
111
+ method (str): The unitary synthesis method plugin to use.
112
+ min_qubits: The minimum number of qubits in the unitary to synthesize. If this is set
113
+ and the unitary is less than the specified number of qubits it will not be
114
+ synthesized.
115
+ plugin_config: Optional extra configuration arguments (as a ``dict``)
116
+ which are passed directly to the specified unitary synthesis
117
+ plugin. By default, this will have no effect as the default
118
+ plugin has no extra arguments. Refer to the documentation of
119
+ your unitary synthesis plugin on how to use this.
120
+ target: The optional :class:`~.Target` for the target device the pass
121
+ is compiling for. If specified this will supersede the values
122
+ set for ``basis_gates`` and ``coupling_map``.
123
+
124
+ Raises:
125
+ TranspilerError: if ``method`` was specified but is not found in the
126
+ installed plugins list. The list of installed plugins can be queried with
127
+ :func:`~qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names`
128
+ """
129
+ super().__init__()
130
+ self._basis_gates = set(basis_gates or ())
131
+ self._approximation_degree = approximation_degree
132
+ self._min_qubits = min_qubits
133
+ self.method = method
134
+ self.plugins = None
135
+ if method != "default":
136
+ self.plugins = plugin.UnitarySynthesisPluginManager()
137
+ self._coupling_map = coupling_map
138
+ self._pulse_optimize = pulse_optimize
139
+ self._natural_direction = natural_direction
140
+ self._plugin_config = plugin_config
141
+ # Bypass target if it doesn't contain any basis gates (i.e it's _FakeTarget), as this
142
+ # not part of the official target model.
143
+ self._target = target if target is not None and len(target.operation_names) > 0 else None
144
+ if target is not None:
145
+ self._coupling_map = target.build_coupling_map()
146
+ if synth_gates:
147
+ self._synth_gates = synth_gates
148
+ else:
149
+ if pulse_optimize:
150
+ self._synth_gates = ["unitary", "swap"]
151
+ else:
152
+ self._synth_gates = ["unitary"]
153
+
154
+ self._synth_gates = set(self._synth_gates) - self._basis_gates
155
+
156
+ if self.method != "default" and self.method not in self.plugins.ext_plugins:
157
+ raise TranspilerError(f"Specified method '{self.method}' not found in plugin list")
158
+
159
+ def run(self, dag: DAGCircuit) -> DAGCircuit:
160
+ """Run the UnitarySynthesis pass on ``dag``.
161
+
162
+ Args:
163
+ dag: input dag.
164
+
165
+ Returns:
166
+ Output dag with UnitaryGates synthesized to target basis.
167
+ """
168
+
169
+ # If there aren't any gates to synthesize in the circuit we can skip all the iteration
170
+ # and just return.
171
+ if not set(self._synth_gates).intersection(dag.count_ops()):
172
+ return dag
173
+
174
+ if self.plugins:
175
+ plugin_method = self.plugins.ext_plugins[self.method].obj
176
+ else:
177
+ from qiskit.transpiler.passes.synthesis.default_unitary_synth_plugin import (
178
+ DefaultUnitarySynthesis,
179
+ )
180
+
181
+ plugin_method = DefaultUnitarySynthesis()
182
+ plugin_kwargs: dict[str, Any] = {"config": self._plugin_config}
183
+ _gate_lengths = _gate_errors = None
184
+ _gate_lengths_by_qubit = _gate_errors_by_qubit = None
185
+
186
+ if self.method == "default":
187
+ # If the method is the default, we only need to evaluate one set of keyword arguments.
188
+ # To simplify later logic, and avoid cases where static analysis might complain that we
189
+ # haven't initialized the "default" handler, we rebind the names so they point to the
190
+ # same object as the chosen method.
191
+ default_method = plugin_method
192
+ default_kwargs = plugin_kwargs
193
+ method_list = [(plugin_method, plugin_kwargs)]
194
+ else:
195
+ # If the method is not the default, we still need to initialise the default plugin's
196
+ # keyword arguments in case we have to fall back on it during the actual run.
197
+ default_method = self.plugins.ext_plugins["default"].obj
198
+ default_kwargs = {}
199
+ method_list = [(plugin_method, plugin_kwargs), (default_method, default_kwargs)]
200
+
201
+ # Handle approximation degree as a special case for backwards compatibility, it's
202
+ # not part of the plugin interface and only something needed for the default
203
+ # pass.
204
+ # pylint: disable=attribute-defined-outside-init
205
+ default_method._approximation_degree = self._approximation_degree
206
+ if self.method == "default":
207
+ # pylint: disable=attribute-defined-outside-init
208
+ plugin_method._approximation_degree = self._approximation_degree
209
+
210
+ qubit_indices = (
211
+ {bit: i for i, bit in enumerate(dag.qubits)}
212
+ if plugin_method.supports_coupling_map or default_method.supports_coupling_map
213
+ else {}
214
+ )
215
+
216
+ if self.method == "default":
217
+ _coupling_edges = (
218
+ set(self._coupling_map.get_edges()) if self._coupling_map is not None else set()
219
+ )
220
+ out = run_main_loop(
221
+ dag,
222
+ list(qubit_indices.values()),
223
+ self._min_qubits,
224
+ self._target,
225
+ self._basis_gates,
226
+ self._synth_gates,
227
+ _coupling_edges,
228
+ self._approximation_degree,
229
+ self._natural_direction,
230
+ self._pulse_optimize,
231
+ )
232
+ return out
233
+ else:
234
+ for method, kwargs in method_list:
235
+ if method.supports_basis_gates:
236
+ kwargs["basis_gates"] = self._basis_gates
237
+ if method.supports_natural_direction:
238
+ kwargs["natural_direction"] = self._natural_direction
239
+ if method.supports_pulse_optimize:
240
+ kwargs["pulse_optimize"] = self._pulse_optimize
241
+ if method.supports_gate_lengths:
242
+ _gate_lengths = _gate_lengths or _build_gate_lengths(self._target)
243
+ kwargs["gate_lengths"] = _gate_lengths
244
+ if method.supports_gate_errors:
245
+ _gate_errors = _gate_errors or _build_gate_errors(self._target)
246
+ kwargs["gate_errors"] = _gate_errors
247
+ if method.supports_gate_lengths_by_qubit:
248
+ _gate_lengths_by_qubit = _gate_lengths_by_qubit or _build_gate_lengths_by_qubit(
249
+ self._target
250
+ )
251
+ kwargs["gate_lengths_by_qubit"] = _gate_lengths_by_qubit
252
+ if method.supports_gate_errors_by_qubit:
253
+ _gate_errors_by_qubit = _gate_errors_by_qubit or _build_gate_errors_by_qubit(
254
+ self._target
255
+ )
256
+ kwargs["gate_errors_by_qubit"] = _gate_errors_by_qubit
257
+ supported_bases = method.supported_bases
258
+ if supported_bases is not None:
259
+ kwargs["matched_basis"] = _choose_bases(self._basis_gates, supported_bases)
260
+ if method.supports_target:
261
+ kwargs["target"] = self._target
262
+
263
+ out = self._run_main_loop(
264
+ dag, qubit_indices, plugin_method, plugin_kwargs, default_method, default_kwargs
265
+ )
266
+ return out
267
+
268
+ def _run_main_loop(
269
+ self, dag, qubit_indices, plugin_method, plugin_kwargs, default_method, default_kwargs
270
+ ):
271
+ """Inner loop for the optimizer, after all DAG-independent set-up has been completed."""
272
+ for node in dag.op_nodes():
273
+ if node.name not in CONTROL_FLOW_OP_NAMES:
274
+ continue
275
+ new_op = node.op.replace_blocks(
276
+ [
277
+ dag_to_circuit(
278
+ self._run_main_loop(
279
+ circuit_to_dag(block),
280
+ {
281
+ inner: qubit_indices[outer]
282
+ for inner, outer in zip(block.qubits, node.qargs)
283
+ },
284
+ plugin_method,
285
+ plugin_kwargs,
286
+ default_method,
287
+ default_kwargs,
288
+ ),
289
+ copy_operations=False,
290
+ )
291
+ for block in node.op.blocks
292
+ ]
293
+ )
294
+ dag.substitute_node(node, new_op)
295
+
296
+ out_dag = dag.copy_empty_like()
297
+ for node in dag.topological_op_nodes():
298
+ if node.name in self._synth_gates and len(node.qargs) >= self._min_qubits:
299
+ synth_dag = None
300
+ unitary = node.matrix
301
+ n_qubits = len(node.qargs)
302
+ if (
303
+ plugin_method.max_qubits is not None and n_qubits > plugin_method.max_qubits
304
+ ) or (plugin_method.min_qubits is not None and n_qubits < plugin_method.min_qubits):
305
+ method, kwargs = default_method, default_kwargs
306
+ else:
307
+ method, kwargs = plugin_method, plugin_kwargs
308
+ if method.supports_coupling_map:
309
+ kwargs["coupling_map"] = (
310
+ self._coupling_map,
311
+ [qubit_indices[x] for x in node.qargs],
312
+ )
313
+ synth_dag = method.run(unitary, **kwargs)
314
+ if synth_dag is None:
315
+ out_dag._apply_op_node_back(node)
316
+ continue
317
+ if isinstance(synth_dag, DAGCircuit):
318
+ qubit_map = dict(zip(synth_dag.qubits, node.qargs))
319
+ for node in synth_dag.topological_op_nodes():
320
+ node.qargs = tuple(qubit_map[x] for x in node.qargs)
321
+ out_dag._apply_op_node_back(node)
322
+ out_dag.global_phase += synth_dag.global_phase
323
+ else:
324
+ node_list, global_phase, gate = synth_dag
325
+ qubits = node.qargs
326
+ user_gate_node = DAGOpNode(gate)
327
+ for (
328
+ gate,
329
+ params,
330
+ qargs,
331
+ ) in node_list:
332
+ if gate is None:
333
+ node = DAGOpNode.from_instruction(
334
+ user_gate_node._to_circuit_instruction().replace(
335
+ params=user_gate_node.params,
336
+ qubits=tuple(qubits[x] for x in qargs),
337
+ )
338
+ )
339
+ else:
340
+ node = DAGOpNode.from_instruction(
341
+ CircuitInstruction.from_standard(
342
+ gate, tuple(qubits[x] for x in qargs), params
343
+ )
344
+ )
345
+ out_dag._apply_op_node_back(node)
346
+ out_dag.global_phase += global_phase
347
+ else:
348
+ out_dag._apply_op_node_back(node)
349
+ return out_dag
350
+
351
+
352
+ def _build_gate_lengths(target=None):
353
+ """Builds a ``gate_lengths`` dictionary from ``target`` (BackendV2).
354
+
355
+ The dictionary has the form:
356
+ {gate_name: {(qubits,): duration}}
357
+ """
358
+ gate_lengths = {}
359
+ if target is not None:
360
+ for gate, prop_dict in target.items():
361
+ gate_lengths[gate] = {}
362
+ for qubit, gate_props in prop_dict.items():
363
+ if gate_props is not None and gate_props.duration is not None:
364
+ gate_lengths[gate][qubit] = gate_props.duration
365
+ return gate_lengths
366
+
367
+
368
+ def _build_gate_errors(target=None):
369
+ """Builds a ``gate_error`` dictionary from ``target`` (BackendV2).
370
+
371
+ The dictionary has the form:
372
+ {gate_name: {(qubits,): error_rate}}
373
+ """
374
+ gate_errors = {}
375
+ if target is not None:
376
+ for gate, prop_dict in target.items():
377
+ gate_errors[gate] = {}
378
+ for qubit, gate_props in prop_dict.items():
379
+ if gate_props is not None and gate_props.error is not None:
380
+ gate_errors[gate][qubit] = gate_props.error
381
+ return gate_errors
382
+
383
+
384
+ def _build_gate_lengths_by_qubit(target=None):
385
+ """
386
+ Builds a `gate_lengths` dictionary from `target (BackendV2)`.
387
+
388
+ The dictionary has the form:
389
+ {(qubits): [Gate, duration]}
390
+ """
391
+ gate_lengths = {}
392
+ if target is not None and target.qargs is not None:
393
+ for qubits in target.qargs:
394
+ names = target.operation_names_for_qargs(qubits)
395
+ operation_and_durations = []
396
+ for name in names:
397
+ operation = target.operation_from_name(name)
398
+ duration = getattr(target[name].get(qubits, None), "duration", None)
399
+ if duration:
400
+ operation_and_durations.append((operation, duration))
401
+ if operation_and_durations:
402
+ gate_lengths[qubits] = operation_and_durations
403
+ return gate_lengths
404
+
405
+
406
+ def _build_gate_errors_by_qubit(target=None):
407
+ """
408
+ Builds a `gate_error` dictionary from `target (BackendV2)`.
409
+
410
+ The dictionary has the form:
411
+ {(qubits): [Gate, error]}
412
+ """
413
+ gate_errors = {}
414
+ if target is not None and target.qargs is not None:
415
+ for qubits in target.qargs:
416
+ names = target.operation_names_for_qargs(qubits)
417
+ operation_and_errors = []
418
+ for name in names:
419
+ operation = target.operation_from_name(name)
420
+ error = getattr(target[name].get(qubits, None), "error", None)
421
+ if error:
422
+ operation_and_errors.append((operation, error))
423
+ if operation_and_errors:
424
+ gate_errors[qubits] = operation_and_errors
425
+ return gate_errors
@@ -0,0 +1,32 @@
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
+ """Utility passes and functions used for other main passes."""
14
+
15
+ from .check_map import CheckMap
16
+ from .check_gate_direction import CheckGateDirection
17
+ from .gate_direction import GateDirection
18
+ from .barrier_before_final_measurements import BarrierBeforeFinalMeasurements
19
+ from .remove_final_measurements import RemoveFinalMeasurements
20
+ from .merge_adjacent_barriers import MergeAdjacentBarriers
21
+ from .dag_fixed_point import DAGFixedPoint
22
+ from .fixed_point import FixedPoint
23
+ from .error import Error
24
+ from .remove_barriers import RemoveBarriers
25
+ from .contains_instruction import ContainsInstruction
26
+ from .gates_basis import GatesInBasis
27
+ from .unroll_forloops import UnrollForLoops
28
+ from .minimum_point import MinimumPoint
29
+ from .filter_op_nodes import FilterOpNodes
30
+
31
+ # Utility functions
32
+ from . import control_flow
@@ -0,0 +1,41 @@
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
+
14
+ """Add a barrier before final measurements."""
15
+
16
+ from qiskit._accelerate.barrier_before_final_measurement import barrier_before_final_measurements
17
+ from qiskit.transpiler.basepasses import TransformationPass
18
+ from .merge_adjacent_barriers import MergeAdjacentBarriers
19
+
20
+
21
+ class BarrierBeforeFinalMeasurements(TransformationPass):
22
+ """Add a barrier before final measurements.
23
+
24
+ This pass adds a barrier before the set of final measurements. Measurements
25
+ are considered final if they are followed by no other operations (aside from
26
+ other measurements or barriers.)
27
+ """
28
+
29
+ def __init__(self, label=None):
30
+ super().__init__()
31
+ self.label = label
32
+
33
+ def run(self, dag):
34
+ """Run the BarrierBeforeFinalMeasurements pass on `dag`."""
35
+ barrier_before_final_measurements(dag, self.label)
36
+ if self.label is None:
37
+ # Merge the new barrier into any other barriers
38
+ adjacent_pass = MergeAdjacentBarriers()
39
+ return adjacent_pass.run(dag)
40
+ else:
41
+ return dag
@@ -0,0 +1,60 @@
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
+ """Check if the gates follow the right direction with respect to the coupling map."""
14
+
15
+ from qiskit.transpiler.basepasses import AnalysisPass
16
+ from qiskit._accelerate.gate_direction import (
17
+ check_gate_direction_coupling,
18
+ check_gate_direction_target,
19
+ )
20
+
21
+
22
+ class CheckGateDirection(AnalysisPass):
23
+ """Check if the two-qubit gates follow the right direction with
24
+ respect to the coupling map.
25
+ """
26
+
27
+ def __init__(self, coupling_map, target=None):
28
+ """CheckGateDirection initializer.
29
+
30
+ Args:
31
+ coupling_map (CouplingMap): Directed graph representing a coupling map.
32
+ target (Target): The backend target to use for this pass. If this is specified
33
+ it will be used instead of the coupling map
34
+ """
35
+ super().__init__()
36
+ self.coupling_map = coupling_map
37
+ self.target = target
38
+
39
+ def run(self, dag):
40
+ """Run the CheckGateDirection pass on `dag`.
41
+
42
+ If `dag` is mapped and the direction is correct the property
43
+ `is_direction_mapped` is set to True (or to False otherwise).
44
+
45
+ Args:
46
+ dag (DAGCircuit): DAG to check.
47
+ """
48
+ # Only use "check_gate_direction_target" if a target exists and target.operation_names
49
+ # is not empty, else use "check_gate_direction_coupling".
50
+ if self.target is None:
51
+ self.property_set["is_direction_mapped"] = check_gate_direction_coupling(
52
+ dag, set(self.coupling_map.get_edges())
53
+ )
54
+ elif len(self.target.operation_names) == 0:
55
+ # A _FakeTarget path, no basis gates, just use the coupling map
56
+ self.property_set["is_direction_mapped"] = check_gate_direction_coupling(
57
+ dag, set(self.target.build_coupling_map().get_edges())
58
+ )
59
+ else:
60
+ self.property_set["is_direction_mapped"] = check_gate_direction_target(dag, self.target)
@@ -0,0 +1,78 @@
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
+ """Check if a DAG circuit is already mapped to a coupling map."""
14
+
15
+ from qiskit.transpiler.basepasses import AnalysisPass
16
+ from qiskit.transpiler.target import Target
17
+
18
+ from qiskit._accelerate import check_map
19
+
20
+
21
+ class CheckMap(AnalysisPass):
22
+ """Check if a DAG circuit is already mapped to a coupling map.
23
+
24
+ Check if a DAGCircuit is mapped to ``coupling_map`` by checking that all
25
+ 2-qubit interactions are laid out to be on adjacent qubits in the global coupling
26
+ map of the device, setting the property set field (either specified with ``property_set_field``
27
+ or the default ``is_swap_mapped``) to ``True`` or ``False`` accordingly. Note this does not
28
+ validate directionality of the connectivity between qubits. If you need to check gates are
29
+ implemented in a native direction for a target use the :class:`~.CheckGateDirection` pass
30
+ instead.
31
+ """
32
+
33
+ def __init__(self, coupling_map, property_set_field=None):
34
+ """CheckMap initializer.
35
+
36
+ Args:
37
+ coupling_map (Union[CouplingMap, Target]): Directed graph representing a coupling map.
38
+ property_set_field (str): An optional string to specify the property set field to
39
+ store the result of the check. If not default the result is stored in
40
+ ``"is_swap_mapped"``.
41
+ """
42
+ super().__init__()
43
+ if property_set_field is None:
44
+ self.property_set_field = "is_swap_mapped"
45
+ else:
46
+ self.property_set_field = property_set_field
47
+ if isinstance(coupling_map, Target):
48
+ cmap = coupling_map.build_coupling_map()
49
+ else:
50
+ cmap = coupling_map
51
+ if cmap is None:
52
+ self.qargs = None
53
+ else:
54
+ self.qargs = set()
55
+ for edge in cmap.get_edges():
56
+ self.qargs.add(edge)
57
+ self.qargs.add((edge[1], edge[0]))
58
+
59
+ def run(self, dag):
60
+ """Run the CheckMap pass on `dag`.
61
+
62
+ If `dag` is mapped to `coupling_map`, the property
63
+ `is_swap_mapped` is set to True (or to False otherwise).
64
+
65
+ Args:
66
+ dag (DAGCircuit): DAG to map.
67
+ """
68
+ if not self.qargs:
69
+ self.property_set[self.property_set_field] = True
70
+ return
71
+ res = check_map.check_map(dag, self.qargs)
72
+ if res is None:
73
+ self.property_set[self.property_set_field] = True
74
+ return
75
+ self.property_set[self.property_set_field] = False
76
+ self.property_set["check_map_msg"] = (
77
+ f"{res[0]}({dag.qubits[res[1][0]]}, {dag.qubits[res[1][1]]}) failed"
78
+ )
@@ -0,0 +1,45 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021.
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
+ """Check if a property reached a fixed point."""
14
+
15
+ from qiskit.transpiler.basepasses import AnalysisPass
16
+
17
+
18
+ class ContainsInstruction(AnalysisPass):
19
+ """An analysis pass to detect if the DAG contains a specific instruction.
20
+
21
+ This pass takes in a single instruction name for example ``'delay'`` and
22
+ will set the property set ``contains_delay`` to ``True`` if the DAG contains
23
+ that instruction and ``False`` if it does not.
24
+ """
25
+
26
+ def __init__(self, instruction_name, recurse: bool = True):
27
+ """ContainsInstruction initializer.
28
+
29
+ Args:
30
+ instruction_name (str | Iterable[str]): The instruction or instructions to check are in
31
+ the DAG. The output in the property set is set to ``contains_`` prefixed on each
32
+ value for this parameter.
33
+ recurse (bool): if ``True`` (default), then recurse into control-flow operations.
34
+ """
35
+ super().__init__()
36
+ self._instruction_names = (
37
+ {instruction_name} if isinstance(instruction_name, str) else set(instruction_name)
38
+ )
39
+ self._recurse = recurse
40
+
41
+ def run(self, dag):
42
+ """Run the ContainsInstruction pass on dag."""
43
+ names = dag.count_ops(recurse=self._recurse)
44
+ for name in self._instruction_names:
45
+ self.property_set[f"contains_{name}"] = name in names