qiskit 2.0.3__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 (690) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +141 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1343 -0
  6. qiskit/circuit/_add_control.py +312 -0
  7. qiskit/circuit/_classical_resource_map.py +150 -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/barrier.py +46 -0
  12. qiskit/circuit/classical/__init__.py +41 -0
  13. qiskit/circuit/classical/expr/__init__.py +266 -0
  14. qiskit/circuit/classical/expr/constructors.py +764 -0
  15. qiskit/circuit/classical/expr/expr.py +498 -0
  16. qiskit/circuit/classical/expr/visitors.py +375 -0
  17. qiskit/circuit/classical/types/__init__.py +113 -0
  18. qiskit/circuit/classical/types/ordering.py +229 -0
  19. qiskit/circuit/classical/types/types.py +153 -0
  20. qiskit/circuit/commutation_checker.py +133 -0
  21. qiskit/circuit/commutation_library.py +20 -0
  22. qiskit/circuit/controlflow/__init__.py +59 -0
  23. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  24. qiskit/circuit/controlflow/box.py +163 -0
  25. qiskit/circuit/controlflow/break_loop.py +56 -0
  26. qiskit/circuit/controlflow/builder.py +791 -0
  27. qiskit/circuit/controlflow/continue_loop.py +56 -0
  28. qiskit/circuit/controlflow/control_flow.py +94 -0
  29. qiskit/circuit/controlflow/for_loop.py +218 -0
  30. qiskit/circuit/controlflow/if_else.py +498 -0
  31. qiskit/circuit/controlflow/switch_case.py +411 -0
  32. qiskit/circuit/controlflow/while_loop.py +166 -0
  33. qiskit/circuit/controlledgate.py +274 -0
  34. qiskit/circuit/delay.py +157 -0
  35. qiskit/circuit/duration.py +80 -0
  36. qiskit/circuit/equivalence.py +94 -0
  37. qiskit/circuit/equivalence_library.py +18 -0
  38. qiskit/circuit/exceptions.py +19 -0
  39. qiskit/circuit/gate.py +261 -0
  40. qiskit/circuit/instruction.py +564 -0
  41. qiskit/circuit/instructionset.py +132 -0
  42. qiskit/circuit/library/__init__.py +984 -0
  43. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  44. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  45. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  46. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  47. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  48. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  49. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  50. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  51. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  52. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  53. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  54. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  55. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  56. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  57. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  58. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
  59. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
  60. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
  61. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  62. qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
  63. qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
  64. qiskit/circuit/library/basis_change/__init__.py +15 -0
  65. qiskit/circuit/library/basis_change/qft.py +316 -0
  66. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  67. qiskit/circuit/library/blueprintcircuit.py +316 -0
  68. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  69. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  70. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  71. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  72. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  73. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  74. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  75. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  76. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  77. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  78. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  79. qiskit/circuit/library/fourier_checking.py +160 -0
  80. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  81. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  82. qiskit/circuit/library/generalized_gates/gms.py +175 -0
  83. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  84. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  85. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  86. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  87. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  88. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  89. qiskit/circuit/library/generalized_gates/permutation.py +198 -0
  90. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  91. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  92. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  93. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  94. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  96. qiskit/circuit/library/generalized_gates/unitary.py +217 -0
  97. qiskit/circuit/library/graph_state.py +172 -0
  98. qiskit/circuit/library/grover_operator.py +583 -0
  99. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  100. qiskit/circuit/library/hidden_linear_function.py +163 -0
  101. qiskit/circuit/library/iqp.py +180 -0
  102. qiskit/circuit/library/n_local/__init__.py +45 -0
  103. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  104. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  105. qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
  106. qiskit/circuit/library/n_local/n_local.py +1477 -0
  107. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  108. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  109. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  110. qiskit/circuit/library/n_local/two_local.py +289 -0
  111. qiskit/circuit/library/overlap.py +183 -0
  112. qiskit/circuit/library/pauli_evolution.py +201 -0
  113. qiskit/circuit/library/phase_estimation.py +177 -0
  114. qiskit/circuit/library/phase_oracle.py +239 -0
  115. qiskit/circuit/library/quantum_volume.py +180 -0
  116. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  117. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  118. qiskit/circuit/library/standard_gates/ecr.py +129 -0
  119. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  120. qiskit/circuit/library/standard_gates/global_phase.py +84 -0
  121. qiskit/circuit/library/standard_gates/h.py +253 -0
  122. qiskit/circuit/library/standard_gates/i.py +76 -0
  123. qiskit/circuit/library/standard_gates/iswap.py +133 -0
  124. qiskit/circuit/library/standard_gates/p.py +422 -0
  125. qiskit/circuit/library/standard_gates/r.py +114 -0
  126. qiskit/circuit/library/standard_gates/rx.py +293 -0
  127. qiskit/circuit/library/standard_gates/rxx.py +180 -0
  128. qiskit/circuit/library/standard_gates/ry.py +286 -0
  129. qiskit/circuit/library/standard_gates/ryy.py +180 -0
  130. qiskit/circuit/library/standard_gates/rz.py +307 -0
  131. qiskit/circuit/library/standard_gates/rzx.py +226 -0
  132. qiskit/circuit/library/standard_gates/rzz.py +193 -0
  133. qiskit/circuit/library/standard_gates/s.py +419 -0
  134. qiskit/circuit/library/standard_gates/swap.py +281 -0
  135. qiskit/circuit/library/standard_gates/sx.py +310 -0
  136. qiskit/circuit/library/standard_gates/t.py +178 -0
  137. qiskit/circuit/library/standard_gates/u.py +395 -0
  138. qiskit/circuit/library/standard_gates/u1.py +490 -0
  139. qiskit/circuit/library/standard_gates/u2.py +145 -0
  140. qiskit/circuit/library/standard_gates/u3.py +428 -0
  141. qiskit/circuit/library/standard_gates/x.py +1481 -0
  142. qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
  143. qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
  144. qiskit/circuit/library/standard_gates/y.py +257 -0
  145. qiskit/circuit/library/standard_gates/z.py +338 -0
  146. qiskit/circuit/library/templates/__init__.py +92 -0
  147. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  148. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  153. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  157. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  158. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  163. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  166. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  167. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  170. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  175. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  179. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  214. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  215. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  216. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  217. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  218. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  221. qiskit/circuit/measure.py +53 -0
  222. qiskit/circuit/operation.py +68 -0
  223. qiskit/circuit/parameter.py +179 -0
  224. qiskit/circuit/parameterexpression.py +703 -0
  225. qiskit/circuit/parametertable.py +119 -0
  226. qiskit/circuit/parametervector.py +140 -0
  227. qiskit/circuit/quantumcircuit.py +7540 -0
  228. qiskit/circuit/quantumcircuitdata.py +136 -0
  229. qiskit/circuit/random/__init__.py +15 -0
  230. qiskit/circuit/random/utils.py +366 -0
  231. qiskit/circuit/reset.py +37 -0
  232. qiskit/circuit/singleton.py +600 -0
  233. qiskit/circuit/store.py +89 -0
  234. qiskit/circuit/tools/__init__.py +16 -0
  235. qiskit/circuit/tools/pi_check.py +193 -0
  236. qiskit/circuit/twirling.py +145 -0
  237. qiskit/compiler/__init__.py +27 -0
  238. qiskit/compiler/transpiler.py +375 -0
  239. qiskit/converters/__init__.py +74 -0
  240. qiskit/converters/circuit_to_dag.py +80 -0
  241. qiskit/converters/circuit_to_dagdependency.py +49 -0
  242. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  243. qiskit/converters/circuit_to_gate.py +107 -0
  244. qiskit/converters/circuit_to_instruction.py +142 -0
  245. qiskit/converters/dag_to_circuit.py +79 -0
  246. qiskit/converters/dag_to_dagdependency.py +54 -0
  247. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  248. qiskit/converters/dagdependency_to_circuit.py +40 -0
  249. qiskit/converters/dagdependency_to_dag.py +48 -0
  250. qiskit/dagcircuit/__init__.py +55 -0
  251. qiskit/dagcircuit/collect_blocks.py +407 -0
  252. qiskit/dagcircuit/dagcircuit.py +24 -0
  253. qiskit/dagcircuit/dagdependency.py +612 -0
  254. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  255. qiskit/dagcircuit/dagdepnode.py +160 -0
  256. qiskit/dagcircuit/dagnode.py +188 -0
  257. qiskit/dagcircuit/exceptions.py +42 -0
  258. qiskit/exceptions.py +153 -0
  259. qiskit/passmanager/__init__.py +258 -0
  260. qiskit/passmanager/base_tasks.py +230 -0
  261. qiskit/passmanager/compilation_status.py +74 -0
  262. qiskit/passmanager/exceptions.py +19 -0
  263. qiskit/passmanager/flow_controllers.py +116 -0
  264. qiskit/passmanager/passmanager.py +353 -0
  265. qiskit/primitives/__init__.py +490 -0
  266. qiskit/primitives/backend_estimator_v2.py +530 -0
  267. qiskit/primitives/backend_sampler_v2.py +339 -0
  268. qiskit/primitives/base/__init__.py +20 -0
  269. qiskit/primitives/base/base_estimator.py +247 -0
  270. qiskit/primitives/base/base_primitive_job.py +78 -0
  271. qiskit/primitives/base/base_primitive_v1.py +45 -0
  272. qiskit/primitives/base/base_result_v1.py +65 -0
  273. qiskit/primitives/base/base_sampler.py +196 -0
  274. qiskit/primitives/base/estimator_result_v1.py +46 -0
  275. qiskit/primitives/base/sampler_result_v1.py +45 -0
  276. qiskit/primitives/base/validation_v1.py +250 -0
  277. qiskit/primitives/containers/__init__.py +26 -0
  278. qiskit/primitives/containers/bindings_array.py +391 -0
  279. qiskit/primitives/containers/bit_array.py +764 -0
  280. qiskit/primitives/containers/data_bin.py +175 -0
  281. qiskit/primitives/containers/estimator_pub.py +222 -0
  282. qiskit/primitives/containers/object_array.py +94 -0
  283. qiskit/primitives/containers/observables_array.py +296 -0
  284. qiskit/primitives/containers/primitive_result.py +53 -0
  285. qiskit/primitives/containers/pub_result.py +51 -0
  286. qiskit/primitives/containers/sampler_pub.py +193 -0
  287. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  288. qiskit/primitives/containers/shape.py +129 -0
  289. qiskit/primitives/primitive_job.py +81 -0
  290. qiskit/primitives/statevector_estimator.py +175 -0
  291. qiskit/primitives/statevector_sampler.py +290 -0
  292. qiskit/primitives/utils.py +72 -0
  293. qiskit/providers/__init__.py +677 -0
  294. qiskit/providers/backend.py +364 -0
  295. qiskit/providers/basic_provider/__init__.py +47 -0
  296. qiskit/providers/basic_provider/basic_provider.py +121 -0
  297. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  298. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  299. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  300. qiskit/providers/basic_provider/exceptions.py +30 -0
  301. qiskit/providers/exceptions.py +33 -0
  302. qiskit/providers/fake_provider/__init__.py +69 -0
  303. qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
  304. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  305. qiskit/providers/job.py +147 -0
  306. qiskit/providers/jobstatus.py +30 -0
  307. qiskit/providers/options.py +273 -0
  308. qiskit/providers/providerutils.py +110 -0
  309. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  310. qiskit/qasm/libs/qelib1.inc +266 -0
  311. qiskit/qasm/libs/stdgates.inc +82 -0
  312. qiskit/qasm2/__init__.py +669 -0
  313. qiskit/qasm2/exceptions.py +27 -0
  314. qiskit/qasm2/export.py +364 -0
  315. qiskit/qasm2/parse.py +438 -0
  316. qiskit/qasm3/__init__.py +372 -0
  317. qiskit/qasm3/ast.py +782 -0
  318. qiskit/qasm3/exceptions.py +27 -0
  319. qiskit/qasm3/experimental.py +70 -0
  320. qiskit/qasm3/exporter.py +1340 -0
  321. qiskit/qasm3/printer.py +608 -0
  322. qiskit/qpy/__init__.py +1965 -0
  323. qiskit/qpy/binary_io/__init__.py +35 -0
  324. qiskit/qpy/binary_io/circuits.py +1455 -0
  325. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  326. qiskit/qpy/binary_io/schedules.py +308 -0
  327. qiskit/qpy/binary_io/value.py +1165 -0
  328. qiskit/qpy/common.py +353 -0
  329. qiskit/qpy/exceptions.py +53 -0
  330. qiskit/qpy/formats.py +442 -0
  331. qiskit/qpy/interface.py +344 -0
  332. qiskit/qpy/type_keys.py +409 -0
  333. qiskit/quantum_info/__init__.py +162 -0
  334. qiskit/quantum_info/analysis/__init__.py +17 -0
  335. qiskit/quantum_info/analysis/average.py +47 -0
  336. qiskit/quantum_info/analysis/distance.py +104 -0
  337. qiskit/quantum_info/analysis/make_observable.py +44 -0
  338. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  339. qiskit/quantum_info/operators/__init__.py +28 -0
  340. qiskit/quantum_info/operators/base_operator.py +145 -0
  341. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  342. qiskit/quantum_info/operators/channel/chi.py +191 -0
  343. qiskit/quantum_info/operators/channel/choi.py +218 -0
  344. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  345. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  346. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  347. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  348. qiskit/quantum_info/operators/channel/superop.py +373 -0
  349. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  350. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  351. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  352. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  354. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  355. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  356. qiskit/quantum_info/operators/linear_op.py +25 -0
  357. qiskit/quantum_info/operators/measures.py +418 -0
  358. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  359. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  360. qiskit/quantum_info/operators/mixins/group.py +171 -0
  361. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  362. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  363. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  364. qiskit/quantum_info/operators/op_shape.py +525 -0
  365. qiskit/quantum_info/operators/operator.py +869 -0
  366. qiskit/quantum_info/operators/operator_utils.py +76 -0
  367. qiskit/quantum_info/operators/predicates.py +183 -0
  368. qiskit/quantum_info/operators/random.py +154 -0
  369. qiskit/quantum_info/operators/scalar_op.py +254 -0
  370. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  371. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  372. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  373. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  374. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  375. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  377. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  378. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  379. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  380. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  381. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  383. qiskit/quantum_info/quaternion.py +156 -0
  384. qiskit/quantum_info/random.py +26 -0
  385. qiskit/quantum_info/states/__init__.py +28 -0
  386. qiskit/quantum_info/states/densitymatrix.py +857 -0
  387. qiskit/quantum_info/states/measures.py +288 -0
  388. qiskit/quantum_info/states/quantum_state.py +503 -0
  389. qiskit/quantum_info/states/random.py +157 -0
  390. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  391. qiskit/quantum_info/states/statevector.py +977 -0
  392. qiskit/quantum_info/states/utils.py +247 -0
  393. qiskit/result/__init__.py +61 -0
  394. qiskit/result/counts.py +189 -0
  395. qiskit/result/distributions/__init__.py +17 -0
  396. qiskit/result/distributions/probability.py +100 -0
  397. qiskit/result/distributions/quasi.py +154 -0
  398. qiskit/result/exceptions.py +40 -0
  399. qiskit/result/models.py +241 -0
  400. qiskit/result/postprocess.py +239 -0
  401. qiskit/result/result.py +385 -0
  402. qiskit/result/sampled_expval.py +74 -0
  403. qiskit/result/utils.py +294 -0
  404. qiskit/synthesis/__init__.py +240 -0
  405. qiskit/synthesis/arithmetic/__init__.py +18 -0
  406. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  407. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  408. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  409. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  410. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  411. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  412. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  413. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  414. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  415. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  416. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  417. qiskit/synthesis/boolean/__init__.py +13 -0
  418. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  419. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  420. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  421. qiskit/synthesis/clifford/__init__.py +19 -0
  422. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  423. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  424. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  425. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  426. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  427. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  428. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  429. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  431. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  432. qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
  433. qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -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 +120 -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 +313 -0
  442. qiskit/synthesis/evolution/qdrift.py +130 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +224 -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 +25 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -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 +79 -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 +288 -0
  495. qiskit/transpiler/__init__.py +1345 -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 +281 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +276 -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 +177 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -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 +506 -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 +256 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +235 -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 +250 -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_cliffords.py +89 -0
  556. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  557. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  558. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  559. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  560. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  561. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  562. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  563. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  564. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  565. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  566. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  567. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
  569. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  570. qiskit/transpiler/passes/routing/__init__.py +21 -0
  571. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  572. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  573. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  574. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  575. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  576. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  581. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  582. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  583. qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
  584. qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
  585. qiskit/transpiler/passes/routing/utils.py +35 -0
  586. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  587. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  588. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  589. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  590. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  591. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  592. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  593. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  594. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  595. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  599. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  600. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  601. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  602. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  603. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  604. qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
  605. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  606. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  607. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
  608. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  609. qiskit/transpiler/passes/utils/__init__.py +32 -0
  610. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  611. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  612. qiskit/transpiler/passes/utils/check_map.py +78 -0
  613. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  614. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  615. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  616. qiskit/transpiler/passes/utils/error.py +69 -0
  617. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  618. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  619. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  620. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  621. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  622. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  623. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  624. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  625. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  626. qiskit/transpiler/passmanager.py +503 -0
  627. qiskit/transpiler/passmanager_config.py +151 -0
  628. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  629. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
  630. qiskit/transpiler/preset_passmanagers/common.py +672 -0
  631. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
  632. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  633. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  634. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  635. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  636. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  637. qiskit/transpiler/target.py +905 -0
  638. qiskit/transpiler/timing_constraints.py +59 -0
  639. qiskit/user_config.py +266 -0
  640. qiskit/utils/__init__.py +90 -0
  641. qiskit/utils/classtools.py +146 -0
  642. qiskit/utils/deprecation.py +382 -0
  643. qiskit/utils/lazy_tester.py +363 -0
  644. qiskit/utils/optionals.py +354 -0
  645. qiskit/utils/parallel.py +318 -0
  646. qiskit/utils/units.py +146 -0
  647. qiskit/version.py +84 -0
  648. qiskit/visualization/__init__.py +290 -0
  649. qiskit/visualization/array.py +207 -0
  650. qiskit/visualization/bloch.py +778 -0
  651. qiskit/visualization/circuit/__init__.py +15 -0
  652. qiskit/visualization/circuit/_utils.py +675 -0
  653. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  654. qiskit/visualization/circuit/latex.py +661 -0
  655. qiskit/visualization/circuit/matplotlib.py +2019 -0
  656. qiskit/visualization/circuit/qcstyle.py +278 -0
  657. qiskit/visualization/circuit/styles/__init__.py +13 -0
  658. qiskit/visualization/circuit/styles/bw.json +202 -0
  659. qiskit/visualization/circuit/styles/clifford.json +202 -0
  660. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  661. qiskit/visualization/circuit/styles/iqp.json +214 -0
  662. qiskit/visualization/circuit/styles/textbook.json +202 -0
  663. qiskit/visualization/circuit/text.py +1849 -0
  664. qiskit/visualization/circuit_visualization.py +19 -0
  665. qiskit/visualization/counts_visualization.py +487 -0
  666. qiskit/visualization/dag_visualization.py +318 -0
  667. qiskit/visualization/exceptions.py +21 -0
  668. qiskit/visualization/gate_map.py +1424 -0
  669. qiskit/visualization/library.py +40 -0
  670. qiskit/visualization/pass_manager_visualization.py +312 -0
  671. qiskit/visualization/state_visualization.py +1546 -0
  672. qiskit/visualization/timeline/__init__.py +21 -0
  673. qiskit/visualization/timeline/core.py +495 -0
  674. qiskit/visualization/timeline/drawings.py +260 -0
  675. qiskit/visualization/timeline/generators.py +506 -0
  676. qiskit/visualization/timeline/interface.py +444 -0
  677. qiskit/visualization/timeline/layouts.py +115 -0
  678. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  679. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  680. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  681. qiskit/visualization/timeline/stylesheet.py +301 -0
  682. qiskit/visualization/timeline/types.py +148 -0
  683. qiskit/visualization/transition_visualization.py +369 -0
  684. qiskit/visualization/utils.py +49 -0
  685. qiskit-2.0.3.dist-info/METADATA +220 -0
  686. qiskit-2.0.3.dist-info/RECORD +690 -0
  687. qiskit-2.0.3.dist-info/WHEEL +6 -0
  688. qiskit-2.0.3.dist-info/entry_points.txt +82 -0
  689. qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
  690. qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,764 @@
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
+ """
14
+ BitArray
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from collections import defaultdict
20
+ from functools import partial
21
+ from itertools import chain, repeat
22
+ from typing import Callable, Iterable, Literal, Mapping, Sequence
23
+
24
+ import numpy as np
25
+ from numpy.typing import NDArray
26
+
27
+ from qiskit.exceptions import QiskitError
28
+ from qiskit.result import Counts, sampled_expectation_value
29
+
30
+ from .observables_array import ObservablesArray, ObservablesArrayLike
31
+ from .shape import ShapedMixin, ShapeInput, shape_tuple
32
+
33
+ # this lookup table tells you how many bits are 1 in each uint8 value
34
+ _WEIGHT_LOOKUP = np.unpackbits(np.arange(256, dtype=np.uint8).reshape(-1, 1), axis=1).sum(axis=1)
35
+
36
+
37
+ def _min_num_bytes(num_bits: int) -> int:
38
+ """Return the minimum number of bytes needed to store ``num_bits``."""
39
+ return num_bits // 8 + (num_bits % 8 > 0)
40
+
41
+
42
+ def _unpack(bit_array: BitArray) -> NDArray[np.uint8]:
43
+ arr = np.unpackbits(bit_array.array, axis=-1, bitorder="big")
44
+ arr = arr[..., -1 : -bit_array.num_bits - 1 : -1]
45
+ return arr
46
+
47
+
48
+ def _pack(arr: NDArray[np.uint8]) -> tuple[NDArray[np.uint8], int]:
49
+ arr = arr[..., ::-1]
50
+ num_bits = arr.shape[-1]
51
+ pad_size = -num_bits % 8
52
+ if pad_size > 0:
53
+ pad_width = [(0, 0)] * (arr.ndim - 1) + [(pad_size, 0)]
54
+ arr = np.pad(arr, pad_width, constant_values=0)
55
+ arr = np.packbits(arr, axis=-1, bitorder="big")
56
+ return arr, num_bits
57
+
58
+
59
+ class BitArray(ShapedMixin):
60
+ """Stores an array of bit values.
61
+
62
+ This object contains a single, contiguous block of data that represents an array of bitstrings.
63
+ The last axis is over packed bits, the second last axis is over shots, and the preceding axes
64
+ correspond to the shape of the pub that was executed to sample these bits.
65
+ """
66
+
67
+ def __init__(self, array: NDArray[np.uint8], num_bits: int):
68
+ """
69
+ Args:
70
+ array: The ``uint8`` data array.
71
+ num_bits: How many bit are in each outcome.
72
+
73
+ Raises:
74
+ TypeError: If the input is not a NumPy array with type ``numpy.uint8``.
75
+ ValueError: If the input array has fewer than two axes, or the size of the last axis
76
+ is not the smallest number of bytes that can contain ``num_bits``.
77
+ """
78
+ super().__init__()
79
+
80
+ if not isinstance(array, np.ndarray):
81
+ raise TypeError(f"Input must be a numpy.ndarray not {type(array)}")
82
+ if array.dtype != np.uint8:
83
+ raise TypeError(f"Input array must have dtype uint8, not {array.dtype}.")
84
+ if array.ndim < 2:
85
+ raise ValueError("The input array must have at least two axes.")
86
+ if array.shape[-1] != (expected := _min_num_bytes(num_bits)):
87
+ raise ValueError(f"The input array is expected to have {expected} bytes per shot.")
88
+
89
+ self._array = array
90
+ self._num_bits = num_bits
91
+ # second last dimension is shots, last dimension is packed bits
92
+ self._shape = self._array.shape[:-2]
93
+
94
+ def _prepare_broadcastable(self, other: "BitArray") -> tuple[NDArray[np.uint8], ...]:
95
+ """Validation and broadcasting of two bit arrays before element-wise binary operation."""
96
+ if self.num_bits != other.num_bits:
97
+ raise ValueError(f"'num_bits' must match in {self} and {other}.")
98
+ self_shape = self.shape + (self.num_shots,)
99
+ other_shape = other.shape + (other.num_shots,)
100
+ try:
101
+ shape = np.broadcast_shapes(self_shape, other_shape) + (self._array.shape[-1],)
102
+ except ValueError as ex:
103
+ raise ValueError(f"{self} and {other} are not compatible for this operation.") from ex
104
+ return np.broadcast_to(self.array, shape), np.broadcast_to(other.array, shape)
105
+
106
+ def __and__(self, other: "BitArray") -> "BitArray":
107
+ return BitArray(np.bitwise_and(*self._prepare_broadcastable(other)), self.num_bits)
108
+
109
+ def __eq__(self, other: "BitArray") -> bool:
110
+ if (n := self.num_bits) != other.num_bits:
111
+ return False
112
+ arrs = [self._array, other._array]
113
+ if n % 8 > 0:
114
+ # ignore straggling bits on the left
115
+ mask = np.array([255 >> ((-n) % 8)] + [255] * (n // 8), dtype=np.uint8)
116
+ arrs = [np.bitwise_and(arr, mask) for arr in arrs]
117
+ return np.array_equal(*arrs, equal_nan=False)
118
+
119
+ def __invert__(self) -> "BitArray":
120
+ return BitArray(np.bitwise_not(self._array), self.num_bits)
121
+
122
+ def __or__(self, other: "BitArray") -> "BitArray":
123
+ return BitArray(np.bitwise_or(*self._prepare_broadcastable(other)), self.num_bits)
124
+
125
+ def __xor__(self, other: "BitArray") -> "BitArray":
126
+ return BitArray(np.bitwise_xor(*self._prepare_broadcastable(other)), self.num_bits)
127
+
128
+ def __repr__(self):
129
+ desc = f"<shape={self.shape}, num_shots={self.num_shots}, num_bits={self.num_bits}>"
130
+ return f"BitArray({desc})"
131
+
132
+ def __getitem__(self, indices):
133
+ if isinstance(indices, tuple):
134
+ if len(indices) == self.ndim + 1:
135
+ raise IndexError(
136
+ "BitArray cannot be sliced along the shots axis, use slice_shots() instead."
137
+ )
138
+ if len(indices) >= self.ndim + 2:
139
+ raise IndexError(
140
+ "BitArray cannot be sliced along the bits axis, use slice_bits() instead."
141
+ )
142
+ return BitArray(self._array[indices], self.num_bits)
143
+
144
+ @property
145
+ def array(self) -> NDArray[np.uint8]:
146
+ """The raw NumPy array of data."""
147
+ return self._array
148
+
149
+ @property
150
+ def num_bits(self) -> int:
151
+ """The number of bits in the register that this array stores data for.
152
+
153
+ For example, a ``ClassicalRegister(5, "meas")`` would result in ``num_bits=5``.
154
+ """
155
+ return self._num_bits
156
+
157
+ @property
158
+ def num_shots(self) -> int:
159
+ """The number of shots sampled from the register in each configuration.
160
+
161
+ More precisely, the length of the second last axis of :attr:`~.array`.
162
+ """
163
+ return self._array.shape[-2]
164
+
165
+ @staticmethod
166
+ def _bytes_to_bitstring(data: bytes, num_bits: int, mask: int) -> str:
167
+ val = int.from_bytes(data, "big") & mask
168
+ return bin(val)[2:].zfill(num_bits)
169
+
170
+ @staticmethod
171
+ def _bytes_to_int(data: bytes, mask: int) -> int:
172
+ return int.from_bytes(data, "big") & mask
173
+
174
+ def _get_counts(
175
+ self, *, loc: int | tuple[int, ...] | None, converter: Callable[[bytes], str | int]
176
+ ) -> dict[str, int] | dict[int, int]:
177
+ arr = self._array.reshape(-1, self._array.shape[-1]) if loc is None else self._array[loc]
178
+
179
+ counts = defaultdict(int)
180
+ for shot_row in arr:
181
+ counts[converter(shot_row.tobytes())] += 1
182
+ return dict(counts)
183
+
184
+ def bitcount(self) -> NDArray[np.uint64]:
185
+ """Compute the number of ones appearing in the binary representation of each shot.
186
+
187
+ Returns:
188
+ A ``numpy.uint64``-array with shape ``(*shape, num_shots)``.
189
+ """
190
+ return _WEIGHT_LOOKUP[self._array].sum(axis=-1)
191
+
192
+ @staticmethod
193
+ def from_bool_array(
194
+ array: NDArray[np.bool_], order: Literal["big", "little"] = "big"
195
+ ) -> "BitArray":
196
+ """Construct a new bit array from an array of bools.
197
+
198
+ Args:
199
+ array: The array to convert, with "bitstrings" along the last axis.
200
+ order: One of ``"big"`` or ``"little"``, indicating whether ``array[..., 0]``
201
+ correspond to the most significant bits or the least significant bits of each
202
+ bitstring, respectively.
203
+
204
+ Returns:
205
+ A new bit array.
206
+ """
207
+ array = np.asarray(array, dtype=bool)
208
+
209
+ if array.ndim < 2:
210
+ raise ValueError("Expecting at least two dimensions.")
211
+
212
+ if order == "little":
213
+ # np.unpackbits assumes "big"
214
+ array = array[..., ::-1]
215
+ elif order != "big":
216
+ raise ValueError(
217
+ f"unknown value for order: '{order}'. Valid values are 'big' and 'little'."
218
+ )
219
+ num_bits = array.shape[-1]
220
+ if remainder := (-num_bits) % 8:
221
+ # unpackbits pads with zeros on the wrong side with respect to what we want, so
222
+ # we manually pad to the nearest byte
223
+ pad = np.zeros(shape_tuple(array.shape[:-1], remainder), dtype=bool)
224
+ array = np.concatenate([pad, array], axis=-1)
225
+
226
+ return BitArray(np.packbits(array, axis=-1), num_bits=num_bits)
227
+
228
+ @staticmethod
229
+ def from_counts(
230
+ counts: Mapping[str | int, int] | Iterable[Mapping[str | int, int]],
231
+ num_bits: int | None = None,
232
+ ) -> "BitArray":
233
+ """Construct a new bit array from one or more ``Counts``-like objects.
234
+
235
+ The ``counts`` can have keys that are (uniformly) integers, hexstrings, or bitstrings.
236
+ Their values represent numbers of occurrences of that value.
237
+
238
+ Args:
239
+ counts: One or more counts-like mappings with the same number of shots.
240
+ num_bits: The desired number of bits per shot. If unset, the biggest value found sets
241
+ this value, with a minimum of one bit.
242
+
243
+ Returns:
244
+ A new bit array with shape ``()`` for single input counts, or ``(N,)`` for an iterable
245
+ of :math:`N` counts.
246
+
247
+ Raises:
248
+ ValueError: If different mappings have different numbers of shots.
249
+ ValueError: If no counts dictionaries are supplied.
250
+ """
251
+ if singleton := isinstance(counts, Mapping):
252
+ counts = [counts]
253
+ else:
254
+ counts = list(counts)
255
+ if not counts:
256
+ raise ValueError("At least one counts mapping expected.")
257
+
258
+ counts = [
259
+ mapping.int_outcomes() if isinstance(mapping, Counts) else mapping for mapping in counts
260
+ ]
261
+
262
+ data = (v for mapping in counts for vs, count in mapping.items() for v in repeat(vs, count))
263
+
264
+ bit_array = BitArray.from_samples(data, num_bits)
265
+ if not singleton:
266
+ if bit_array.num_shots % len(counts) > 0:
267
+ raise ValueError("All of your mappings need to have the same number of shots.")
268
+ bit_array = bit_array.reshape(len(counts), bit_array.num_shots // len(counts))
269
+ return bit_array
270
+
271
+ @staticmethod
272
+ def from_samples(
273
+ samples: Iterable[str] | Iterable[int], num_bits: int | None = None
274
+ ) -> "BitArray":
275
+ """Construct a new bit array from an iterable of bitstrings, hexstrings, or integers.
276
+
277
+ All samples are assumed to be integers if the first one is. Strings are all assumed to be
278
+ bitstrings whenever the first string doesn't start with ``"0x"``.
279
+
280
+ Consider pairing this method with :meth:`~reshape` if your samples represent nested data.
281
+
282
+ Args:
283
+ samples: A list of bitstrings, a list of integers, or a list of hexstrings.
284
+ num_bits: The desired number of bits per sample. If unset, the biggest sample provided
285
+ is used to determine this value, with a minimum of one bit.
286
+
287
+ Returns:
288
+ A new bit array.
289
+
290
+ Raises:
291
+ ValueError: If no strings are given.
292
+ """
293
+ samples = iter(samples)
294
+ try:
295
+ first_sample = next(samples)
296
+ except StopIteration as ex:
297
+ raise ValueError("At least one sample is required.") from ex
298
+
299
+ ints = chain([first_sample], samples)
300
+ if isinstance(first_sample, str):
301
+ base = 16 if first_sample.startswith("0x") else 2
302
+ ints = (int(val, base=base) for val in ints)
303
+
304
+ if num_bits is None:
305
+ # we are forced to prematurely look at every iterand in this case
306
+ ints = list(ints)
307
+ num_bits = max(map(int.bit_length, ints))
308
+ # convention: if the only value is 0, represent with one bit:
309
+ if num_bits == 0:
310
+ num_bits = 1
311
+
312
+ num_bytes = _min_num_bytes(num_bits)
313
+ data = b"".join(val.to_bytes(num_bytes, "big") for val in ints)
314
+ array = np.frombuffer(data, dtype=np.uint8, count=len(data))
315
+ return BitArray(array.reshape(-1, num_bytes), num_bits)
316
+
317
+ def to_bool_array(self, order: Literal["big", "little"] = "big") -> NDArray[np.bool_]:
318
+ """Convert this :class:`~BitArray` to a boolean array.
319
+
320
+ Args:
321
+ order: One of ``"big"`` or ``"little"``, respectively indicating whether the most significant
322
+ bit or the least significant bit of each bitstring should be placed at ``[..., 0]``.
323
+
324
+ Returns:
325
+ A NumPy array of bools.
326
+
327
+ Raises:
328
+ ValueError: If the order is not one of ``"big"`` or ``"little"``.
329
+ """
330
+ if order not in ("big", "little"):
331
+ raise ValueError(
332
+ f"Invalid value for order: '{order}'. Valid values are 'big' and 'little'."
333
+ )
334
+
335
+ arr = np.unpackbits(self.array, axis=-1)[..., -self.num_bits :]
336
+ if order == "little":
337
+ arr = arr[..., ::-1]
338
+ return arr.astype(np.bool_)
339
+
340
+ def get_counts(self, loc: int | tuple[int, ...] | None = None) -> dict[str, int]:
341
+ """Return a counts dictionary with bitstring keys.
342
+
343
+ Args:
344
+ loc: Which entry of this array to return a dictionary for. If ``None``, counts from
345
+ all positions in this array are unioned together.
346
+
347
+ Returns:
348
+ A dictionary mapping bitstrings to the number of occurrences of that bitstring.
349
+ """
350
+ mask = 2**self.num_bits - 1
351
+ converter = partial(self._bytes_to_bitstring, num_bits=self.num_bits, mask=mask)
352
+ return self._get_counts(loc=loc, converter=converter)
353
+
354
+ def get_int_counts(self, loc: int | tuple[int, ...] | None = None) -> dict[int, int]:
355
+ r"""Return a counts dictionary, where bitstrings are stored as ``int``\s.
356
+
357
+ Args:
358
+ loc: Which entry of this array to return a dictionary for. If ``None``, counts from
359
+ all positions in this array are unioned together.
360
+
361
+ Returns:
362
+ A dictionary mapping ``ints`` to the number of occurrences of that ``int``.
363
+
364
+ """
365
+ converter = partial(self._bytes_to_int, mask=2**self.num_bits - 1)
366
+ return self._get_counts(loc=loc, converter=converter)
367
+
368
+ def get_bitstrings(self, loc: int | tuple[int, ...] | None = None) -> list[str]:
369
+ """Return a list of bitstrings.
370
+
371
+ Args:
372
+ loc: Which entry of this array to return a dictionary for. If ``None``, counts from
373
+ all positions in this array are unioned together.
374
+
375
+ Returns:
376
+ A list of bitstrings.
377
+ """
378
+ mask = 2**self.num_bits - 1
379
+ converter = partial(self._bytes_to_bitstring, num_bits=self.num_bits, mask=mask)
380
+ arr = self._array.reshape(-1, self._array.shape[-1]) if loc is None else self._array[loc]
381
+ return [converter(shot_row.tobytes()) for shot_row in arr]
382
+
383
+ def reshape(self, *shape: ShapeInput) -> "BitArray":
384
+ """Return a new reshaped bit array.
385
+
386
+ The :attr:`~num_shots` axis is either included or excluded from the reshaping procedure
387
+ depending on which picture the new shape is compatible with. For example, for a bit array
388
+ with shape ``(20, 5)`` and ``64`` shots, a reshape to ``(100,)`` would leave the
389
+ number of shots intact, whereas a reshape to ``(200, 32)`` would change the number of
390
+ shots to ``32``.
391
+
392
+ Args:
393
+ *shape: The new desired shape.
394
+
395
+ Returns:
396
+ A new bit array.
397
+
398
+ Raises:
399
+ ValueError: If the size corresponding to your new shape is not equal to either
400
+ :attr:`~size`, or the product of :attr:`~size` and :attr:`~num_shots`.
401
+ """
402
+ shape = shape_tuple(shape)
403
+ if (size := np.prod(shape, dtype=int)) == self.size:
404
+ shape = shape_tuple(shape, self._array.shape[-2:])
405
+ elif size == self.size * self.num_shots:
406
+ shape = shape_tuple(shape, self._array.shape[-1:])
407
+ else:
408
+ raise ValueError("Cannot change the size of the array.")
409
+ return BitArray(self._array.reshape(shape), self.num_bits)
410
+
411
+ def transpose(self, *axes) -> "BitArray":
412
+ """Return a bit array with axes transposed.
413
+
414
+ Args:
415
+ axes: None, tuple of ints or n ints. See `ndarray.transpose
416
+ <https://numpy.org/doc/stable/reference/generated/
417
+ numpy.ndarray.transpose.html#numpy.ndarray.transpose>`_
418
+ for the details.
419
+
420
+ Returns:
421
+ BitArray: A bit array with axes permuted.
422
+
423
+ Raises:
424
+ ValueError: If ``axes`` don't match this bit array.
425
+ ValueError: If ``axes`` includes any indices that are out of bounds.
426
+ """
427
+ if len(axes) == 0:
428
+ axes = tuple(reversed(range(self.ndim)))
429
+ if len(axes) == 1 and isinstance(axes[0], Sequence):
430
+ axes = axes[0]
431
+ if len(axes) != self.ndim:
432
+ raise ValueError("axes don't match bit array")
433
+ for i in axes:
434
+ if i >= self.ndim or self.ndim + i < 0:
435
+ raise ValueError(
436
+ f"axis {i} is out of bounds for bit array of dimension {self.ndim}."
437
+ )
438
+ axes = tuple(i if i >= 0 else self.ndim + i for i in axes) + (-2, -1)
439
+ return BitArray(self._array.transpose(axes), self.num_bits)
440
+
441
+ def slice_bits(self, indices: int | Sequence[int]) -> "BitArray":
442
+ """Return a bit array sliced along the bit axis of some indices of interest.
443
+
444
+ .. note::
445
+
446
+ The convention used by this method is that the index ``0`` corresponds to
447
+ the least-significant bit in the :attr:`~array`, or equivalently
448
+ the right-most bitstring entry as returned by
449
+ :meth:`~get_counts` or :meth:`~get_bitstrings`, etc.
450
+
451
+ If this bit array was produced by a sampler, then an index ``i`` corresponds to the
452
+ :class:`~.ClassicalRegister` location ``creg[i]``.
453
+
454
+ Args:
455
+ indices: The bit positions of interest to slice along.
456
+
457
+ Returns:
458
+ A bit array sliced along the bit axis.
459
+
460
+ Raises:
461
+ IndexError: If there are any invalid indices of the bit axis.
462
+ """
463
+ if isinstance(indices, int):
464
+ indices = (indices,)
465
+ for index in indices:
466
+ if index < 0 or index >= self.num_bits:
467
+ raise IndexError(
468
+ f"index {index} is out of bounds for the number of bits {self.num_bits}."
469
+ )
470
+ # This implementation introduces a temporary 8x memory overhead due to bit
471
+ # unpacking. This could be fixed using bitwise functions, at the expense of a
472
+ # more complicated implementation.
473
+ arr = _unpack(self)
474
+ arr = arr[..., indices]
475
+ arr, num_bits = _pack(arr)
476
+ return BitArray(arr, num_bits)
477
+
478
+ def slice_shots(self, indices: int | Sequence[int]) -> "BitArray":
479
+ """Return a bit array sliced along the shots axis of some indices of interest.
480
+
481
+ Args:
482
+ indices: The shots positions of interest to slice along.
483
+
484
+ Returns:
485
+ A bit array sliced along the shots axis.
486
+
487
+ Raises:
488
+ IndexError: If there are any invalid indices of the shots axis.
489
+ """
490
+ if isinstance(indices, int):
491
+ indices = (indices,)
492
+ for index in indices:
493
+ if index < 0 or index >= self.num_shots:
494
+ raise IndexError(
495
+ f"index {index} is out of bounds for the number of shots {self.num_shots}."
496
+ )
497
+ arr = self._array
498
+ arr = arr[..., indices, :]
499
+ return BitArray(arr, self.num_bits)
500
+
501
+ def postselect(
502
+ self,
503
+ indices: Sequence[int] | int,
504
+ selection: Sequence[bool | int] | bool | int,
505
+ ) -> BitArray:
506
+ """Post-select this bit array based on sliced equality with a given bitstring.
507
+
508
+ .. note::
509
+ If this bit array contains any shape axes, it is first flattened into a long list of shots
510
+ before applying post-selection. This is done because :class:`~BitArray` cannot handle
511
+ ragged numbers of shots across axes.
512
+
513
+ Args:
514
+ indices: A list of the indices of the cbits on which to postselect.
515
+ If this bit array was produced by a sampler, then an index ``i`` corresponds to the
516
+ :class:`~.ClassicalRegister` location ``creg[i]`` (as in :meth:`~slice_bits`).
517
+ Negative indices are allowed.
518
+
519
+ selection: A list of binary values (will be cast to ``bool``) of length matching
520
+ ``indices``, with ``indices[i]`` corresponding to ``selection[i]``. Shots will be
521
+ discarded unless all cbits specified by ``indices`` have the values given by
522
+ ``selection``.
523
+
524
+ Returns:
525
+ A new bit array with ``shape=(), num_bits=data.num_bits, num_shots<=data.num_shots``.
526
+
527
+ Raises:
528
+ IndexError: If ``max(indices)`` is greater than or equal to :attr:`num_bits`.
529
+ IndexError: If ``min(indices)`` is less than negative :attr:`num_bits`.
530
+ ValueError: If the lengths of ``selection`` and ``indices`` do not match.
531
+ """
532
+ if isinstance(indices, int):
533
+ indices = (indices,)
534
+ if isinstance(selection, (bool, int)):
535
+ selection = (selection,)
536
+ selection = np.asarray(selection, dtype=bool)
537
+
538
+ num_indices = len(indices)
539
+
540
+ if len(selection) != num_indices:
541
+ raise ValueError("Lengths of indices and selection do not match.")
542
+
543
+ num_bytes = self._array.shape[-1]
544
+ indices = np.asarray(indices)
545
+
546
+ if num_indices > 0:
547
+ if indices.max() >= self.num_bits:
548
+ raise IndexError(
549
+ f"index {int(indices.max())} out of bounds for the number of bits {self.num_bits}."
550
+ )
551
+ if indices.min() < -self.num_bits:
552
+ raise IndexError(
553
+ f"index {int(indices.min())} out of bounds for the number of bits {self.num_bits}."
554
+ )
555
+
556
+ flattened = self.reshape((), self.size * self.num_shots)
557
+
558
+ # If no conditions, keep all data, but flatten as promised:
559
+ if num_indices == 0:
560
+ return flattened
561
+
562
+ # Make negative bit indices positive:
563
+ indices %= self.num_bits
564
+
565
+ # Handle special-case of contradictory conditions:
566
+ if np.intersect1d(indices[selection], indices[np.logical_not(selection)]).size > 0:
567
+ return BitArray(np.empty((0, num_bytes), dtype=np.uint8), num_bits=self.num_bits)
568
+
569
+ # Recall that creg[0] is the LSb:
570
+ byte_significance, bit_significance = np.divmod(indices, 8)
571
+ # least-significant byte is at last position:
572
+ byte_idx = (num_bytes - 1) - byte_significance
573
+ # least-significant bit is at position 0:
574
+ bit_offset = bit_significance.astype(np.uint8)
575
+
576
+ # Get bitpacked representation of `indices` (bitmask):
577
+ bitmask = np.zeros(num_bytes, dtype=np.uint8)
578
+ np.bitwise_or.at(bitmask, byte_idx, np.uint8(1) << bit_offset)
579
+
580
+ # Get bitpacked representation of `selection` (desired bitstring):
581
+ selection_bytes = np.zeros(num_bytes, dtype=np.uint8)
582
+ ## This assumes no contradictions present, since those were already checked for:
583
+ np.bitwise_or.at(
584
+ selection_bytes, byte_idx, np.asarray(selection, dtype=np.uint8) << bit_offset
585
+ )
586
+
587
+ return BitArray(
588
+ flattened._array[((flattened._array & bitmask) == selection_bytes).all(axis=-1)],
589
+ num_bits=self.num_bits,
590
+ )
591
+
592
+ def expectation_values(self, observables: ObservablesArrayLike) -> NDArray[np.float64]:
593
+ """Compute the expectation values of the provided observables, broadcasted against
594
+ this bit array.
595
+
596
+ .. note::
597
+
598
+ This method returns the real part of the expectation value even if
599
+ the operator has complex coefficients due to the specification of
600
+ :func:`~.sampled_expectation_value`.
601
+
602
+ Args:
603
+ observables: The observable(s) to take the expectation value of.
604
+ Must have a shape broadcastable with with this bit array and
605
+ the same number of qubits as the number of bits of this bit array.
606
+ The observables must be diagonal (I, Z, 0 or 1) too.
607
+
608
+ Returns:
609
+ An array of expectation values whose shape is the broadcast shape of ``observables``
610
+ and this bit array.
611
+
612
+ Raises:
613
+ ValueError: If the provided observables does not have a shape broadcastable with
614
+ this bit array.
615
+ ValueError: If the provided observables does not have the same number of qubits as
616
+ the number of bits of this bit array.
617
+ ValueError: If the provided observables are not diagonal.
618
+ """
619
+ observables = ObservablesArray.coerce(observables)
620
+ arr_indices = np.fromiter(np.ndindex(self.shape), dtype=object).reshape(self.shape)
621
+ bc_indices, bc_obs = np.broadcast_arrays(arr_indices, observables)
622
+ counts = {}
623
+ arr = np.zeros_like(bc_indices, dtype=float)
624
+ for index in np.ndindex(bc_indices.shape):
625
+ loc = bc_indices[index]
626
+ for pauli, coeff in bc_obs[index].items():
627
+ if loc not in counts:
628
+ counts[loc] = self.get_counts(loc)
629
+ try:
630
+ expval = sampled_expectation_value(counts[loc], pauli)
631
+ except QiskitError as ex:
632
+ raise ValueError(ex.message) from ex
633
+ arr[index] += expval * coeff
634
+ return arr
635
+
636
+ @staticmethod
637
+ def concatenate(bit_arrays: Sequence[BitArray], axis: int = 0) -> BitArray:
638
+ """Join a sequence of bit arrays along an existing axis.
639
+
640
+ Args:
641
+ bit_arrays: The bit arrays must have (1) the same number of bits,
642
+ (2) the same number of shots, and
643
+ (3) the same shape, except in the dimension corresponding to axis
644
+ (the first, by default).
645
+ axis: The axis along which the arrays will be joined. Default is 0.
646
+
647
+ Returns:
648
+ The concatenated bit array.
649
+
650
+ Raises:
651
+ ValueError: If the sequence of bit arrays is empty.
652
+ ValueError: If any bit arrays has a different number of bits.
653
+ ValueError: If any bit arrays has a different number of shots.
654
+ ValueError: If any bit arrays has a different number of dimensions.
655
+ """
656
+ if len(bit_arrays) == 0:
657
+ raise ValueError("Need at least one bit array to concatenate")
658
+ num_bits = bit_arrays[0].num_bits
659
+ num_shots = bit_arrays[0].num_shots
660
+ ndim = bit_arrays[0].ndim
661
+ if ndim == 0:
662
+ raise ValueError("Zero-dimensional bit arrays cannot be concatenated")
663
+ for i, ba in enumerate(bit_arrays):
664
+ if ba.num_bits != num_bits:
665
+ raise ValueError(
666
+ "All bit arrays must have same number of bits, "
667
+ f"but the bit array at index 0 has {num_bits} bits "
668
+ f"and the bit array at index {i} has {ba.num_bits} bits."
669
+ )
670
+ if ba.num_shots != num_shots:
671
+ raise ValueError(
672
+ "All bit arrays must have same number of shots, "
673
+ f"but the bit array at index 0 has {num_shots} shots "
674
+ f"and the bit array at index {i} has {ba.num_shots} shots."
675
+ )
676
+ if ba.ndim != ndim:
677
+ raise ValueError(
678
+ "All bit arrays must have same number of dimensions, "
679
+ f"but the bit array at index 0 has {ndim} dimension(s) "
680
+ f"and the bit array at index {i} has {ba.ndim} dimension(s)."
681
+ )
682
+ if axis < 0 or axis >= ndim:
683
+ raise ValueError(f"axis {axis} is out of bounds for bit array of dimension {ndim}.")
684
+ data = np.concatenate([ba.array for ba in bit_arrays], axis=axis)
685
+ return BitArray(data, num_bits)
686
+
687
+ @staticmethod
688
+ def concatenate_shots(bit_arrays: Sequence[BitArray]) -> BitArray:
689
+ """Join a sequence of bit arrays along the shots axis.
690
+
691
+ Args:
692
+ bit_arrays: The bit arrays must have (1) the same number of bits,
693
+ and (2) the same shape.
694
+
695
+ Returns:
696
+ The stacked bit array.
697
+
698
+ Raises:
699
+ ValueError: If the sequence of bit arrays is empty.
700
+ ValueError: If any bit arrays has a different number of bits.
701
+ ValueError: If any bit arrays has a different shape.
702
+ """
703
+ if len(bit_arrays) == 0:
704
+ raise ValueError("Need at least one bit array to stack")
705
+ num_bits = bit_arrays[0].num_bits
706
+ shape = bit_arrays[0].shape
707
+ for i, ba in enumerate(bit_arrays):
708
+ if ba.num_bits != num_bits:
709
+ raise ValueError(
710
+ "All bit arrays must have same number of bits, "
711
+ f"but the bit array at index 0 has {num_bits} bits "
712
+ f"and the bit array at index {i} has {ba.num_bits} bits."
713
+ )
714
+ if ba.shape != shape:
715
+ raise ValueError(
716
+ "All bit arrays must have same shape, "
717
+ f"but the bit array at index 0 has shape {shape} "
718
+ f"and the bit array at index {i} has shape {ba.shape}."
719
+ )
720
+ data = np.concatenate([ba.array for ba in bit_arrays], axis=-2)
721
+ return BitArray(data, num_bits)
722
+
723
+ @staticmethod
724
+ def concatenate_bits(bit_arrays: Sequence[BitArray]) -> BitArray:
725
+ """Join a sequence of bit arrays along the bits axis.
726
+
727
+ .. note::
728
+ This method is equivalent to per-shot bitstring concatenation.
729
+
730
+ Args:
731
+ bit_arrays: Bit arrays that have (1) the same number of shots,
732
+ and (2) the same shape.
733
+
734
+ Returns:
735
+ The stacked bit array.
736
+
737
+ Raises:
738
+ ValueError: If the sequence of bit arrays is empty.
739
+ ValueError: If any bit arrays has a different number of shots.
740
+ ValueError: If any bit arrays has a different shape.
741
+ """
742
+ if len(bit_arrays) == 0:
743
+ raise ValueError("Need at least one bit array to stack")
744
+ num_shots = bit_arrays[0].num_shots
745
+ shape = bit_arrays[0].shape
746
+ for i, ba in enumerate(bit_arrays):
747
+ if ba.num_shots != num_shots:
748
+ raise ValueError(
749
+ "All bit arrays must have same number of shots, "
750
+ f"but the bit array at index 0 has {num_shots} shots "
751
+ f"and the bit array at index {i} has {ba.num_shots} shots."
752
+ )
753
+ if ba.shape != shape:
754
+ raise ValueError(
755
+ "All bit arrays must have same shape, "
756
+ f"but the bit array at index 0 has shape {shape} "
757
+ f"and the bit array at index {i} has shape {ba.shape}."
758
+ )
759
+ # This implementation introduces a temporary 8x memory overhead due to bit
760
+ # unpacking. This could be fixed using bitwise functions, at the expense of a
761
+ # more complicated implementation.
762
+ data = np.concatenate([_unpack(ba) for ba in bit_arrays], axis=-1)
763
+ data, num_bits = _pack(data)
764
+ return BitArray(data, num_bits)