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,336 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017.
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
+ """Prepare a quantum state from the state where all qubits are 0."""
13
+
14
+ from typing import Union, Optional
15
+
16
+ import math
17
+ import numpy as np
18
+
19
+ from qiskit.exceptions import QiskitError
20
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
21
+ from qiskit.circuit import QuantumRegister
22
+ from qiskit.circuit.gate import Gate
23
+ from qiskit.circuit.library.standard_gates.x import XGate
24
+ from qiskit.circuit.library.standard_gates.h import HGate
25
+ from qiskit.circuit.library.standard_gates.s import SGate, SdgGate
26
+ from qiskit.circuit.library.generalized_gates import Isometry
27
+ from qiskit.circuit.exceptions import CircuitError
28
+ from qiskit.quantum_info.states.statevector import (
29
+ Statevector,
30
+ ) # pylint: disable=cyclic-import
31
+
32
+ _EPS = 1e-10 # global variable used to chop very small numbers to zero
33
+
34
+
35
+ class StatePreparation(Gate):
36
+ """Complex amplitude state preparation.
37
+
38
+ Class that implements the (complex amplitude) state preparation of some
39
+ flexible collection of qubit registers.
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ params: Union[str, list, int, Statevector],
45
+ num_qubits: Optional[int] = None,
46
+ inverse: bool = False,
47
+ label: Optional[str] = None,
48
+ normalize: bool = False,
49
+ ):
50
+ r"""
51
+ Args:
52
+ params:
53
+ * Statevector: Statevector to initialize to.
54
+ * list: vector of complex amplitudes to initialize to.
55
+ * string: labels of basis states of the Pauli eigenstates Z, X, Y. See
56
+ :meth:`.Statevector.from_label`.
57
+ Notice the order of the labels is reversed with respect to the qubit index to
58
+ be applied to. Example label '01' initializes the qubit zero to :math:`|1\rangle`
59
+ and the qubit one to :math:`|0\rangle`.
60
+ * int: an integer that is used as a bitmap indicating which qubits to initialize
61
+ to :math:`|1\rangle`. Example: setting params to 5 would initialize qubit 0 and qubit 2
62
+ to :math:`|1\rangle` and qubit 1 to :math:`|0\rangle`.
63
+ num_qubits: This parameter is only used if params is an int. Indicates the total
64
+ number of qubits in the `initialize` call. Example: `initialize` covers 5 qubits
65
+ and params is 3. This allows qubits 0 and 1 to be initialized to :math:`|1\rangle`
66
+ and the remaining 3 qubits to be initialized to :math:`|0\rangle`.
67
+ inverse: if True, the inverse state is constructed.
68
+ label: An optional label for the gate
69
+ normalize (bool): Whether to normalize an input array to a unit vector.
70
+
71
+ Raises:
72
+ QiskitError: ``num_qubits`` parameter used when ``params`` is not an integer
73
+
74
+ When a Statevector argument is passed the state is prepared based on the
75
+ :class:`~.library.Isometry` synthesis described in [1].
76
+
77
+ References:
78
+ 1. Iten et al., Quantum circuits for isometries (2016).
79
+ `Phys. Rev. A 93, 032318
80
+ <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.93.032318>`__.
81
+
82
+ """
83
+ self._params_arg = params
84
+ self._inverse = inverse
85
+ self._name = "state_preparation_dg" if self._inverse else "state_preparation"
86
+
87
+ if label is None:
88
+ self._label = "State Preparation Dg" if self._inverse else "State Preparation"
89
+ else:
90
+ self._label = f"{label} Dg" if self._inverse else label
91
+
92
+ if isinstance(params, Statevector):
93
+ params = params.data
94
+
95
+ if not isinstance(params, int) and num_qubits is not None:
96
+ raise QiskitError(
97
+ "The num_qubits parameter to StatePreparation should only be"
98
+ " used when params is an integer"
99
+ )
100
+ self._from_label = isinstance(params, str)
101
+ self._from_int = isinstance(params, int)
102
+
103
+ # if initialized from a vector, check that the parameters are normalized
104
+ if not self._from_label and not self._from_int:
105
+ norm = np.linalg.norm(params)
106
+ if normalize:
107
+ params = np.array(params, dtype=np.complex128) / norm
108
+ elif not math.isclose(norm, 1.0, abs_tol=_EPS):
109
+ raise QiskitError(f"Sum of amplitudes-squared is not 1, but {norm}.")
110
+
111
+ num_qubits = self._get_num_qubits(num_qubits, params)
112
+ params = [params] if isinstance(params, int) else params
113
+
114
+ super().__init__(self._name, num_qubits, params, label=self._label)
115
+
116
+ def _define(self):
117
+ if self._from_label:
118
+ self.definition = self._define_from_label()
119
+ elif self._from_int:
120
+ self.definition = self._define_from_int()
121
+ else:
122
+ self.definition = self._define_synthesis_isom()
123
+
124
+ def _define_from_label(self):
125
+ q = QuantumRegister(self.num_qubits, "q")
126
+ initialize_circuit = QuantumCircuit(q, name="init_def")
127
+
128
+ for qubit, param in enumerate(reversed(self.params)):
129
+ if param == "1":
130
+ initialize_circuit.append(XGate(), [q[qubit]])
131
+ elif param == "+":
132
+ initialize_circuit.append(HGate(), [q[qubit]])
133
+ elif param == "-":
134
+ initialize_circuit.append(XGate(), [q[qubit]])
135
+ initialize_circuit.append(HGate(), [q[qubit]])
136
+ elif param == "r": # |+i>
137
+ initialize_circuit.append(HGate(), [q[qubit]])
138
+ initialize_circuit.append(SGate(), [q[qubit]])
139
+ elif param == "l": # |-i>
140
+ initialize_circuit.append(HGate(), [q[qubit]])
141
+ initialize_circuit.append(SdgGate(), [q[qubit]])
142
+
143
+ if self._inverse:
144
+ initialize_circuit = initialize_circuit.inverse()
145
+
146
+ return initialize_circuit
147
+
148
+ def _define_from_int(self):
149
+ q = QuantumRegister(self.num_qubits, "q")
150
+ initialize_circuit = QuantumCircuit(q, name="init_def")
151
+
152
+ # Convert to int since QuantumCircuit converted to complex
153
+ # and make a bit string and reverse it
154
+ intstr = f"{int(np.real(self.params[0])):0{self.num_qubits}b}"[::-1]
155
+
156
+ # Raise if number of bits is greater than num_qubits
157
+ if len(intstr) > self.num_qubits:
158
+ raise QiskitError(
159
+ f"StatePreparation integer has {len(intstr)} bits, but this exceeds the"
160
+ f" number of qubits in the circuit, {self.num_qubits}."
161
+ )
162
+
163
+ for qubit, bit in enumerate(intstr):
164
+ if bit == "1":
165
+ initialize_circuit.append(XGate(), [q[qubit]])
166
+
167
+ # note: X is it's own inverse, so even if self._inverse is True,
168
+ # we don't need to invert anything
169
+ return initialize_circuit
170
+
171
+ def _define_synthesis_isom(self):
172
+ """Calculate a subcircuit that implements this initialization via isometry"""
173
+ q = QuantumRegister(self.num_qubits, "q")
174
+ initialize_circuit = QuantumCircuit(q, name="init_def")
175
+
176
+ isom = Isometry(self.params, 0, 0)
177
+ initialize_circuit.compose(isom.definition, copy=False, inplace=True)
178
+
179
+ # invert the circuit to create the desired vector from zero (assuming
180
+ # the qubits are in the zero state)
181
+ if self._inverse is True:
182
+ return initialize_circuit.inverse()
183
+
184
+ return initialize_circuit
185
+
186
+ def _get_num_qubits(self, num_qubits, params):
187
+ """Get number of qubits needed for state preparation"""
188
+ if isinstance(params, str):
189
+ num_qubits = len(params)
190
+ elif isinstance(params, int):
191
+ if num_qubits is None:
192
+ num_qubits = int(math.log2(params)) + 1
193
+ else:
194
+ num_qubits = math.log2(len(params))
195
+
196
+ # Check if param is a power of 2
197
+ if num_qubits == 0 or not num_qubits.is_integer():
198
+ raise QiskitError("Desired statevector length not a positive power of 2.")
199
+
200
+ num_qubits = int(num_qubits)
201
+ return num_qubits
202
+
203
+ def inverse(self, annotated: bool = False):
204
+ """Return inverted StatePreparation"""
205
+
206
+ label = (
207
+ None if self._label in ("State Preparation", "State Preparation Dg") else self._label
208
+ )
209
+
210
+ return StatePreparation(self._params_arg, inverse=not self._inverse, label=label)
211
+
212
+ def broadcast_arguments(self, qargs, cargs):
213
+ flat_qargs = [qarg for sublist in qargs for qarg in sublist]
214
+
215
+ if self.num_qubits != len(flat_qargs):
216
+ raise QiskitError(
217
+ f"StatePreparation parameter vector has {2**self.num_qubits}"
218
+ f" elements, therefore expects {self.num_qubits} "
219
+ f"qubits. However, {len(flat_qargs)} were provided."
220
+ )
221
+ yield flat_qargs, []
222
+
223
+ def validate_parameter(self, parameter):
224
+ """StatePreparation instruction parameter can be str, int, float, and complex."""
225
+
226
+ # StatePreparation instruction parameter can be str
227
+ if isinstance(parameter, str):
228
+ if parameter in ["0", "1", "+", "-", "l", "r"]:
229
+ return parameter
230
+ raise CircuitError(
231
+ f"invalid param label {type(parameter)} for instruction {self.name}. Label should be "
232
+ "0, 1, +, -, l, or r "
233
+ )
234
+
235
+ # StatePreparation instruction parameter can be int, float, and complex.
236
+ if isinstance(parameter, (int, float, complex)):
237
+ return complex(parameter)
238
+ elif isinstance(parameter, np.number):
239
+ return complex(parameter.item())
240
+ else:
241
+ raise CircuitError(f"invalid param type {type(parameter)} for instruction {self.name}")
242
+
243
+ def _return_repeat(self, exponent: float) -> "Gate":
244
+ return Gate(name=f"{self.name}*{exponent}", num_qubits=self.num_qubits, params=[])
245
+
246
+
247
+ class UniformSuperpositionGate(Gate):
248
+ r"""Implements a uniform superposition state.
249
+
250
+ This gate is used to create the uniform superposition state
251
+ :math:`\frac{1}{\sqrt{M}} \sum_{j=0}^{M-1} |j\rangle` when it acts on an input
252
+ state :math:`|0...0\rangle`. Note, that `M` is not required to be
253
+ a power of 2, in which case the uniform superposition could be
254
+ prepared by a single layer of Hadamard gates.
255
+
256
+ .. note::
257
+
258
+ This class uses the Shukla-Vedula algorithm [1], which only needs
259
+ :math:`O(\log_2 (M))` qubits and :math:`O(\log_2 (M))` gates,
260
+ to prepare the superposition.
261
+
262
+ **References:**
263
+ [1]: A. Shukla and P. Vedula (2024), An efficient quantum algorithm for preparation
264
+ of uniform quantum superposition states, `Quantum Inf Process 23, 38
265
+ <https://link.springer.com/article/10.1007/s11128-024-04258-4>`_.
266
+ """
267
+
268
+ def __init__(
269
+ self,
270
+ num_superpos_states: int = 2,
271
+ num_qubits: Optional[int] = None,
272
+ ):
273
+ r"""
274
+ Args:
275
+ num_superpos_states (int):
276
+ A positive integer M = num_superpos_states (> 1) representing the number of computational
277
+ basis states with an amplitude of 1/sqrt(M) in the uniform superposition
278
+ state (:math:`\frac{1}{\sqrt{M}} \sum_{j=0}^{M-1} |j\rangle`, where
279
+ :math:`1< M <= 2^n`). Note that the remaining (:math:`2^n - M`) computational basis
280
+ states have zero amplitudes. Here M need not be an integer power of 2.
281
+
282
+ num_qubits (int):
283
+ A positive integer representing the number of qubits used. If num_qubits is None
284
+ or is not specified, then num_qubits is set to ceil(log2(num_superpos_states)).
285
+
286
+ Raises:
287
+ ValueError: num_qubits must be an integer greater than or equal to log2(num_superpos_states).
288
+
289
+ """
290
+ if num_superpos_states <= 1:
291
+ raise ValueError("num_superpos_states must be a positive integer greater than 1.")
292
+ if num_qubits is None:
293
+ num_qubits = int(math.ceil(math.log2(num_superpos_states)))
294
+ else:
295
+ if not (isinstance(num_qubits, int) and (num_qubits >= math.log2(num_superpos_states))):
296
+ raise ValueError(
297
+ "num_qubits must be an integer greater than or equal to log2(num_superpos_states)."
298
+ )
299
+ super().__init__("USup", num_qubits, [num_superpos_states])
300
+
301
+ def _define(self):
302
+
303
+ qc = QuantumCircuit(self._num_qubits)
304
+
305
+ num_superpos_states = self.params[0]
306
+
307
+ if (
308
+ num_superpos_states & (num_superpos_states - 1)
309
+ ) == 0: # if num_superpos_states is an integer power of 2
310
+ m = int(math.log2(num_superpos_states))
311
+ qc.h(range(m))
312
+ self.definition = qc
313
+ return
314
+
315
+ n_value = [int(x) for x in reversed(np.binary_repr(num_superpos_states))]
316
+ k = len(n_value)
317
+ l_value = [index for (index, item) in enumerate(n_value) if item == 1] # Locations of '1's
318
+
319
+ qc.x(l_value[1:k])
320
+ m_current_value = 2 ** l_value[0]
321
+ theta = -2 * np.arccos(np.sqrt(m_current_value / num_superpos_states))
322
+
323
+ if l_value[0] > 0: # if num_superpos_states is even
324
+ qc.h(range(l_value[0]))
325
+ qc.ry(theta, l_value[1])
326
+ qc.ch(l_value[1], range(l_value[0], l_value[1]), ctrl_state="0")
327
+
328
+ for m in range(1, len(l_value) - 1):
329
+ theta = -2 * np.arccos(
330
+ np.sqrt(2 ** l_value[m] / (num_superpos_states - m_current_value))
331
+ )
332
+ qc.cry(theta, l_value[m], l_value[m + 1], ctrl_state="0")
333
+ qc.ch(l_value[m + 1], range(l_value[m], l_value[m + 1]), ctrl_state="0")
334
+ m_current_value = m_current_value + 2 ** l_value[m]
335
+
336
+ self.definition = qc
@@ -0,0 +1,160 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 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
+ """Fourier checking circuit."""
14
+
15
+ from collections.abc import Sequence
16
+ import math
17
+
18
+ from qiskit.circuit import QuantumCircuit
19
+ from qiskit.circuit.exceptions import CircuitError
20
+ from qiskit.utils.deprecation import deprecate_func
21
+
22
+ from .generalized_gates.diagonal import Diagonal, DiagonalGate
23
+
24
+
25
+ class FourierChecking(QuantumCircuit):
26
+ """Fourier checking circuit.
27
+
28
+ The circuit for the Fourier checking algorithm, introduced in [1],
29
+ involves a layer of Hadamards, the function :math:`f`, another layer of
30
+ Hadamards, the function :math:`g`, followed by a final layer of Hadamards.
31
+ The functions :math:`f` and :math:`g` are classical functions realized
32
+ as phase oracles (diagonal operators with {-1, 1} on the diagonal).
33
+
34
+ The probability of observing the all-zeros string is :math:`p(f,g)`.
35
+ The algorithm solves the promise Fourier checking problem,
36
+ which decides if f is correlated with the Fourier transform
37
+ of g, by testing if :math:`p(f,g) <= 0.01` or :math:`p(f,g) >= 0.05`,
38
+ promised that one or the other of these is true.
39
+
40
+ The functions :math:`f` and :math:`g` are currently implemented
41
+ from their truth tables but could be represented concisely and
42
+ implemented efficiently for special classes of functions.
43
+
44
+ Fourier checking is a special case of :math:`k`-fold forrelation [2].
45
+
46
+ **Reference:**
47
+
48
+ [1] S. Aaronson, BQP and the Polynomial Hierarchy, 2009 (Section 3.2).
49
+ `arXiv:0910.4698 <https://arxiv.org/abs/0910.4698>`_
50
+
51
+ [2] S. Aaronson, A. Ambainis, Forrelation: a problem that
52
+ optimally separates quantum from classical computing, 2014.
53
+ `arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
54
+ """
55
+
56
+ @deprecate_func(
57
+ since="2.1",
58
+ additional_msg="Use qiskit.circuit.library.fourier_checking instead.",
59
+ removal_timeline="in Qiskit 3.0",
60
+ )
61
+ def __init__(self, f: Sequence[int], g: Sequence[int]) -> None:
62
+ """Create Fourier checking circuit.
63
+
64
+ Args:
65
+ f: truth table for f, length 2**n list of {1,-1}.
66
+ g: truth table for g, length 2**n list of {1,-1}.
67
+
68
+ Raises:
69
+ CircuitError: if the inputs f and g are not valid.
70
+
71
+ Reference Circuit:
72
+ .. plot::
73
+ :alt: Diagram illustrating the previously described circuit.
74
+
75
+ from qiskit.circuit.library import FourierChecking
76
+ from qiskit.visualization.library import _generate_circuit_library_visualization
77
+ f = [1, -1, -1, -1]
78
+ g = [1, 1, -1, -1]
79
+ circuit = FourierChecking(f, g)
80
+ _generate_circuit_library_visualization(circuit)
81
+ """
82
+ num_qubits = math.log2(len(f))
83
+
84
+ if len(f) != len(g) or num_qubits == 0 or not num_qubits.is_integer():
85
+ raise CircuitError(
86
+ "The functions f and g must be given as truth "
87
+ "tables, each as a list of 2**n entries of "
88
+ "{1, -1}."
89
+ )
90
+
91
+ # This definition circuit is not replaced by the circuit produced by fourier_checking,
92
+ # as the latter produces a slightly different circuit, with DiagonalGates instead
93
+ # of Diagonal circuits.
94
+ circuit = QuantumCircuit(int(num_qubits), name=f"fc: {f}, {g}")
95
+ circuit.h(circuit.qubits)
96
+ circuit.compose(Diagonal(f), inplace=True)
97
+ circuit.h(circuit.qubits)
98
+ circuit.compose(Diagonal(g), inplace=True)
99
+ circuit.h(circuit.qubits)
100
+ super().__init__(*circuit.qregs, name=circuit.name)
101
+ self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
102
+
103
+
104
+ def fourier_checking(f: Sequence[int], g: Sequence[int]) -> QuantumCircuit:
105
+ """Fourier checking circuit.
106
+
107
+ The circuit for the Fourier checking algorithm, introduced in [1],
108
+ involves a layer of Hadamards, the function :math:`f`, another layer of
109
+ Hadamards, the function :math:`g`, followed by a final layer of Hadamards.
110
+ The functions :math:`f` and :math:`g` are classical functions realized
111
+ as phase oracles (diagonal operators with {-1, 1} on the diagonal).
112
+
113
+ The probability of observing the all-zeros string is :math:`p(f,g)`.
114
+ The algorithm solves the promise Fourier checking problem,
115
+ which decides if f is correlated with the Fourier transform
116
+ of g, by testing if :math:`p(f,g) <= 0.01` or :math:`p(f,g) >= 0.05`,
117
+ promised that one or the other of these is true.
118
+
119
+ The functions :math:`f` and :math:`g` are currently implemented
120
+ from their truth tables but could be represented concisely and
121
+ implemented efficiently for special classes of functions.
122
+
123
+ Fourier checking is a special case of :math:`k`-fold forrelation [2].
124
+
125
+ **Reference Circuit:**
126
+
127
+ .. plot::
128
+ :alt: Circuit diagram output by the previous code.
129
+ :include-source:
130
+
131
+ from qiskit.circuit.library import fourier_checking
132
+ circuit = fourier_checking([1, -1, -1, -1], [1, 1, -1, -1])
133
+ circuit.draw('mpl')
134
+
135
+ **Reference:**
136
+
137
+ [1] S. Aaronson, BQP and the Polynomial Hierarchy, 2009 (Section 3.2).
138
+ `arXiv:0910.4698 <https://arxiv.org/abs/0910.4698>`_
139
+
140
+ [2] S. Aaronson, A. Ambainis, Forrelation: a problem that
141
+ optimally separates quantum from classical computing, 2014.
142
+ `arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
143
+ """
144
+ num_qubits = math.log2(len(f))
145
+
146
+ if len(f) != len(g) or num_qubits == 0 or not num_qubits.is_integer():
147
+ raise CircuitError(
148
+ "The functions f and g must be given as truth "
149
+ "tables, each as a list of 2**n entries of "
150
+ "{1, -1}."
151
+ )
152
+ num_qubits = int(num_qubits)
153
+
154
+ circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
155
+ circuit.h(circuit.qubits)
156
+ circuit.append(DiagonalGate(f), range(num_qubits))
157
+ circuit.h(circuit.qubits)
158
+ circuit.append(DiagonalGate(g), range(num_qubits))
159
+ circuit.h(circuit.qubits)
160
+ return circuit
@@ -0,0 +1,30 @@
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 circuit library module on generalized gates."""
14
+
15
+ from .diagonal import Diagonal, DiagonalGate
16
+ from .permutation import Permutation, PermutationGate
17
+ from .mcmt import MCMT, MCMTVChain, MCMTGate
18
+ from .gms import GMS, MSGate
19
+ from .gr import GR, GRX, GRY, GRZ
20
+ from .pauli import PauliGate
21
+ from .rv import RVGate
22
+ from .linear_function import LinearFunction
23
+ from .isometry import Isometry
24
+ from .uc import UCGate
25
+ from .uc_pauli_rot import UCPauliRotGate
26
+ from .ucrx import UCRXGate
27
+ from .ucry import UCRYGate
28
+ from .ucrz import UCRZGate
29
+ from .unitary import UnitaryGate
30
+ from .mcg_up_to_diagonal import MCGupDiag
@@ -0,0 +1,163 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+
14
+ """Diagonal matrix circuit."""
15
+
16
+ from __future__ import annotations
17
+ from collections.abc import Sequence
18
+
19
+ import cmath
20
+ import math
21
+ import numpy as np
22
+
23
+ from qiskit.circuit.gate import Gate
24
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
25
+ from qiskit.circuit.exceptions import CircuitError
26
+ from qiskit.circuit.annotated_operation import AnnotatedOperation, InverseModifier
27
+ from qiskit.utils.deprecation import deprecate_func
28
+
29
+ from .ucrz import UCRZGate
30
+
31
+ _EPS = 1e-10
32
+
33
+
34
+ class Diagonal(QuantumCircuit):
35
+ """Circuit implementing a diagonal transformation."""
36
+
37
+ @deprecate_func(
38
+ since="2.1",
39
+ additional_msg="Use DiagonalGate instead.",
40
+ removal_timeline="in Qiskit 3.0",
41
+ )
42
+ def __init__(self, diag: Sequence[complex]) -> None:
43
+ r"""
44
+ Args:
45
+ diag: List of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
46
+
47
+ Raises:
48
+ CircuitError: if the list of the diagonal entries or the qubit list is in bad format;
49
+ if the number of diagonal entries is not :math:`2^k`, where :math:`k` denotes the
50
+ number of qubits.
51
+ """
52
+ DiagonalGate._check_input(diag)
53
+ num_qubits = int(math.log2(len(diag)))
54
+
55
+ super().__init__(num_qubits, name="Diagonal")
56
+ self.append(DiagonalGate(diag), self.qubits)
57
+
58
+
59
+ class DiagonalGate(Gate):
60
+ r"""A generic diagonal quantum gate.
61
+
62
+ Matrix form:
63
+
64
+ .. math::
65
+ \text{DiagonalGate}\ q_0, q_1, .., q_{n-1} =
66
+ \begin{pmatrix}
67
+ D[0] & 0 & \dots & 0 \\
68
+ 0 & D[1] & \dots & 0 \\
69
+ \vdots & \vdots & \ddots & 0 \\
70
+ 0 & 0 & \dots & D[n-1]
71
+ \end{pmatrix}
72
+
73
+ Diagonal gates are useful as representations of Boolean functions,
74
+ as they can map from :math:`\{0,1\}^{2^n}` to :math:`\{0,1\}^{2^n}` space. For example a phase
75
+ oracle can be seen as a diagonal gate with :math:`\{1, -1\}` on the diagonals. Such
76
+ an oracle will induce a :math:`+1` or :math`-1` phase on the amplitude of any corresponding
77
+ basis state.
78
+
79
+ Diagonal gates appear in many classically hard oracular problems such as
80
+ Forrelation or Hidden Shift circuits.
81
+
82
+ Diagonal gates are represented and simulated more efficiently than a dense
83
+ :math:`2^n \times 2^n` unitary matrix.
84
+
85
+ The reference implementation is via the method described in
86
+ Theorem 7 of [1]. The code is based on Emanuel Malvetti's semester thesis
87
+ at ETH in 2018, supervised by Raban Iten and Prof. Renato Renner.
88
+
89
+ **Reference:**
90
+
91
+ [1] Shende et al., Synthesis of Quantum Logic Circuits, 2009
92
+ `arXiv:0406176 <https://arxiv.org/pdf/quant-ph/0406176.pdf>`_
93
+ """
94
+
95
+ def __init__(self, diag: Sequence[complex]) -> None:
96
+ r"""
97
+ Args:
98
+ diag: list of the :math:`2^k` diagonal entries (for a diagonal gate on :math:`k` qubits).
99
+ """
100
+ self._check_input(diag)
101
+ num_qubits = int(math.log2(len(diag)))
102
+
103
+ super().__init__("diagonal", num_qubits, diag)
104
+
105
+ def _define(self):
106
+ # Since the diagonal is a unitary, all its entries have absolute value
107
+ # one and the diagonal is fully specified by the phases of its entries.
108
+ diag_phases = [cmath.phase(z) for z in self.params]
109
+ n = len(diag_phases)
110
+ circuit = QuantumCircuit(self.num_qubits)
111
+
112
+ while n >= 2:
113
+ angles_rz = []
114
+ for i in range(0, n, 2):
115
+ diag_phases[i // 2], rz_angle = _extract_rz(diag_phases[i], diag_phases[i + 1])
116
+ angles_rz.append(rz_angle)
117
+ num_act_qubits = int(math.log2(n))
118
+ ctrl_qubits = list(range(self.num_qubits - num_act_qubits + 1, self.num_qubits))
119
+ target_qubit = self.num_qubits - num_act_qubits
120
+
121
+ ucrz = UCRZGate(angles_rz)
122
+ circuit.append(ucrz, [target_qubit] + ctrl_qubits)
123
+
124
+ n //= 2
125
+ circuit.global_phase += diag_phases[0]
126
+
127
+ self.definition = circuit
128
+
129
+ def validate_parameter(self, parameter):
130
+ """Diagonal Gate parameter should accept complex
131
+ (in addition to the Gate parameter types) and always return build-in complex."""
132
+ if isinstance(parameter, complex):
133
+ return complex(parameter)
134
+ else:
135
+ return complex(super().validate_parameter(parameter))
136
+
137
+ def inverse(self, annotated: bool = False):
138
+ """Return the inverse of the diagonal gate."""
139
+ if annotated:
140
+ return AnnotatedOperation(self.copy(), InverseModifier)
141
+
142
+ return DiagonalGate([np.conj(entry) for entry in self.params])
143
+
144
+ @staticmethod
145
+ def _check_input(diag):
146
+ """Check if ``diag`` is in valid format."""
147
+ if not isinstance(diag, (list, np.ndarray)):
148
+ raise CircuitError("Diagonal entries must be in a list or numpy array.")
149
+ num_qubits = math.log2(len(diag))
150
+ if num_qubits < 1 or not num_qubits.is_integer():
151
+ raise CircuitError("The number of diagonal entries is not a positive power of 2.")
152
+ if not np.allclose(np.abs(diag), 1, atol=_EPS):
153
+ raise CircuitError("A diagonal element does not have absolute value one.")
154
+
155
+
156
+ def _extract_rz(phi1, phi2):
157
+ """
158
+ Extract a Rz rotation (angle given by first output) such that exp(j*phase)*Rz(z_angle)
159
+ is equal to the diagonal matrix with entires exp(1j*ph1) and exp(1j*ph2).
160
+ """
161
+ phase = (phi1 + phi2) / 2.0
162
+ z_angle = phi2 - phi1
163
+ return phase, z_angle