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,339 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2024.
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
+ """Sampler V2 implementation for an arbitrary Backend object."""
14
+
15
+ from __future__ import annotations
16
+
17
+ import warnings
18
+ from collections import defaultdict
19
+ from dataclasses import dataclass
20
+ from typing import Any, Iterable, Union
21
+
22
+ import numpy as np
23
+ from numpy.typing import NDArray
24
+
25
+ from qiskit.circuit import QuantumCircuit
26
+ from qiskit.exceptions import QiskitError
27
+ from qiskit.primitives.backend_estimator_v2 import _run_circuits
28
+ from qiskit.primitives.base import BaseSamplerV2
29
+ from qiskit.primitives.containers import (
30
+ BitArray,
31
+ DataBin,
32
+ PrimitiveResult,
33
+ SamplerPubLike,
34
+ SamplerPubResult,
35
+ )
36
+ from qiskit.primitives.containers.bit_array import _min_num_bytes
37
+ from qiskit.primitives.containers.sampler_pub import SamplerPub
38
+ from qiskit.primitives.primitive_job import PrimitiveJob
39
+ from qiskit.providers.backend import BackendV2
40
+ from qiskit.result import Result
41
+
42
+
43
+ @dataclass
44
+ class Options:
45
+ """Options for :class:`~.BackendSamplerV2`"""
46
+
47
+ default_shots: int = 1024
48
+ """The default shots to use if none are specified in :meth:`~.run`.
49
+ Default: 1024.
50
+ """
51
+
52
+ seed_simulator: int | None = None
53
+ """The seed to use in the simulator. If None, a random seed will be used.
54
+ Default: None.
55
+ """
56
+
57
+ run_options: dict[str, Any] | None = None
58
+ """A dictionary of options to pass to the backend's ``run()`` method.
59
+ Default: None (no option passed to backend's ``run`` method)
60
+ """
61
+
62
+
63
+ @dataclass
64
+ class _MeasureInfo:
65
+ creg_name: str
66
+ num_bits: int
67
+ num_bytes: int
68
+ start: int
69
+
70
+
71
+ ResultMemory = Union[list[str], list[list[float]], list[list[list[float]]]]
72
+ """Type alias for possible level 2 and level 1 result memory formats. For level
73
+ 2, the format is a list of bit strings. For level 1, format can be either a
74
+ list of I/Q pairs (list with two floats) for each memory slot if using
75
+ ``meas_return=avg`` or a list of of lists of I/Q pairs if using
76
+ ``meas_return=single`` with the outer list indexing shot number and the inner
77
+ list indexing memory slot.
78
+ """
79
+
80
+
81
+ class BackendSamplerV2(BaseSamplerV2):
82
+ """Evaluates bitstrings for provided quantum circuits
83
+
84
+ The :class:`~.BackendSamplerV2` class is a generic implementation of the
85
+ :class:`~.BaseSamplerV2` interface that is used to wrap a :class:`~.BackendV2`
86
+ object in the class :class:`~.BaseSamplerV2` API. It
87
+ facilitates using backends that do not provide a native
88
+ :class:`~.BaseSamplerV2` implementation in places that work with
89
+ :class:`~.BaseSamplerV2`. However,
90
+ if you're using a provider that has a native implementation of
91
+ :class:`~.BaseSamplerV2`, it is a better choice to leverage that native
92
+ implementation as it will likely include additional optimizations and be
93
+ a more efficient implementation. The generic nature of this class
94
+ precludes doing any provider- or backend-specific optimizations.
95
+
96
+ This class does not perform any measurement or gate mitigation.
97
+
98
+ Each tuple of ``(circuit, <optional> parameter values, <optional> shots)``, called a sampler
99
+ primitive unified bloc (PUB), produces its own array-valued result. The :meth:`~run` method can
100
+ be given many pubs at once.
101
+
102
+ The options for :class:`~.BackendSamplerV2` consist of the following items.
103
+
104
+ * ``default_shots``: The default shots to use if none are specified in :meth:`~run`.
105
+ Default: 1024.
106
+
107
+ * ``seed_simulator``: The seed to use in the simulator. If None, a random seed will be used.
108
+ Default: None.
109
+
110
+ * ``run_options``: A dictionary of options to pass through to the ``run()``
111
+ method of the wrapped :class:`~.BackendV2` instance.
112
+
113
+ .. note::
114
+
115
+ This class requires a backend that supports ``memory`` option.
116
+
117
+ """
118
+
119
+ def __init__(
120
+ self,
121
+ *,
122
+ backend: BackendV2,
123
+ options: dict | None = None,
124
+ ):
125
+ """
126
+ Args:
127
+ backend: The backend to run the primitive on.
128
+ options: The options to control the default shots (``default_shots``) and
129
+ the random seed for the simulator (``seed_simulator``).
130
+ """
131
+ self._backend = backend
132
+ self._options = Options(**options) if options else Options()
133
+
134
+ @property
135
+ def backend(self) -> BackendV2:
136
+ """Returns the backend which this sampler object based on."""
137
+ return self._backend
138
+
139
+ @property
140
+ def options(self) -> Options:
141
+ """Return the options"""
142
+ return self._options
143
+
144
+ def run(
145
+ self, pubs: Iterable[SamplerPubLike], *, shots: int | None = None
146
+ ) -> PrimitiveJob[PrimitiveResult[SamplerPubResult]]:
147
+ if shots is None:
148
+ shots = self._options.default_shots
149
+ coerced_pubs = [SamplerPub.coerce(pub, shots) for pub in pubs]
150
+ self._validate_pubs(coerced_pubs)
151
+ job = PrimitiveJob(self._run, coerced_pubs)
152
+ job._submit()
153
+ return job
154
+
155
+ def _validate_pubs(self, pubs: list[SamplerPub]):
156
+ for i, pub in enumerate(pubs):
157
+ if len(pub.circuit.cregs) == 0:
158
+ warnings.warn(
159
+ f"The {i}-th pub's circuit has no output classical registers and so the result "
160
+ "will be empty. Did you mean to add measurement instructions?",
161
+ UserWarning,
162
+ )
163
+
164
+ def _run(self, pubs: list[SamplerPub]) -> PrimitiveResult[SamplerPubResult]:
165
+ pub_dict = defaultdict(list)
166
+ # consolidate pubs with the same number of shots
167
+ for i, pub in enumerate(pubs):
168
+ pub_dict[pub.shots].append(i)
169
+
170
+ results = [None] * len(pubs)
171
+ for shots, lst in pub_dict.items():
172
+ # run pubs with the same number of shots at once
173
+ pub_results = self._run_pubs([pubs[i] for i in lst], shots)
174
+ # reconstruct the result of pubs
175
+ for i, pub_result in zip(lst, pub_results):
176
+ results[i] = pub_result
177
+ return PrimitiveResult(results, metadata={"version": 2})
178
+
179
+ def _run_pubs(self, pubs: list[SamplerPub], shots: int) -> list[SamplerPubResult]:
180
+ """Compute results for pubs that all require the same value of ``shots``."""
181
+ # prepare circuits
182
+ bound_circuits = [pub.parameter_values.bind_all(pub.circuit) for pub in pubs]
183
+ flatten_circuits = []
184
+ for circuits in bound_circuits:
185
+ flatten_circuits.extend(np.ravel(circuits).tolist())
186
+
187
+ run_opts = self._options.run_options or {}
188
+ # run circuits
189
+ results, _ = _run_circuits(
190
+ flatten_circuits,
191
+ self._backend,
192
+ clear_metadata=False,
193
+ memory=True,
194
+ shots=shots,
195
+ seed_simulator=self._options.seed_simulator,
196
+ **run_opts,
197
+ )
198
+ result_memory = _prepare_memory(results)
199
+
200
+ # pack memory to an ndarray of uint8
201
+ results = []
202
+ start = 0
203
+ meas_level = (
204
+ None
205
+ if self._options.run_options is None
206
+ else self._options.run_options.get("meas_level")
207
+ )
208
+ for pub, bound in zip(pubs, bound_circuits):
209
+ meas_info, max_num_bytes = _analyze_circuit(pub.circuit)
210
+ end = start + bound.size
211
+ results.append(
212
+ self._postprocess_pub(
213
+ result_memory[start:end],
214
+ shots,
215
+ bound.shape,
216
+ meas_info,
217
+ max_num_bytes,
218
+ pub.circuit.metadata,
219
+ meas_level,
220
+ )
221
+ )
222
+ start = end
223
+
224
+ return results
225
+
226
+ def _postprocess_pub(
227
+ self,
228
+ result_memory: list[ResultMemory],
229
+ shots: int,
230
+ shape: tuple[int, ...],
231
+ meas_info: list[_MeasureInfo],
232
+ max_num_bytes: int,
233
+ circuit_metadata: dict,
234
+ meas_level: int | None,
235
+ ) -> SamplerPubResult:
236
+ """Converts the memory data into a sampler pub result
237
+
238
+ For level 2 data, the memory data are stored in an array of bit arrays
239
+ with the shape of the pub. For level 1 data, the data are stored in a
240
+ complex numpy array.
241
+ """
242
+ if meas_level == 2 or meas_level is None:
243
+ arrays = {
244
+ item.creg_name: np.zeros(shape + (shots, item.num_bytes), dtype=np.uint8)
245
+ for item in meas_info
246
+ }
247
+ memory_array = _memory_array(result_memory, max_num_bytes)
248
+
249
+ for samples, index in zip(memory_array, np.ndindex(*shape)):
250
+ for item in meas_info:
251
+ ary = _samples_to_packed_array(samples, item.num_bits, item.start)
252
+ arrays[item.creg_name][index] = ary
253
+
254
+ meas = {
255
+ item.creg_name: BitArray(arrays[item.creg_name], item.num_bits)
256
+ for item in meas_info
257
+ }
258
+ elif meas_level == 1:
259
+ raw = np.array(result_memory)
260
+ cplx = raw[..., 0] + 1j * raw[..., 1]
261
+ cplx = np.reshape(cplx, (*shape, *cplx.shape[1:]))
262
+ meas = {item.creg_name: cplx for item in meas_info}
263
+ else:
264
+ raise QiskitError(f"Unsupported meas_level: {meas_level}")
265
+ return SamplerPubResult(
266
+ DataBin(**meas, shape=shape),
267
+ metadata={"shots": shots, "circuit_metadata": circuit_metadata},
268
+ )
269
+
270
+
271
+ def _analyze_circuit(circuit: QuantumCircuit) -> tuple[list[_MeasureInfo], int]:
272
+ """Analyzes the information for each creg in a circuit."""
273
+ meas_info = []
274
+ max_num_bits = 0
275
+ for creg in circuit.cregs:
276
+ name = creg.name
277
+ num_bits = creg.size
278
+ if num_bits != 0:
279
+ start = circuit.find_bit(creg[0]).index
280
+ else:
281
+ start = 0
282
+ meas_info.append(
283
+ _MeasureInfo(
284
+ creg_name=name,
285
+ num_bits=num_bits,
286
+ num_bytes=_min_num_bytes(num_bits),
287
+ start=start,
288
+ )
289
+ )
290
+ max_num_bits = max(max_num_bits, start + num_bits)
291
+ return meas_info, _min_num_bytes(max_num_bits)
292
+
293
+
294
+ def _prepare_memory(results: list[Result]) -> list[ResultMemory]:
295
+ """Joins splitted results if exceeding max_experiments"""
296
+ lst = []
297
+ for res in results:
298
+ for exp in res.results:
299
+ if hasattr(exp.data, "memory") and exp.data.memory:
300
+ lst.append(exp.data.memory)
301
+ else:
302
+ # no measure in a circuit
303
+ lst.append(["0x0"] * exp.shots)
304
+ return lst
305
+
306
+
307
+ def _memory_array(results: list[list[str]], num_bytes: int) -> NDArray[np.uint8]:
308
+ """Converts the memory data into an array in an unpacked way."""
309
+ lst = []
310
+ for memory in results:
311
+ if num_bytes > 0:
312
+ data = b"".join(int(i, 16).to_bytes(num_bytes, "big") for i in memory)
313
+ data = np.frombuffer(data, dtype=np.uint8).reshape(-1, num_bytes)
314
+ else:
315
+ # no measure in a circuit
316
+ data = np.zeros((len(memory), num_bytes), dtype=np.uint8)
317
+ lst.append(data)
318
+ ary = np.asarray(lst)
319
+ return np.unpackbits(ary, axis=-1, bitorder="big")
320
+
321
+
322
+ def _samples_to_packed_array(
323
+ samples: NDArray[np.uint8], num_bits: int, start: int
324
+ ) -> NDArray[np.uint8]:
325
+ """Converts an unpacked array of the memory data into a packed array."""
326
+ # samples of `Backend.run(memory=True)` will be the order of
327
+ # clbit_last, ..., clbit_1, clbit_0
328
+ # place samples in the order of clbit_start+num_bits-1, ..., clbit_start+1, clbit_start
329
+ if start == 0:
330
+ ary = samples[:, -start - num_bits :]
331
+ else:
332
+ ary = samples[:, -start - num_bits : -start]
333
+ # pad 0 in the left to align the number to be mod 8
334
+ # since np.packbits(bitorder='big') pads 0 to the right.
335
+ pad_size = -num_bits % 8
336
+ ary = np.pad(ary, ((0, 0), (pad_size, 0)), constant_values=0)
337
+ # pack bits in big endian order
338
+ ary = np.packbits(ary, axis=-1, bitorder="big")
339
+ return ary
@@ -0,0 +1,20 @@
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
+ """
14
+ Abstract base classes for primitives module.
15
+ """
16
+
17
+ from .base_sampler import BaseSamplerV1, BaseSamplerV2
18
+ from .base_estimator import BaseEstimatorV1, BaseEstimatorV2
19
+ from .estimator_result_v1 import EstimatorResult
20
+ from .sampler_result_v1 import SamplerResult
@@ -0,0 +1,247 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022, 2023, 2024.
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
+ """Base Estimator V1 and V2 classes"""
14
+
15
+ from __future__ import annotations
16
+
17
+ from abc import abstractmethod, ABC
18
+ from collections.abc import Iterable, Sequence
19
+ from copy import copy
20
+ from typing import Generic, TypeVar
21
+
22
+ from qiskit.circuit import QuantumCircuit
23
+ from qiskit.providers import JobV1 as Job
24
+ from qiskit.quantum_info.operators import SparsePauliOp
25
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
26
+
27
+ from ..containers import (
28
+ DataBin,
29
+ EstimatorPubLike,
30
+ PrimitiveResult,
31
+ PubResult,
32
+ )
33
+ from ..containers.estimator_pub import EstimatorPub
34
+ from .validation_v1 import _validate_estimator_args
35
+ from .base_primitive_v1 import BasePrimitiveV1
36
+ from .base_primitive_job import BasePrimitiveJob
37
+
38
+ T = TypeVar("T", bound=Job)
39
+
40
+
41
+ class BaseEstimatorV2(ABC):
42
+ r"""Base class for ``EstimatorV2`` implementations.
43
+
44
+ An estimator calculates expectation values for provided quantum circuit and
45
+ observable combinations. Implementations of this :class:`.BaseEstimatorV2`
46
+ interface must define their own :meth:`.run` method, which is designed to
47
+ take the following inputs:
48
+
49
+ * pubs: list of pubs (Primitive Unified Blocs). An estimator pub is a list
50
+ or tuple of two to four elements that define the unit of work for the
51
+ estimator. These are:
52
+
53
+ * A single :class:`~qiskit.circuit.QuantumCircuit`, possibly parametrized,
54
+ whose final state we define as :math:`\psi(\theta)`.
55
+
56
+ * One or more observables (specified as any :class:`~.ObservablesArrayLike`, including
57
+ :class:`~.quantum_info.Pauli`, :class:`~.SparsePauliOp`, ``str``) that specify which
58
+ expectation values to estimate, denoted :math:`H_j`.
59
+
60
+ * A collection parameter value sets to bind the circuit against, :math:`\theta_k`
61
+
62
+ * Optionally, the estimation precision.
63
+
64
+ * precision: the estimation precision. This specification is optional and will be overriden by
65
+ the pub-wise shots if provided.
66
+
67
+ All estimator implementations must implement default value for the ``precision`` in the
68
+ :meth:`.run` method. This default value will be used any time ``precision=None`` is specified, which
69
+ can take place in the :meth:`.run` kwargs or at the pub level.
70
+ """
71
+
72
+ @staticmethod
73
+ def _make_data_bin(_: EstimatorPub) -> type[DataBin]:
74
+ # this method is present for backwards compat. new primitive implementations
75
+ # should avoid it.
76
+ return DataBin
77
+
78
+ @abstractmethod
79
+ def run(
80
+ self, pubs: Iterable[EstimatorPubLike], *, precision: float | None = None
81
+ ) -> BasePrimitiveJob[PrimitiveResult[PubResult]]:
82
+ """Estimate expectation values for each provided pub (Primitive Unified Bloc).
83
+
84
+ Args:
85
+ pubs: An iterable of pub-like objects, such as tuples ``(circuit, observables)``
86
+ or ``(circuit, observables, parameter_values)``.
87
+ precision: The target precision for expectation value estimates of each
88
+ run Estimator Pub that does not specify its own precision. If None
89
+ the estimator's default precision value will be used.
90
+
91
+ Returns:
92
+ A job object that contains results.
93
+ """
94
+
95
+
96
+ class BaseEstimatorV1(BasePrimitiveV1, Generic[T]):
97
+ r"""Base class for ``EstimatorV1`` implementations.
98
+
99
+ Note that the reference estimator in Qiskit follows the ``EstimatorV2``
100
+ interface specifications instead.
101
+
102
+ An estimator calculates expectation values for provided quantum circuit and
103
+ observable combinations.
104
+
105
+ Implementations of :class:`.BaseEstimatorV1` should define their own
106
+ :meth:`.BaseEstimatorV1._run` method
107
+ that will be called by the public-facing :meth:`qiskit.primitives.BaseEstimatorV1.run`,
108
+ which takes the following inputs:
109
+
110
+ * quantum circuits (:math:`\psi_i(\theta)`): list of (parameterized) quantum circuits
111
+ (a list of :class:`~qiskit.circuit.QuantumCircuit` objects).
112
+
113
+ * observables (:math:`H_j`): a list of :class:`~qiskit.quantum_info.SparsePauliOp`
114
+ objects.
115
+
116
+ * parameter values (:math:`\theta_k`): list of sets of values
117
+ to be bound to the parameters of the quantum circuits
118
+ (list of list of float).
119
+
120
+ The method returns a :class:`~qiskit.providers.JobV1` object. Calling
121
+ :meth:`qiskit.providers.JobV1.result()` yields the
122
+ a list of expectation values plus optional metadata like confidence intervals for
123
+ the estimation.
124
+
125
+ .. math::
126
+
127
+ \langle\psi_i(\theta_k)|H_j|\psi_i(\theta_k)\rangle
128
+
129
+ Here is an example of how a :class:`.BaseEstimatorV1` would be used:
130
+
131
+ .. code-block:: python
132
+
133
+ # This is a fictional import path.
134
+ # There are currently no EstimatorV1 implementations in Qiskit.
135
+ from estimator_v1_location import EstimatorV1
136
+ from qiskit.circuit.library import RealAmplitudes
137
+ from qiskit.quantum_info import SparsePauliOp
138
+
139
+ psi1 = RealAmplitudes(num_qubits=2, reps=2)
140
+ psi2 = RealAmplitudes(num_qubits=2, reps=3)
141
+
142
+ H1 = SparsePauliOp.from_list([("II", 1), ("IZ", 2), ("XI", 3)])
143
+ H2 = SparsePauliOp.from_list([("IZ", 1)])
144
+ H3 = SparsePauliOp.from_list([("ZI", 1), ("ZZ", 1)])
145
+
146
+ theta1 = [0, 1, 1, 2, 3, 5]
147
+ theta2 = [0, 1, 1, 2, 3, 5, 8, 13]
148
+ theta3 = [1, 2, 3, 4, 5, 6]
149
+
150
+ estimator = EstimatorV1()
151
+
152
+ # calculate [ <psi1(theta1)|H1|psi1(theta1)> ]
153
+ job = estimator.run([psi1], [H1], [theta1])
154
+ job_result = job.result() # It will block until the job finishes.
155
+ print(f"The primitive-job finished with result {job_result}")
156
+
157
+ # calculate [ <psi1(theta1)|H1|psi1(theta1)>,
158
+ # <psi2(theta2)|H2|psi2(theta2)>,
159
+ # <psi1(theta3)|H3|psi1(theta3)> ]
160
+ job2 = estimator.run([psi1, psi2, psi1], [H1, H2, H3], [theta1, theta2, theta3])
161
+ job_result = job2.result()
162
+ print(f"The primitive-job finished with result {job_result}")
163
+ """
164
+
165
+ __hash__ = None
166
+
167
+ def __init__(
168
+ self,
169
+ *,
170
+ options: dict | None = None,
171
+ ):
172
+ """
173
+ Initialize ``EstimatorV1``.
174
+
175
+ Args:
176
+ options: Default options.
177
+ """
178
+ super().__init__(options)
179
+
180
+ def run(
181
+ self,
182
+ circuits: Sequence[QuantumCircuit] | QuantumCircuit,
183
+ observables: Sequence[BaseOperator | str] | BaseOperator | str,
184
+ parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None = None,
185
+ **run_options,
186
+ ) -> T:
187
+ """Run the job of the estimation of expectation value(s).
188
+
189
+ ``circuits``, ``observables``, and ``parameter_values`` should have the same
190
+ length. The i-th element of the result is the expectation of observable
191
+
192
+ .. code-block:: python
193
+
194
+ obs = observables[i]
195
+
196
+ for the state prepared by
197
+
198
+ .. code-block:: python
199
+
200
+ circ = circuits[i]
201
+
202
+ with bound parameters
203
+
204
+ .. code-block:: python
205
+
206
+ values = parameter_values[i]
207
+
208
+ Args:
209
+ circuits: one or more circuit objects.
210
+ observables: one or more observable objects. Several formats are allowed;
211
+ importantly, ``str`` should follow the string representation format for
212
+ :class:`~qiskit.quantum_info.Pauli` objects.
213
+ parameter_values: concrete parameters to be bound.
214
+ run_options: runtime options used for circuit execution.
215
+
216
+ Returns:
217
+ The job object of EstimatorResult.
218
+
219
+ Raises:
220
+ TypeError: Invalid argument type given.
221
+ ValueError: Invalid argument values given.
222
+ """
223
+ # Validation
224
+ circuits, observables, parameter_values = _validate_estimator_args(
225
+ circuits, observables, parameter_values
226
+ )
227
+
228
+ # Options
229
+ run_opts = copy(self.options)
230
+ run_opts.update_options(**run_options)
231
+
232
+ return self._run(
233
+ circuits,
234
+ observables,
235
+ parameter_values,
236
+ **run_opts.__dict__,
237
+ )
238
+
239
+ @abstractmethod
240
+ def _run(
241
+ self,
242
+ circuits: tuple[QuantumCircuit, ...],
243
+ observables: tuple[SparsePauliOp, ...],
244
+ parameter_values: tuple[tuple[float, ...], ...],
245
+ **run_options,
246
+ ) -> T:
247
+ raise NotImplementedError("The subclass of BaseEstimatorV1 must implement `_run` method.")
@@ -0,0 +1,78 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2024.
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
+ Primitive job abstract base class
14
+ """
15
+
16
+ from abc import ABC, abstractmethod
17
+ from typing import Generic, TypeVar, Union
18
+
19
+ from ..containers import PrimitiveResult
20
+ from .base_result_v1 import _BasePrimitiveResultV1
21
+
22
+ ResultT = TypeVar("ResultT", bound=Union[_BasePrimitiveResultV1, PrimitiveResult])
23
+ StatusT = TypeVar("StatusT")
24
+
25
+
26
+ class BasePrimitiveJob(ABC, Generic[ResultT, StatusT]):
27
+ """Primitive job abstract base class."""
28
+
29
+ def __init__(self, job_id: str, **kwargs) -> None:
30
+ """Initializes the primitive job.
31
+
32
+ Args:
33
+ job_id: A unique id in the context of the primitive used to run the job.
34
+ kwargs: Any key value metadata to associate with this job.
35
+ """
36
+ self._job_id = job_id
37
+ self.metadata = kwargs
38
+
39
+ def job_id(self) -> str:
40
+ """Return a unique id identifying the job."""
41
+ return self._job_id
42
+
43
+ @abstractmethod
44
+ def result(self) -> ResultT:
45
+ """Return the results of the job."""
46
+ raise NotImplementedError("Subclass of BasePrimitiveJob must implement `result` method.")
47
+
48
+ @abstractmethod
49
+ def status(self) -> StatusT:
50
+ """Return the status of the job."""
51
+ raise NotImplementedError("Subclass of BasePrimitiveJob must implement `status` method.")
52
+
53
+ @abstractmethod
54
+ def done(self) -> bool:
55
+ """Return whether the job has successfully run."""
56
+ raise NotImplementedError("Subclass of BasePrimitiveJob must implement `done` method.")
57
+
58
+ @abstractmethod
59
+ def running(self) -> bool:
60
+ """Return whether the job is actively running."""
61
+ raise NotImplementedError("Subclass of BasePrimitiveJob must implement `running` method.")
62
+
63
+ @abstractmethod
64
+ def cancelled(self) -> bool:
65
+ """Return whether the job has been cancelled."""
66
+ raise NotImplementedError("Subclass of BasePrimitiveJob must implement `cancelled` method.")
67
+
68
+ @abstractmethod
69
+ def in_final_state(self) -> bool:
70
+ """Return whether the job is in a final job state such as ``DONE`` or ``ERROR``."""
71
+ raise NotImplementedError(
72
+ "Subclass of BasePrimitiveJob must implement `is_final_state` method."
73
+ )
74
+
75
+ @abstractmethod
76
+ def cancel(self):
77
+ """Attempt to cancel the job."""
78
+ raise NotImplementedError("Subclass of BasePrimitiveJob must implement `cancel` method.")