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,656 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """The Pauli expansion circuit module."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from collections.abc import Sequence, Mapping
18
+ from typing import Optional, Callable, List, Union, Dict, Tuple
19
+ from functools import reduce
20
+ import numpy as np
21
+
22
+ from qiskit.circuit import QuantumCircuit
23
+ from qiskit.circuit import Parameter, ParameterVector, ParameterExpression
24
+ from qiskit.circuit.library.standard_gates import HGate
25
+ from qiskit.utils.deprecation import deprecate_func
26
+ from qiskit._accelerate.circuit_library import pauli_feature_map as _fast_map
27
+
28
+ from ..n_local.n_local import NLocal
29
+
30
+
31
+ def _normalize_entanglement(
32
+ entanglement: str | Mapping[int, Sequence[Sequence[int]]]
33
+ ) -> str | dict[int, list[tuple[int]]]:
34
+ if isinstance(entanglement, str):
35
+ return entanglement
36
+
37
+ return {
38
+ num_paulis: [tuple(connections) for connections in ent]
39
+ for num_paulis, ent in entanglement.items()
40
+ }
41
+
42
+
43
+ def pauli_feature_map(
44
+ feature_dimension: int,
45
+ reps: int = 2,
46
+ entanglement: (
47
+ str
48
+ | Mapping[int, Sequence[Sequence[int]]]
49
+ | Callable[[int], str | Mapping[int, Sequence[Sequence[int]]]]
50
+ ) = "full",
51
+ alpha: float = 2.0,
52
+ paulis: list[str] | None = None,
53
+ data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
54
+ parameter_prefix: str = "x",
55
+ insert_barriers: bool = False,
56
+ name: str = "PauliFeatureMap",
57
+ ) -> QuantumCircuit:
58
+ r"""The Pauli expansion circuit.
59
+
60
+ The Pauli expansion circuit is a data encoding circuit that transforms input data
61
+ :math:`\vec{x} \in \mathbb{R}^n`, where :math:`n` is the ``feature_dimension``, as
62
+
63
+ .. math::
64
+
65
+ U_{\Phi(\vec{x})}=\exp\left(i\sum_{S \in \mathcal{I}}
66
+ \phi_S(\vec{x})\prod_{i\in S} P_i\right).
67
+
68
+ Here, :math:`S` is a set of qubit indices that describes the connections in the feature map,
69
+ :math:`\mathcal{I}` is a set containing all these index sets, and
70
+ :math:`P_i \in \{I, X, Y, Z\}`. Per default the data-mapping
71
+ :math:`\phi_S` is
72
+
73
+ .. math::
74
+
75
+ \phi_S(\vec{x}) = \begin{cases}
76
+ x_i \text{ if } S = \{i\} \\
77
+ \prod_{j \in S} (\pi - x_j) \text{ if } |S| > 1
78
+ \end{cases}.
79
+
80
+ The possible connections can be set using the ``entanglement`` and ``paulis`` arguments.
81
+ For example, for single-qubit :math:`Z` rotations and two-qubit :math:`YY` interactions
82
+ between all qubit pairs, we can set::
83
+
84
+
85
+ circuit = pauli_feature_map(..., paulis=["Z", "YY"], entanglement="full")
86
+
87
+ which will produce blocks of the form
88
+
89
+ .. code-block:: text
90
+
91
+ ┌───┐┌─────────────┐┌──────────┐ ┌───────────┐
92
+ ┤ H ├┤ P(2.0*x[0]) ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
93
+ ├───┤├─────────────┤├──────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───────────┤
94
+ ┤ H ├┤ P(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
95
+ └───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘
96
+
97
+ The circuit contains ``reps`` repetitions of this transformation.
98
+
99
+ Please refer to :func:`.z_feature_map` for the case of single-qubit Pauli-:math:`Z` rotations
100
+ and to :func:`.zz_feature_map` for the single- and two-qubit Pauli-:math:`Z` rotations.
101
+
102
+ Examples:
103
+
104
+ >>> prep = pauli_feature_map(2, reps=1, paulis=["ZZ"])
105
+ >>> print(prep)
106
+ ┌───┐
107
+ q_0: ┤ H ├──■──────────────────────────────────────■──
108
+ ├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
109
+ q_1: ┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
110
+ └───┘└───┘└────────────────────────────────┘└───┘
111
+
112
+ >>> prep = pauli_feature_map(2, reps=1, paulis=["Z", "XX"])
113
+ >>> print(prep)
114
+ ┌───┐┌─────────────┐┌───┐ ┌───┐
115
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ H ├──■──────────────────────────────────────■──┤ H ├
116
+ ├───┤├─────────────┤├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───┤
117
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
118
+ └───┘└─────────────┘└───┘└───┘└────────────────────────────────┘└───┘└───┘
119
+
120
+ >>> prep = pauli_feature_map(2, reps=1, paulis=["ZY"])
121
+ >>> print(prep)
122
+ ┌───┐┌──────────┐ ┌───────────┐
123
+ q_0: ┤ H ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
124
+ ├───┤└──────────┘┌─┴─┐┌────────────────────────────────┐┌─┴─┐└───────────┘
125
+ q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
126
+ └───┘ └───┘└────────────────────────────────┘└───┘
127
+
128
+ >>> from qiskit.circuit.library import efficient_su2
129
+ >>> prep = pauli_feature_map(3, reps=3, paulis=["Z", "YY", "ZXZ"])
130
+ >>> wavefunction = efficient_su2(3)
131
+ >>> classifier = prep.compose(wavefunction)
132
+ >>> classifier.num_parameters
133
+ 27
134
+ >>> classifier.count_ops()
135
+ OrderedDict([('cx', 39), ('rx', 36), ('u1', 21), ('h', 15), ('ry', 12), ('rz', 12)])
136
+
137
+ References:
138
+
139
+ [1] Havlicek et al. Supervised learning with quantum enhanced feature spaces,
140
+ `Nature 567, 209-212 (2019) <https://www.nature.com/articles/s41586-019-0980-2>`__.
141
+ """
142
+ # create parameter vector used in the Pauli feature map
143
+ parameters = ParameterVector(parameter_prefix, feature_dimension)
144
+
145
+ # the Rust implementation expects the entanglement to be a str or list[tuple[int]] (or the
146
+ # callable to return these types), therefore we normalize the entanglement here
147
+ if callable(entanglement):
148
+ normalized = lambda offset: _normalize_entanglement(entanglement(offset))
149
+ else:
150
+ normalized = _normalize_entanglement(entanglement)
151
+
152
+ # construct from Rust
153
+ circuit = QuantumCircuit._from_circuit_data(
154
+ _fast_map(
155
+ feature_dimension,
156
+ paulis=paulis,
157
+ entanglement=normalized,
158
+ reps=reps,
159
+ parameters=parameters,
160
+ data_map_func=data_map_func,
161
+ alpha=alpha,
162
+ insert_barriers=insert_barriers,
163
+ ),
164
+ name=name,
165
+ )
166
+
167
+ return circuit
168
+
169
+
170
+ def z_feature_map(
171
+ feature_dimension: int,
172
+ reps: int = 2,
173
+ entanglement: (
174
+ str | Sequence[Sequence[int]] | Callable[[int], str | Sequence[Sequence[int]]]
175
+ ) = "full",
176
+ alpha: float = 2.0,
177
+ data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
178
+ parameter_prefix: str = "x",
179
+ insert_barriers: bool = False,
180
+ name: str = "ZFeatureMap",
181
+ ) -> QuantumCircuit:
182
+ """The first order Pauli Z-evolution circuit.
183
+
184
+ On 3 qubits and with 2 repetitions the circuit is represented by:
185
+
186
+ .. code-block:: text
187
+
188
+ ┌───┐┌─────────────┐┌───┐┌─────────────┐
189
+ ┤ H ├┤ P(2.0*x[0]) ├┤ H ├┤ P(2.0*x[0]) ├
190
+ ├───┤├─────────────┤├───┤├─────────────┤
191
+ ┤ H ├┤ U(2.0*x[1]) ├┤ H ├┤ P(2.0*x[1]) ├
192
+ ├───┤├─────────────┤├───┤├─────────────┤
193
+ ┤ H ├┤ P(2.0*x[2]) ├┤ H ├┤ P(2.0*x[2]) ├
194
+ └───┘└─────────────┘└───┘└─────────────┘
195
+
196
+ This is a sub-class of :class:`~qiskit.circuit.library.PauliFeatureMap` where the Pauli
197
+ strings are fixed as `['Z']`. As a result the first order expansion will be a circuit without
198
+ entangling gates.
199
+
200
+ Examples:
201
+
202
+ >>> prep = z_feature_map(3, reps=3, insert_barriers=True)
203
+ >>> print(prep)
204
+ ┌───┐ ░ ┌─────────────┐ ░ ┌───┐ ░ ┌─────────────┐ ░ ┌───┐ ░ ┌─────────────┐
205
+ q_0: ┤ H ├─░─┤ P(2.0*x[0]) ├─░─┤ H ├─░─┤ P(2.0*x[0]) ├─░─┤ H ├─░─┤ P(2.0*x[0]) ├
206
+ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤
207
+ q_1: ┤ H ├─░─┤ P(2.0*x[1]) ├─░─┤ H ├─░─┤ P(2.0*x[1]) ├─░─┤ H ├─░─┤ P(2.0*x[1]) ├
208
+ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤
209
+ q_2: ┤ H ├─░─┤ P(2.0*x[2]) ├─░─┤ H ├─░─┤ P(2.0*x[2]) ├─░─┤ H ├─░─┤ P(2.0*x[2]) ├
210
+ └───┘ ░ └─────────────┘ ░ └───┘ ░ └─────────────┘ ░ └───┘ ░ └─────────────┘
211
+
212
+ >>> data_map = lambda x: x[0]*x[0] + 1 # note: input is an array
213
+ >>> prep = z_feature_map(3, reps=1, data_map_func=data_map)
214
+ >>> print(prep)
215
+ ┌───┐┌──────────────────────┐
216
+ q_0: ┤ H ├┤ P(2.0*x[0]**2 + 2.0) ├
217
+ ├───┤├──────────────────────┤
218
+ q_1: ┤ H ├┤ P(2.0*x[1]**2 + 2.0) ├
219
+ ├───┤├──────────────────────┤
220
+ q_2: ┤ H ├┤ P(2.0*x[2]**2 + 2.0) ├
221
+ └───┘└──────────────────────┘
222
+
223
+ >>> from qiskit.circuit.library import TwoLocal
224
+ >>> ry = TwoLocal(3, "ry", "cz", reps=1).decompose()
225
+ >>> classifier = z_feature_map(3, reps=1) + ry
226
+ >>> print(classifier)
227
+ ┌───┐┌─────────────┐┌──────────┐ ┌──────────┐
228
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ RY(θ[0]) ├─■──■─┤ RY(θ[3]) ├────────────
229
+ ├───┤├─────────────┤├──────────┤ │ │ └──────────┘┌──────────┐
230
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ RY(θ[1]) ├─■──┼──────■──────┤ RY(θ[4]) ├
231
+ ├───┤├─────────────┤├──────────┤ │ │ ├──────────┤
232
+ q_2: ┤ H ├┤ P(2.0*x[2]) ├┤ RY(θ[2]) ├────■──────■──────┤ RY(θ[5]) ├
233
+ └───┘└─────────────┘└──────────┘ └──────────┘
234
+
235
+ """
236
+ return pauli_feature_map(
237
+ feature_dimension=feature_dimension,
238
+ reps=reps,
239
+ entanglement=entanglement,
240
+ alpha=alpha,
241
+ paulis=["z"],
242
+ data_map_func=data_map_func,
243
+ parameter_prefix=parameter_prefix,
244
+ insert_barriers=insert_barriers,
245
+ name=name,
246
+ )
247
+
248
+
249
+ def zz_feature_map(
250
+ feature_dimension: int,
251
+ reps: int = 2,
252
+ entanglement: (
253
+ str | Sequence[Sequence[int]] | Callable[[int], str | Sequence[Sequence[int]]]
254
+ ) = "full",
255
+ alpha: float = 2.0,
256
+ data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
257
+ parameter_prefix: str = "x",
258
+ insert_barriers: bool = False,
259
+ name: str = "ZZFeatureMap",
260
+ ) -> QuantumCircuit:
261
+ r"""Second-order Pauli-Z evolution circuit.
262
+
263
+ For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
264
+
265
+ .. code-block:: text
266
+
267
+ ┌───┐┌────────────────┐
268
+ ┤ H ├┤ P(2.0*φ(x[0])) ├──■───────────────────────────■───────────────────────────────────
269
+ ├───┤├────────────────┤┌─┴─┐┌─────────────────────┐┌─┴─┐
270
+ ┤ H ├┤ P(2.0*φ(x[1])) ├┤ X ├┤ P(2.0*φ(x[0],x[1])) ├┤ X ├──■───────────────────────────■──
271
+ ├───┤├────────────────┤└───┘└─────────────────────┘└───┘┌─┴─┐┌─────────────────────┐┌─┴─┐
272
+ ┤ H ├┤ P(2.0*φ(x[2])) ├─────────────────────────────────┤ X ├┤ P(2.0*φ(x[1],x[2])) ├┤ X ├
273
+ └───┘└────────────────┘ └───┘└─────────────────────┘└───┘
274
+
275
+ where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
276
+ if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
277
+
278
+ Examples:
279
+
280
+ >>> from qiskit.circuit.library import ZZFeatureMap
281
+ >>> prep = zz_feature_map(2, reps=1)
282
+ >>> print(prep)
283
+ ┌───┐┌─────────────┐
284
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├──■──────────────────────────────────────■──
285
+ ├───┤├─────────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
286
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
287
+ └───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
288
+
289
+ >>> from qiskit.circuit.library import efficient_su2
290
+ >>> classifier = zz_feature_map(3).compose(efficient_su2(3))
291
+ >>> classifier.num_parameters
292
+ 15
293
+ >>> classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
294
+ ParameterView([
295
+ ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
296
+ ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
297
+ ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
298
+ ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
299
+ ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
300
+ ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
301
+ ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
302
+ ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
303
+ ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
304
+ ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
305
+ ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
306
+ ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
307
+ ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
308
+ ParameterVectorElement(θ[23])
309
+ ])
310
+ """
311
+ return pauli_feature_map(
312
+ feature_dimension=feature_dimension,
313
+ reps=reps,
314
+ entanglement=entanglement,
315
+ alpha=alpha,
316
+ paulis=["z", "zz"],
317
+ data_map_func=data_map_func,
318
+ parameter_prefix=parameter_prefix,
319
+ insert_barriers=insert_barriers,
320
+ name=name,
321
+ )
322
+
323
+
324
+ class PauliFeatureMap(NLocal):
325
+ r"""The Pauli Expansion circuit.
326
+
327
+ The Pauli Expansion circuit is a data encoding circuit that transforms input data
328
+ :math:`\vec{x} \in \mathbb{R}^n`, where `n` is the ``feature_dimension``, as
329
+
330
+ .. math::
331
+
332
+ U_{\Phi(\vec{x})}=\exp\left(i\sum_{S \in \mathcal{I}}
333
+ \phi_S(\vec{x})\prod_{i\in S} P_i\right).
334
+
335
+ Here, :math:`S` is a set of qubit indices that describes the connections in the feature map,
336
+ :math:`\mathcal{I}` is a set containing all these index sets, and
337
+ :math:`P_i \in \{I, X, Y, Z\}`. Per default the data-mapping
338
+ :math:`\phi_S` is
339
+
340
+ .. math::
341
+
342
+ \phi_S(\vec{x}) = \begin{cases}
343
+ x_i \text{ if } S = \{i\} \\
344
+ \prod_{j \in S} (\pi - x_j) \text{ if } |S| > 1
345
+ \end{cases}.
346
+
347
+ The possible connections can be set using the ``entanglement`` and ``paulis`` arguments.
348
+ For example, for single-qubit :math:`Z` rotations and two-qubit :math:`YY` interactions
349
+ between all qubit pairs, we can set::
350
+
351
+
352
+ feature_map = PauliFeatureMap(..., paulis=["Z", "YY"], entanglement="full")
353
+
354
+ which will produce blocks of the form
355
+
356
+ .. code-block:: text
357
+
358
+ ┌───┐┌─────────────┐┌──────────┐ ┌───────────┐
359
+ ┤ H ├┤ P(2.0*x[0]) ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
360
+ ├───┤├─────────────┤├──────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───────────┤
361
+ ┤ H ├┤ P(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
362
+ └───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘
363
+
364
+ The circuit contains ``reps`` repetitions of this transformation.
365
+
366
+ Please refer to :class:`.ZFeatureMap` for the case of single-qubit Pauli-:math:`Z` rotations
367
+ and to :class:`.ZZFeatureMap` for the single- and two-qubit Pauli-:math:`Z` rotations.
368
+
369
+ Examples:
370
+
371
+ >>> prep = PauliFeatureMap(2, reps=1, paulis=['ZZ'])
372
+ >>> print(prep.decompose())
373
+ ┌───┐
374
+ q_0: ┤ H ├──■──────────────────────────────────────■──
375
+ ├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
376
+ q_1: ┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
377
+ └───┘└───┘└────────────────────────────────┘└───┘
378
+
379
+ >>> prep = PauliFeatureMap(2, reps=1, paulis=['Z', 'XX'])
380
+ >>> print(prep.decompose())
381
+ ┌───┐┌─────────────┐┌───┐ ┌───┐
382
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ H ├──■──────────────────────────────────────■──┤ H ├
383
+ ├───┤├─────────────┤├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───┤
384
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
385
+ └───┘└─────────────┘└───┘└───┘└────────────────────────────────┘└───┘└───┘
386
+
387
+ >>> prep = PauliFeatureMap(2, reps=1, paulis=['ZY'])
388
+ >>> print(prep.decompose())
389
+ ┌───┐┌──────────┐ ┌───────────┐
390
+ q_0: ┤ H ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
391
+ ├───┤└──────────┘┌─┴─┐┌────────────────────────────────┐┌─┴─┐└───────────┘
392
+ q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
393
+ └───┘ └───┘└────────────────────────────────┘└───┘
394
+
395
+ >>> from qiskit.circuit.library import EfficientSU2
396
+ >>> prep = PauliFeatureMap(3, reps=3, paulis=['Z', 'YY', 'ZXZ'])
397
+ >>> wavefunction = EfficientSU2(3)
398
+ >>> classifier = prep.compose(wavefunction)
399
+ >>> classifier.num_parameters
400
+ 27
401
+ >>> classifier.count_ops()
402
+ OrderedDict([('cx', 39), ('rx', 36), ('u1', 21), ('h', 15), ('ry', 12), ('rz', 12)])
403
+
404
+ References:
405
+
406
+ [1] Havlicek et al. Supervised learning with quantum enhanced feature spaces,
407
+ `Nature 567, 209-212 (2019) <https://www.nature.com/articles/s41586-019-0980-2>`__.
408
+ """
409
+
410
+ @deprecate_func(
411
+ since="2.1",
412
+ additional_msg=(
413
+ "Use the pauli_feature_map function as a replacement. Note that this will no longer "
414
+ "return a BlueprintCircuit, but just a plain QuantumCircuit."
415
+ ),
416
+ removal_timeline="in Qiskit 3.0",
417
+ )
418
+ def __init__(
419
+ self,
420
+ feature_dimension: Optional[int] = None,
421
+ reps: int = 2,
422
+ entanglement: Union[
423
+ str,
424
+ Dict[int, List[Tuple[int]]],
425
+ Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]],
426
+ ] = "full",
427
+ alpha: float = 2.0,
428
+ paulis: Optional[List[str]] = None,
429
+ data_map_func: Optional[Callable[[np.ndarray], float]] = None,
430
+ parameter_prefix: str = "x",
431
+ insert_barriers: bool = False,
432
+ name: str = "PauliFeatureMap",
433
+ ) -> None:
434
+ """Create a new Pauli expansion circuit.
435
+
436
+ Args:
437
+ feature_dimension: Number of qubits in the circuit.
438
+ reps: The number of repeated circuits.
439
+ entanglement: Specifies the entanglement structure. Can be a string (``'full'``,
440
+ ``'linear'``, ``'reverse_linear'``, ``'circular'`` or ``'sca'``) or can be a
441
+ dictionary where the keys represent the number of qubits and the values are list
442
+ of integer-pairs specifying the indices of qubits that are entangled with one
443
+ another, for example: ``{1: [(0,), (2,)], 2: [(0,1), (2,0)]}`` or can be a
444
+ ``Callable[[int], Union[str | Dict[...]]]`` to return an entanglement specific for
445
+ a repetition
446
+ alpha: The Pauli rotation factor, multiplicative to the pauli rotations
447
+ paulis: A list of strings for to-be-used paulis. If None are provided, ``['Z', 'ZZ']``
448
+ will be used.
449
+ data_map_func: A mapping function for data x which can be supplied to override the
450
+ default mapping from :meth:`self_product`.
451
+ parameter_prefix: The prefix used if default parameters are generated.
452
+ insert_barriers: If True, barriers are inserted in between the evolution instructions
453
+ and hadamard layers.
454
+
455
+ """
456
+
457
+ super().__init__(
458
+ num_qubits=feature_dimension,
459
+ reps=reps,
460
+ rotation_blocks=HGate(),
461
+ entanglement=entanglement,
462
+ parameter_prefix=parameter_prefix,
463
+ insert_barriers=insert_barriers,
464
+ skip_final_rotation_layer=True,
465
+ name=name,
466
+ )
467
+
468
+ self._prefix = parameter_prefix
469
+ self._data_map_func = data_map_func or self_product
470
+ self._paulis = paulis or ["Z", "ZZ"]
471
+ self._alpha = alpha
472
+
473
+ def _parameter_generator(
474
+ self, rep: int, block: int, indices: List[int]
475
+ ) -> Optional[List[Parameter]]:
476
+ """If certain blocks should use certain parameters this method can be overridden."""
477
+ params = [self.ordered_parameters[i] for i in indices]
478
+ return params
479
+
480
+ @property
481
+ def num_parameters_settable(self):
482
+ """The number of distinct parameters."""
483
+ return self.feature_dimension
484
+
485
+ @property
486
+ def paulis(self) -> List[str]:
487
+ """The Pauli strings used in the entanglement of the qubits.
488
+
489
+ Returns:
490
+ The Pauli strings as list.
491
+ """
492
+ return self._paulis
493
+
494
+ @paulis.setter
495
+ def paulis(self, paulis: List[str]) -> None:
496
+ """Set the pauli strings.
497
+
498
+ Args:
499
+ paulis: The new pauli strings.
500
+ """
501
+ self._invalidate()
502
+ self._paulis = paulis
503
+
504
+ @property
505
+ def alpha(self) -> float:
506
+ """The Pauli rotation factor (alpha).
507
+
508
+ Returns:
509
+ The Pauli rotation factor.
510
+ """
511
+ return self._alpha
512
+
513
+ @alpha.setter
514
+ def alpha(self, alpha: float) -> None:
515
+ """Set the Pauli rotation factor (alpha).
516
+
517
+ Args:
518
+ alpha: Pauli rotation factor
519
+ """
520
+ self._invalidate()
521
+ self._alpha = alpha
522
+
523
+ @property
524
+ def entanglement_blocks(self):
525
+ """The blocks in the entanglement layers.
526
+
527
+ Returns:
528
+ The blocks in the entanglement layers.
529
+ """
530
+ return [self.pauli_block(pauli) for pauli in self._paulis]
531
+
532
+ @entanglement_blocks.setter
533
+ def entanglement_blocks(self, entanglement_blocks):
534
+ self._entanglement_blocks = entanglement_blocks
535
+
536
+ @property
537
+ def feature_dimension(self) -> int:
538
+ """Returns the feature dimension (which is equal to the number of qubits).
539
+
540
+ Returns:
541
+ The feature dimension of this feature map.
542
+ """
543
+ return self.num_qubits
544
+
545
+ @feature_dimension.setter
546
+ def feature_dimension(self, feature_dimension: int) -> None:
547
+ """Set the feature dimension.
548
+
549
+ Args:
550
+ feature_dimension: The new feature dimension.
551
+ """
552
+ self.num_qubits = feature_dimension
553
+
554
+ def _extract_data_for_rotation(self, pauli, x):
555
+ where_non_i = np.where(np.asarray(list(pauli[::-1])) != "I")[0]
556
+ x = np.asarray(x)
557
+ return x[where_non_i]
558
+
559
+ def pauli_block(self, pauli_string):
560
+ """Get the Pauli block for the feature map circuit."""
561
+ params = ParameterVector("_", length=len(pauli_string))
562
+ time = self._data_map_func(np.asarray(params))
563
+ return self.pauli_evolution(pauli_string, time)
564
+
565
+ def pauli_evolution(self, pauli_string, time):
566
+ """Get the evolution block for the given pauli string."""
567
+ # for some reason this is in reversed order
568
+ pauli_string = pauli_string[::-1]
569
+
570
+ # trim the pauli string if identities are included
571
+ trimmed = []
572
+ indices = []
573
+ for i, pauli in enumerate(pauli_string):
574
+ if pauli != "I":
575
+ trimmed += [pauli]
576
+ indices += [i]
577
+
578
+ evo = QuantumCircuit(len(pauli_string))
579
+
580
+ if len(trimmed) == 0:
581
+ return evo
582
+
583
+ def basis_change(circuit, inverse=False):
584
+ for i, pauli in enumerate(pauli_string):
585
+ if pauli == "X":
586
+ circuit.h(i)
587
+ elif pauli == "Y":
588
+ if inverse:
589
+ circuit.sxdg(i)
590
+ else:
591
+ circuit.sx(i)
592
+
593
+ def cx_chain(circuit, inverse=False):
594
+ num_cx = len(indices) - 1
595
+ for i in reversed(range(num_cx)) if inverse else range(num_cx):
596
+ circuit.cx(indices[i], indices[i + 1])
597
+
598
+ basis_change(evo)
599
+ cx_chain(evo)
600
+ evo.p(self.alpha * time, indices[-1])
601
+ cx_chain(evo, inverse=True)
602
+ basis_change(evo, inverse=True)
603
+ return evo
604
+
605
+ def get_entangler_map(
606
+ self, rep_num: int, block_num: int, num_block_qubits: int
607
+ ) -> Sequence[Sequence[int]]:
608
+
609
+ # if entanglement is a Callable[[int], Union[str | Dict[...]]]
610
+ if callable(self._entanglement):
611
+ entanglement = self._entanglement(rep_num)
612
+ else:
613
+ entanglement = self._entanglement
614
+
615
+ # entanglement is Dict[int, List[List[int]]]
616
+ if isinstance(entanglement, dict):
617
+ if all(
618
+ isinstance(e2, (int, np.int32, np.int64))
619
+ for key in entanglement.keys()
620
+ for en in entanglement[key]
621
+ for e2 in en
622
+ ):
623
+ for qb, ent in entanglement.items():
624
+ for en in ent:
625
+ if len(en) != qb:
626
+ raise ValueError(
627
+ f"For num_qubits = {qb}, entanglement must be a "
628
+ f"tuple of length {qb}. You specified {en}."
629
+ )
630
+
631
+ # Check if the entanglement is specified for all the pauli blocks being used
632
+ for pauli in self.paulis:
633
+ if len(pauli) not in entanglement.keys():
634
+ raise ValueError(f"No entanglement specified for {pauli} pauli.")
635
+
636
+ return entanglement[num_block_qubits]
637
+
638
+ else:
639
+ # if the entanglement is not Dict[int, List[List[int]]] or
640
+ # Dict[int, List[Tuple[int]]] then we fall back on the original
641
+ # `get_entangler_map()` method from NLocal
642
+ return super().get_entangler_map(rep_num, block_num, num_block_qubits)
643
+
644
+
645
+ def self_product(x: np.ndarray) -> float:
646
+ """
647
+ Define a function map from R^n to R.
648
+
649
+ Args:
650
+ x: data
651
+
652
+ Returns:
653
+ float: the mapped value
654
+ """
655
+ coeff = x[0] if len(x) == 1 else reduce(lambda m, n: m * n, np.pi - x)
656
+ return coeff