qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +141 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1343 -0
  6. qiskit/circuit/_add_control.py +312 -0
  7. qiskit/circuit/_classical_resource_map.py +150 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/barrier.py +46 -0
  12. qiskit/circuit/classical/__init__.py +41 -0
  13. qiskit/circuit/classical/expr/__init__.py +266 -0
  14. qiskit/circuit/classical/expr/constructors.py +764 -0
  15. qiskit/circuit/classical/expr/expr.py +498 -0
  16. qiskit/circuit/classical/expr/visitors.py +375 -0
  17. qiskit/circuit/classical/types/__init__.py +113 -0
  18. qiskit/circuit/classical/types/ordering.py +229 -0
  19. qiskit/circuit/classical/types/types.py +153 -0
  20. qiskit/circuit/commutation_checker.py +133 -0
  21. qiskit/circuit/commutation_library.py +20 -0
  22. qiskit/circuit/controlflow/__init__.py +59 -0
  23. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  24. qiskit/circuit/controlflow/box.py +163 -0
  25. qiskit/circuit/controlflow/break_loop.py +56 -0
  26. qiskit/circuit/controlflow/builder.py +791 -0
  27. qiskit/circuit/controlflow/continue_loop.py +56 -0
  28. qiskit/circuit/controlflow/control_flow.py +94 -0
  29. qiskit/circuit/controlflow/for_loop.py +218 -0
  30. qiskit/circuit/controlflow/if_else.py +498 -0
  31. qiskit/circuit/controlflow/switch_case.py +411 -0
  32. qiskit/circuit/controlflow/while_loop.py +166 -0
  33. qiskit/circuit/controlledgate.py +274 -0
  34. qiskit/circuit/delay.py +157 -0
  35. qiskit/circuit/duration.py +80 -0
  36. qiskit/circuit/equivalence.py +94 -0
  37. qiskit/circuit/equivalence_library.py +18 -0
  38. qiskit/circuit/exceptions.py +19 -0
  39. qiskit/circuit/gate.py +261 -0
  40. qiskit/circuit/instruction.py +564 -0
  41. qiskit/circuit/instructionset.py +132 -0
  42. qiskit/circuit/library/__init__.py +984 -0
  43. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  44. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  45. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  46. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  47. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  48. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  49. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  50. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  51. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  52. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  53. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  54. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  55. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  56. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  57. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  58. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
  59. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
  60. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
  61. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  62. qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
  63. qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
  64. qiskit/circuit/library/basis_change/__init__.py +15 -0
  65. qiskit/circuit/library/basis_change/qft.py +316 -0
  66. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  67. qiskit/circuit/library/blueprintcircuit.py +316 -0
  68. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  69. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  70. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  71. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  72. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  73. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  74. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  75. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  76. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  77. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  78. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  79. qiskit/circuit/library/fourier_checking.py +160 -0
  80. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  81. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  82. qiskit/circuit/library/generalized_gates/gms.py +175 -0
  83. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  84. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  85. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  86. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  87. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  88. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  89. qiskit/circuit/library/generalized_gates/permutation.py +198 -0
  90. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  91. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  92. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  93. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  94. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  96. qiskit/circuit/library/generalized_gates/unitary.py +217 -0
  97. qiskit/circuit/library/graph_state.py +172 -0
  98. qiskit/circuit/library/grover_operator.py +583 -0
  99. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  100. qiskit/circuit/library/hidden_linear_function.py +163 -0
  101. qiskit/circuit/library/iqp.py +180 -0
  102. qiskit/circuit/library/n_local/__init__.py +45 -0
  103. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  104. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  105. qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
  106. qiskit/circuit/library/n_local/n_local.py +1477 -0
  107. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  108. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  109. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  110. qiskit/circuit/library/n_local/two_local.py +289 -0
  111. qiskit/circuit/library/overlap.py +183 -0
  112. qiskit/circuit/library/pauli_evolution.py +201 -0
  113. qiskit/circuit/library/phase_estimation.py +177 -0
  114. qiskit/circuit/library/phase_oracle.py +239 -0
  115. qiskit/circuit/library/quantum_volume.py +180 -0
  116. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  117. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  118. qiskit/circuit/library/standard_gates/ecr.py +129 -0
  119. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  120. qiskit/circuit/library/standard_gates/global_phase.py +84 -0
  121. qiskit/circuit/library/standard_gates/h.py +253 -0
  122. qiskit/circuit/library/standard_gates/i.py +76 -0
  123. qiskit/circuit/library/standard_gates/iswap.py +133 -0
  124. qiskit/circuit/library/standard_gates/p.py +422 -0
  125. qiskit/circuit/library/standard_gates/r.py +114 -0
  126. qiskit/circuit/library/standard_gates/rx.py +293 -0
  127. qiskit/circuit/library/standard_gates/rxx.py +180 -0
  128. qiskit/circuit/library/standard_gates/ry.py +286 -0
  129. qiskit/circuit/library/standard_gates/ryy.py +180 -0
  130. qiskit/circuit/library/standard_gates/rz.py +307 -0
  131. qiskit/circuit/library/standard_gates/rzx.py +226 -0
  132. qiskit/circuit/library/standard_gates/rzz.py +193 -0
  133. qiskit/circuit/library/standard_gates/s.py +419 -0
  134. qiskit/circuit/library/standard_gates/swap.py +281 -0
  135. qiskit/circuit/library/standard_gates/sx.py +310 -0
  136. qiskit/circuit/library/standard_gates/t.py +178 -0
  137. qiskit/circuit/library/standard_gates/u.py +395 -0
  138. qiskit/circuit/library/standard_gates/u1.py +490 -0
  139. qiskit/circuit/library/standard_gates/u2.py +145 -0
  140. qiskit/circuit/library/standard_gates/u3.py +428 -0
  141. qiskit/circuit/library/standard_gates/x.py +1481 -0
  142. qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
  143. qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
  144. qiskit/circuit/library/standard_gates/y.py +257 -0
  145. qiskit/circuit/library/standard_gates/z.py +338 -0
  146. qiskit/circuit/library/templates/__init__.py +92 -0
  147. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  148. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  153. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  157. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  158. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  163. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  166. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  167. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  170. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  175. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  179. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  214. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  215. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  216. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  217. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  218. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  221. qiskit/circuit/measure.py +53 -0
  222. qiskit/circuit/operation.py +68 -0
  223. qiskit/circuit/parameter.py +179 -0
  224. qiskit/circuit/parameterexpression.py +703 -0
  225. qiskit/circuit/parametertable.py +119 -0
  226. qiskit/circuit/parametervector.py +140 -0
  227. qiskit/circuit/quantumcircuit.py +7540 -0
  228. qiskit/circuit/quantumcircuitdata.py +136 -0
  229. qiskit/circuit/random/__init__.py +15 -0
  230. qiskit/circuit/random/utils.py +366 -0
  231. qiskit/circuit/reset.py +37 -0
  232. qiskit/circuit/singleton.py +600 -0
  233. qiskit/circuit/store.py +89 -0
  234. qiskit/circuit/tools/__init__.py +16 -0
  235. qiskit/circuit/tools/pi_check.py +193 -0
  236. qiskit/circuit/twirling.py +145 -0
  237. qiskit/compiler/__init__.py +27 -0
  238. qiskit/compiler/transpiler.py +375 -0
  239. qiskit/converters/__init__.py +74 -0
  240. qiskit/converters/circuit_to_dag.py +80 -0
  241. qiskit/converters/circuit_to_dagdependency.py +49 -0
  242. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  243. qiskit/converters/circuit_to_gate.py +107 -0
  244. qiskit/converters/circuit_to_instruction.py +142 -0
  245. qiskit/converters/dag_to_circuit.py +79 -0
  246. qiskit/converters/dag_to_dagdependency.py +54 -0
  247. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  248. qiskit/converters/dagdependency_to_circuit.py +40 -0
  249. qiskit/converters/dagdependency_to_dag.py +48 -0
  250. qiskit/dagcircuit/__init__.py +55 -0
  251. qiskit/dagcircuit/collect_blocks.py +407 -0
  252. qiskit/dagcircuit/dagcircuit.py +24 -0
  253. qiskit/dagcircuit/dagdependency.py +612 -0
  254. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  255. qiskit/dagcircuit/dagdepnode.py +160 -0
  256. qiskit/dagcircuit/dagnode.py +188 -0
  257. qiskit/dagcircuit/exceptions.py +42 -0
  258. qiskit/exceptions.py +153 -0
  259. qiskit/passmanager/__init__.py +258 -0
  260. qiskit/passmanager/base_tasks.py +230 -0
  261. qiskit/passmanager/compilation_status.py +74 -0
  262. qiskit/passmanager/exceptions.py +19 -0
  263. qiskit/passmanager/flow_controllers.py +116 -0
  264. qiskit/passmanager/passmanager.py +353 -0
  265. qiskit/primitives/__init__.py +490 -0
  266. qiskit/primitives/backend_estimator_v2.py +530 -0
  267. qiskit/primitives/backend_sampler_v2.py +339 -0
  268. qiskit/primitives/base/__init__.py +20 -0
  269. qiskit/primitives/base/base_estimator.py +247 -0
  270. qiskit/primitives/base/base_primitive_job.py +78 -0
  271. qiskit/primitives/base/base_primitive_v1.py +45 -0
  272. qiskit/primitives/base/base_result_v1.py +65 -0
  273. qiskit/primitives/base/base_sampler.py +196 -0
  274. qiskit/primitives/base/estimator_result_v1.py +46 -0
  275. qiskit/primitives/base/sampler_result_v1.py +45 -0
  276. qiskit/primitives/base/validation_v1.py +250 -0
  277. qiskit/primitives/containers/__init__.py +26 -0
  278. qiskit/primitives/containers/bindings_array.py +391 -0
  279. qiskit/primitives/containers/bit_array.py +764 -0
  280. qiskit/primitives/containers/data_bin.py +175 -0
  281. qiskit/primitives/containers/estimator_pub.py +222 -0
  282. qiskit/primitives/containers/object_array.py +94 -0
  283. qiskit/primitives/containers/observables_array.py +296 -0
  284. qiskit/primitives/containers/primitive_result.py +53 -0
  285. qiskit/primitives/containers/pub_result.py +51 -0
  286. qiskit/primitives/containers/sampler_pub.py +193 -0
  287. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  288. qiskit/primitives/containers/shape.py +129 -0
  289. qiskit/primitives/primitive_job.py +81 -0
  290. qiskit/primitives/statevector_estimator.py +175 -0
  291. qiskit/primitives/statevector_sampler.py +290 -0
  292. qiskit/primitives/utils.py +72 -0
  293. qiskit/providers/__init__.py +677 -0
  294. qiskit/providers/backend.py +364 -0
  295. qiskit/providers/basic_provider/__init__.py +47 -0
  296. qiskit/providers/basic_provider/basic_provider.py +121 -0
  297. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  298. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  299. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  300. qiskit/providers/basic_provider/exceptions.py +30 -0
  301. qiskit/providers/exceptions.py +33 -0
  302. qiskit/providers/fake_provider/__init__.py +69 -0
  303. qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
  304. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  305. qiskit/providers/job.py +147 -0
  306. qiskit/providers/jobstatus.py +30 -0
  307. qiskit/providers/options.py +273 -0
  308. qiskit/providers/providerutils.py +110 -0
  309. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  310. qiskit/qasm/libs/qelib1.inc +266 -0
  311. qiskit/qasm/libs/stdgates.inc +82 -0
  312. qiskit/qasm2/__init__.py +669 -0
  313. qiskit/qasm2/exceptions.py +27 -0
  314. qiskit/qasm2/export.py +364 -0
  315. qiskit/qasm2/parse.py +438 -0
  316. qiskit/qasm3/__init__.py +372 -0
  317. qiskit/qasm3/ast.py +782 -0
  318. qiskit/qasm3/exceptions.py +27 -0
  319. qiskit/qasm3/experimental.py +70 -0
  320. qiskit/qasm3/exporter.py +1340 -0
  321. qiskit/qasm3/printer.py +608 -0
  322. qiskit/qpy/__init__.py +1965 -0
  323. qiskit/qpy/binary_io/__init__.py +35 -0
  324. qiskit/qpy/binary_io/circuits.py +1455 -0
  325. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  326. qiskit/qpy/binary_io/schedules.py +308 -0
  327. qiskit/qpy/binary_io/value.py +1165 -0
  328. qiskit/qpy/common.py +353 -0
  329. qiskit/qpy/exceptions.py +53 -0
  330. qiskit/qpy/formats.py +442 -0
  331. qiskit/qpy/interface.py +344 -0
  332. qiskit/qpy/type_keys.py +409 -0
  333. qiskit/quantum_info/__init__.py +162 -0
  334. qiskit/quantum_info/analysis/__init__.py +17 -0
  335. qiskit/quantum_info/analysis/average.py +47 -0
  336. qiskit/quantum_info/analysis/distance.py +104 -0
  337. qiskit/quantum_info/analysis/make_observable.py +44 -0
  338. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  339. qiskit/quantum_info/operators/__init__.py +28 -0
  340. qiskit/quantum_info/operators/base_operator.py +145 -0
  341. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  342. qiskit/quantum_info/operators/channel/chi.py +191 -0
  343. qiskit/quantum_info/operators/channel/choi.py +218 -0
  344. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  345. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  346. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  347. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  348. qiskit/quantum_info/operators/channel/superop.py +373 -0
  349. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  350. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  351. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  352. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  354. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  355. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  356. qiskit/quantum_info/operators/linear_op.py +25 -0
  357. qiskit/quantum_info/operators/measures.py +418 -0
  358. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  359. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  360. qiskit/quantum_info/operators/mixins/group.py +171 -0
  361. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  362. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  363. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  364. qiskit/quantum_info/operators/op_shape.py +525 -0
  365. qiskit/quantum_info/operators/operator.py +869 -0
  366. qiskit/quantum_info/operators/operator_utils.py +76 -0
  367. qiskit/quantum_info/operators/predicates.py +183 -0
  368. qiskit/quantum_info/operators/random.py +154 -0
  369. qiskit/quantum_info/operators/scalar_op.py +254 -0
  370. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  371. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  372. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  373. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  374. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  375. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  377. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  378. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  379. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  380. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  381. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  383. qiskit/quantum_info/quaternion.py +156 -0
  384. qiskit/quantum_info/random.py +26 -0
  385. qiskit/quantum_info/states/__init__.py +28 -0
  386. qiskit/quantum_info/states/densitymatrix.py +857 -0
  387. qiskit/quantum_info/states/measures.py +288 -0
  388. qiskit/quantum_info/states/quantum_state.py +503 -0
  389. qiskit/quantum_info/states/random.py +157 -0
  390. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  391. qiskit/quantum_info/states/statevector.py +977 -0
  392. qiskit/quantum_info/states/utils.py +247 -0
  393. qiskit/result/__init__.py +61 -0
  394. qiskit/result/counts.py +189 -0
  395. qiskit/result/distributions/__init__.py +17 -0
  396. qiskit/result/distributions/probability.py +100 -0
  397. qiskit/result/distributions/quasi.py +154 -0
  398. qiskit/result/exceptions.py +40 -0
  399. qiskit/result/models.py +241 -0
  400. qiskit/result/postprocess.py +239 -0
  401. qiskit/result/result.py +385 -0
  402. qiskit/result/sampled_expval.py +74 -0
  403. qiskit/result/utils.py +294 -0
  404. qiskit/synthesis/__init__.py +240 -0
  405. qiskit/synthesis/arithmetic/__init__.py +18 -0
  406. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  407. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  408. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  409. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  410. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  411. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  412. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  413. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  414. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  415. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  416. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  417. qiskit/synthesis/boolean/__init__.py +13 -0
  418. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  419. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  420. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  421. qiskit/synthesis/clifford/__init__.py +19 -0
  422. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  423. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  424. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  425. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  426. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  427. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  428. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  429. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  431. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  432. qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
  433. qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +120 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +313 -0
  442. qiskit/synthesis/evolution/qdrift.py +130 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +25 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +288 -0
  495. qiskit/transpiler/__init__.py +1345 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +281 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +276 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +177 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  556. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  557. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  558. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  559. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  560. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  561. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  562. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  563. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  564. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  565. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  566. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  567. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
  569. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  570. qiskit/transpiler/passes/routing/__init__.py +21 -0
  571. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  572. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  573. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  574. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  575. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  576. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  581. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  582. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  583. qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
  584. qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
  585. qiskit/transpiler/passes/routing/utils.py +35 -0
  586. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  587. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  588. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  589. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  590. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  591. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  592. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  593. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  594. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  595. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  599. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  600. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  601. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  602. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  603. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  604. qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
  605. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  606. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  607. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
  608. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  609. qiskit/transpiler/passes/utils/__init__.py +32 -0
  610. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  611. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  612. qiskit/transpiler/passes/utils/check_map.py +78 -0
  613. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  614. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  615. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  616. qiskit/transpiler/passes/utils/error.py +69 -0
  617. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  618. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  619. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  620. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  621. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  622. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  623. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  624. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  625. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  626. qiskit/transpiler/passmanager.py +503 -0
  627. qiskit/transpiler/passmanager_config.py +151 -0
  628. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  629. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
  630. qiskit/transpiler/preset_passmanagers/common.py +672 -0
  631. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
  632. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  633. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  634. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  635. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  636. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  637. qiskit/transpiler/target.py +905 -0
  638. qiskit/transpiler/timing_constraints.py +59 -0
  639. qiskit/user_config.py +266 -0
  640. qiskit/utils/__init__.py +90 -0
  641. qiskit/utils/classtools.py +146 -0
  642. qiskit/utils/deprecation.py +382 -0
  643. qiskit/utils/lazy_tester.py +363 -0
  644. qiskit/utils/optionals.py +354 -0
  645. qiskit/utils/parallel.py +318 -0
  646. qiskit/utils/units.py +146 -0
  647. qiskit/version.py +84 -0
  648. qiskit/visualization/__init__.py +290 -0
  649. qiskit/visualization/array.py +207 -0
  650. qiskit/visualization/bloch.py +778 -0
  651. qiskit/visualization/circuit/__init__.py +15 -0
  652. qiskit/visualization/circuit/_utils.py +675 -0
  653. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  654. qiskit/visualization/circuit/latex.py +661 -0
  655. qiskit/visualization/circuit/matplotlib.py +2019 -0
  656. qiskit/visualization/circuit/qcstyle.py +278 -0
  657. qiskit/visualization/circuit/styles/__init__.py +13 -0
  658. qiskit/visualization/circuit/styles/bw.json +202 -0
  659. qiskit/visualization/circuit/styles/clifford.json +202 -0
  660. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  661. qiskit/visualization/circuit/styles/iqp.json +214 -0
  662. qiskit/visualization/circuit/styles/textbook.json +202 -0
  663. qiskit/visualization/circuit/text.py +1849 -0
  664. qiskit/visualization/circuit_visualization.py +19 -0
  665. qiskit/visualization/counts_visualization.py +487 -0
  666. qiskit/visualization/dag_visualization.py +318 -0
  667. qiskit/visualization/exceptions.py +21 -0
  668. qiskit/visualization/gate_map.py +1424 -0
  669. qiskit/visualization/library.py +40 -0
  670. qiskit/visualization/pass_manager_visualization.py +312 -0
  671. qiskit/visualization/state_visualization.py +1546 -0
  672. qiskit/visualization/timeline/__init__.py +21 -0
  673. qiskit/visualization/timeline/core.py +495 -0
  674. qiskit/visualization/timeline/drawings.py +260 -0
  675. qiskit/visualization/timeline/generators.py +506 -0
  676. qiskit/visualization/timeline/interface.py +444 -0
  677. qiskit/visualization/timeline/layouts.py +115 -0
  678. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  679. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  680. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  681. qiskit/visualization/timeline/stylesheet.py +301 -0
  682. qiskit/visualization/timeline/types.py +148 -0
  683. qiskit/visualization/transition_visualization.py +369 -0
  684. qiskit/visualization/utils.py +49 -0
  685. qiskit-2.0.3.dist-info/METADATA +220 -0
  686. qiskit-2.0.3.dist-info/RECORD +690 -0
  687. qiskit-2.0.3.dist-info/WHEEL +6 -0
  688. qiskit-2.0.3.dist-info/entry_points.txt +82 -0
  689. qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
  690. qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,116 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+ """Base classes for an approximate circuit definition."""
13
+ from __future__ import annotations
14
+ from abc import ABC, abstractmethod
15
+ from typing import Optional, SupportsFloat
16
+ import numpy as np
17
+
18
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
19
+
20
+
21
+ class ApproximateCircuit(QuantumCircuit, ABC):
22
+ """A base class that represents an approximate circuit."""
23
+
24
+ def __init__(self, num_qubits: int, name: Optional[str] = None) -> None:
25
+ """
26
+ Args:
27
+ num_qubits: number of qubit this circuit will span.
28
+ name: a name of the circuit.
29
+ """
30
+ super().__init__(num_qubits, name=name)
31
+
32
+ @property
33
+ @abstractmethod
34
+ def thetas(self) -> np.ndarray:
35
+ """
36
+ The property is not implemented and raises a ``NotImplementedException`` exception.
37
+
38
+ Returns:
39
+ a vector of parameters of this circuit.
40
+ """
41
+ raise NotImplementedError
42
+
43
+ @abstractmethod
44
+ def build(self, thetas: np.ndarray) -> None:
45
+ """
46
+ Constructs this circuit out of the parameters(thetas). Parameter values must be set before
47
+ constructing the circuit.
48
+
49
+ Args:
50
+ thetas: a vector of parameters to be set in this circuit.
51
+ """
52
+ raise NotImplementedError
53
+
54
+
55
+ class ApproximatingObjective(ABC):
56
+ """
57
+ A base class for an optimization problem definition. An implementing class must provide at least
58
+ an implementation of the ``objective`` method. In such case only gradient free optimizers can
59
+ be used. Both method, ``objective`` and ``gradient``, preferable to have in an implementation.
60
+ """
61
+
62
+ def __init__(self) -> None:
63
+ # must be set before optimization
64
+ self._target_matrix: np.ndarray | None = None
65
+
66
+ @abstractmethod
67
+ def objective(self, param_values: np.ndarray) -> SupportsFloat:
68
+ """
69
+ Computes a value of the objective function given a vector of parameter values.
70
+
71
+ Args:
72
+ param_values: a vector of parameter values for the optimization problem.
73
+
74
+ Returns:
75
+ a float value of the objective function.
76
+ """
77
+ raise NotImplementedError
78
+
79
+ @abstractmethod
80
+ def gradient(self, param_values: np.ndarray) -> np.ndarray:
81
+ """
82
+ Computes a gradient with respect to parameters given a vector of parameter values.
83
+
84
+ Args:
85
+ param_values: a vector of parameter values for the optimization problem.
86
+
87
+ Returns:
88
+ an array of gradient values.
89
+ """
90
+ raise NotImplementedError
91
+
92
+ @property
93
+ def target_matrix(self) -> np.ndarray:
94
+ """
95
+ Returns:
96
+ a matrix being approximated
97
+ """
98
+ return self._target_matrix
99
+
100
+ @target_matrix.setter
101
+ def target_matrix(self, target_matrix: np.ndarray) -> None:
102
+ """
103
+ Args:
104
+ target_matrix: a matrix to approximate in the optimization procedure.
105
+ """
106
+ self._target_matrix = target_matrix
107
+
108
+ @property
109
+ @abstractmethod
110
+ def num_thetas(self) -> int:
111
+ """
112
+
113
+ Returns:
114
+ the number of parameters in this optimization problem.
115
+ """
116
+ raise NotImplementedError
@@ -0,0 +1,175 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022, 2023.
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
+ """A generic implementation of Approximate Quantum Compiler."""
13
+ from __future__ import annotations
14
+
15
+ import typing
16
+ from functools import partial
17
+
18
+ from collections.abc import Callable
19
+ from typing import Protocol
20
+
21
+ import numpy as np
22
+
23
+ from qiskit.quantum_info import Operator
24
+
25
+ from .approximate import ApproximateCircuit, ApproximatingObjective
26
+
27
+ if typing.TYPE_CHECKING:
28
+ import scipy.optimize
29
+
30
+
31
+ class Minimizer(Protocol):
32
+ """Callable Protocol for minimizer.
33
+
34
+ This interface is based on `SciPy's optimize module
35
+ <https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html>`__.
36
+
37
+ This protocol defines a callable taking the following parameters:
38
+
39
+ fun
40
+ The objective function to minimize.
41
+ x0
42
+ The initial point for the optimization.
43
+ jac
44
+ The gradient of the objective function.
45
+ bounds
46
+ Parameters bounds for the optimization. Note that these might not be supported
47
+ by all optimizers.
48
+
49
+ and which returns a SciPy minimization result object.
50
+ """
51
+
52
+ def __call__(
53
+ self,
54
+ fun: Callable[[np.ndarray], float],
55
+ x0: np.ndarray, # pylint: disable=invalid-name
56
+ jac: Callable[[np.ndarray], np.ndarray] | None = None,
57
+ bounds: list[tuple[float, float]] | None = None,
58
+ ) -> scipy.optimize.OptimizeResult:
59
+ """Minimize the objective function.
60
+
61
+ This interface is based on `SciPy's optimize module <https://docs.scipy.org/doc
62
+ /scipy/reference/generated/scipy.optimize.minimize.html>`__.
63
+
64
+ Args:
65
+ fun: The objective function to minimize.
66
+ x0: The initial point for the optimization.
67
+ jac: The gradient of the objective function.
68
+ bounds: Parameters bounds for the optimization. Note that these might not be supported
69
+ by all optimizers.
70
+
71
+ Returns:
72
+ The SciPy minimization result object.
73
+ """
74
+ ... # pylint: disable=unnecessary-ellipsis
75
+
76
+
77
+ class AQC:
78
+ """
79
+ A generic implementation of the Approximate Quantum Compiler. This implementation is agnostic of
80
+ the underlying implementation of the approximate circuit, objective, and optimizer. Users may
81
+ pass corresponding implementations of the abstract classes:
82
+
83
+ * The *optimizer* is an implementation of the :class:`~.Minimizer` protocol, a callable used to run
84
+ the optimization process. The choice of optimizer may affect overall convergence, required time
85
+ for the optimization process and achieved objective value.
86
+
87
+ * The *approximate circuit* represents a template which parameters we want to optimize. Currently,
88
+ there's only one implementation based on 4-rotations CNOT unit blocks:
89
+ :class:`.CNOTUnitCircuit`. See the paper for more details.
90
+
91
+ * The *approximate objective* is tightly coupled with the approximate circuit implementation and
92
+ provides two methods for computing objective function and gradient with respect to approximate
93
+ circuit parameters. This objective is passed to the optimizer. Currently, there are two
94
+ implementations based on 4-rotations CNOT unit blocks: :class:`.DefaultCNOTUnitObjective` and
95
+ its accelerated version :class:`.FastCNOTUnitObjective`. Both implementations share the same
96
+ idea of maximization the Hilbert-Schmidt product between the target matrix and its
97
+ approximation. The former implementation approach should be considered as a baseline one. It
98
+ may suffer from performance issues, and is mostly suitable for a small number of qubits
99
+ (up to 5 or 6), whereas the latter, accelerated one, can be applied to larger problems.
100
+
101
+ * One should take into consideration the exponential growth of matrix size with the number of
102
+ qubits because the implementation not only creates a potentially large target matrix, but
103
+ also allocates a number of temporary memory buffers comparable in size to the target matrix.
104
+ """
105
+
106
+ def __init__(
107
+ self,
108
+ optimizer: Minimizer | None = None,
109
+ seed: int | None = None,
110
+ ):
111
+ """
112
+ Args:
113
+ optimizer: an optimizer to be used in the optimization procedure of the search for
114
+ the best approximate circuit. By default, the scipy minimizer with the
115
+ ``L-BFGS-B`` method is used with max iterations set to 1000.
116
+ seed: a seed value to be used by a random number generator.
117
+ """
118
+ import scipy.optimize
119
+
120
+ super().__init__()
121
+ self._optimizer = optimizer or partial(
122
+ scipy.optimize.minimize, args=(), method="L-BFGS-B", options={"maxiter": 1000}
123
+ )
124
+
125
+ self._seed = seed
126
+
127
+ def compile_unitary(
128
+ self,
129
+ target_matrix: np.ndarray,
130
+ approximate_circuit: ApproximateCircuit,
131
+ approximating_objective: ApproximatingObjective,
132
+ initial_point: np.ndarray | None = None,
133
+ ) -> None:
134
+ """
135
+ Approximately compiles a circuit represented as a unitary matrix by solving an optimization
136
+ problem defined by ``approximating_objective`` and using ``approximate_circuit`` as a
137
+ template for the approximate circuit.
138
+
139
+ Args:
140
+ target_matrix: a unitary matrix to approximate.
141
+ approximate_circuit: a template circuit that will be filled with the parameter values
142
+ obtained in the optimization procedure.
143
+ approximating_objective: a definition of the optimization problem.
144
+ initial_point: initial values of angles/parameters to start optimization from.
145
+ """
146
+ matrix_dim = target_matrix.shape[0]
147
+ # check if it is actually a special unitary matrix
148
+ target_det = np.linalg.det(target_matrix)
149
+ if not np.isclose(target_det, 1):
150
+ su_matrix = target_matrix / np.power(target_det, (1 / matrix_dim), dtype=complex)
151
+ global_phase_required = True
152
+ else:
153
+ su_matrix = target_matrix
154
+ global_phase_required = False
155
+
156
+ # set the matrix to approximate in the algorithm
157
+ approximating_objective.target_matrix = su_matrix
158
+
159
+ if initial_point is None:
160
+ np.random.seed(self._seed)
161
+ initial_point = np.random.uniform(0, 2 * np.pi, approximating_objective.num_thetas)
162
+
163
+ opt_result = self._optimizer(
164
+ fun=approximating_objective.objective,
165
+ x0=initial_point,
166
+ jac=approximating_objective.gradient,
167
+ )
168
+
169
+ approximate_circuit.build(opt_result.x)
170
+
171
+ approx_matrix = Operator(approximate_circuit).data
172
+
173
+ if global_phase_required:
174
+ alpha = np.angle(np.trace(np.dot(approx_matrix.conj().T, target_matrix)))
175
+ approximate_circuit.global_phase = alpha
@@ -0,0 +1,300 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+ """
13
+ These are the CNOT structure methods: anything that you need for creating CNOT structures.
14
+ """
15
+ import logging
16
+ import math
17
+
18
+ import numpy as np
19
+
20
+ _NETWORK_LAYOUTS = ["sequ", "spin", "cart", "cyclic_spin", "cyclic_line"]
21
+ _CONNECTIVITY_TYPES = ["full", "line", "star"]
22
+
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ def _lower_limit(num_qubits: int) -> int:
28
+ """
29
+ Returns lower limit on the number of CNOT units that guarantees exact representation of
30
+ a unitary operator by quantum gates.
31
+
32
+ Args:
33
+ num_qubits: number of qubits.
34
+
35
+ Returns:
36
+ lower limit on the number of CNOT units.
37
+ """
38
+ num_cnots = math.ceil((4**num_qubits - 3 * num_qubits - 1) / 4.0)
39
+ return num_cnots
40
+
41
+
42
+ def make_cnot_network(
43
+ num_qubits: int,
44
+ network_layout: str = "spin",
45
+ connectivity_type: str = "full",
46
+ depth: int = 0,
47
+ ) -> np.ndarray:
48
+ """
49
+ Generates a network consisting of building blocks each containing a CNOT gate and possibly some
50
+ single-qubit ones. This network models a quantum operator in question. Note, each building
51
+ block has 2 input and outputs corresponding to a pair of qubits. What we actually return here
52
+ is a chain of indices of qubit pairs shared by every building block in a row.
53
+
54
+ Args:
55
+ num_qubits: number of qubits.
56
+ network_layout: type of network geometry, ``{"sequ", "spin", "cart", "cyclic_spin",
57
+ "cyclic_line"}``.
58
+ connectivity_type: type of inter-qubit connectivity, ``{"full", "line", "star"}``.
59
+ depth: depth of the CNOT-network, i.e. the number of layers, where each layer consists of
60
+ a single CNOT-block; default value will be selected, if ``L <= 0``.
61
+
62
+ Returns:
63
+ A matrix of size ``(2, N)`` matrix that defines layers in cnot-network, where ``N``
64
+ is either equal ``L``, or defined by a concrete type of the network.
65
+
66
+ Raises:
67
+ ValueError: if unsupported type of CNOT-network layout or number of qubits or combination
68
+ of parameters are passed.
69
+ """
70
+ if num_qubits < 2:
71
+ raise ValueError("Number of qubits must be greater or equal to 2")
72
+
73
+ if depth <= 0:
74
+ new_depth = _lower_limit(num_qubits)
75
+ logger.debug(
76
+ "Number of CNOT units chosen as the lower limit: %d, got a non-positive value: %d",
77
+ new_depth,
78
+ depth,
79
+ )
80
+ depth = new_depth
81
+
82
+ if network_layout == "sequ":
83
+ links = _get_connectivity(num_qubits=num_qubits, connectivity=connectivity_type)
84
+ return _sequential_network(num_qubits=num_qubits, links=links, depth=depth)
85
+
86
+ elif network_layout == "spin":
87
+ return _spin_network(num_qubits=num_qubits, depth=depth)
88
+
89
+ elif network_layout == "cart":
90
+ cnots = _cartan_network(num_qubits=num_qubits)
91
+ logger.debug(
92
+ "Optimal lower bound: %d; Cartan CNOTs: %d", _lower_limit(num_qubits), cnots.shape[1]
93
+ )
94
+ return cnots
95
+
96
+ elif network_layout == "cyclic_spin":
97
+ if connectivity_type != "full":
98
+ raise ValueError(f"'{network_layout}' layout expects 'full' connectivity")
99
+
100
+ return _cyclic_spin_network(num_qubits, depth)
101
+
102
+ elif network_layout == "cyclic_line":
103
+ if connectivity_type != "line":
104
+ raise ValueError(f"'{network_layout}' layout expects 'line' connectivity")
105
+
106
+ return _cyclic_line_network(num_qubits, depth)
107
+ else:
108
+ raise ValueError(
109
+ f"Unknown type of CNOT-network layout, expects one of {_NETWORK_LAYOUTS}, "
110
+ f"got {network_layout}"
111
+ )
112
+
113
+
114
+ def _get_connectivity(num_qubits: int, connectivity: str) -> dict:
115
+ """
116
+ Generates connectivity structure between qubits.
117
+
118
+ Args:
119
+ num_qubits: number of qubits.
120
+ connectivity: type of connectivity structure, ``{"full", "line", "star"}``.
121
+
122
+ Returns:
123
+ dictionary of allowed links between qubits.
124
+
125
+ Raises:
126
+ ValueError: if unsupported type of CNOT-network layout is passed.
127
+ """
128
+ if num_qubits == 1:
129
+ links = {0: [0]}
130
+
131
+ elif connectivity == "full":
132
+ # Full connectivity between qubits.
133
+ links = {i: list(range(num_qubits)) for i in range(num_qubits)}
134
+
135
+ elif connectivity == "line":
136
+ # Every qubit is connected to its immediate neighbors only.
137
+ links = {i: [i - 1, i, i + 1] for i in range(1, num_qubits - 1)}
138
+
139
+ # first qubit
140
+ links[0] = [0, 1]
141
+
142
+ # last qubit
143
+ links[num_qubits - 1] = [num_qubits - 2, num_qubits - 1]
144
+
145
+ elif connectivity == "star":
146
+ # Every qubit is connected to the first one only.
147
+ links = {i: [0, i] for i in range(1, num_qubits)}
148
+
149
+ # first qubit
150
+ links[0] = list(range(num_qubits))
151
+
152
+ else:
153
+ raise ValueError(
154
+ f"Unknown connectivity type, expects one of {_CONNECTIVITY_TYPES}, got {connectivity}"
155
+ )
156
+ return links
157
+
158
+
159
+ def _sequential_network(num_qubits: int, links: dict, depth: int) -> np.ndarray:
160
+ """
161
+ Generates a sequential network.
162
+
163
+ Args:
164
+ num_qubits: number of qubits.
165
+ links: dictionary of connectivity links.
166
+ depth: depth of the network (number of layers of building blocks).
167
+
168
+ Returns:
169
+ A matrix of ``(2, N)`` that defines layers in qubit network.
170
+ """
171
+ layer = 0
172
+ cnots = np.zeros((2, depth), dtype=int)
173
+ while True:
174
+ for i in range(0, num_qubits - 1):
175
+ for j in range(i + 1, num_qubits):
176
+ if j in links[i]:
177
+ cnots[0, layer] = i
178
+ cnots[1, layer] = j
179
+ layer += 1
180
+ if layer >= depth:
181
+ return cnots
182
+
183
+
184
+ def _spin_network(num_qubits: int, depth: int) -> np.ndarray:
185
+ """
186
+ Generates a spin-like network.
187
+
188
+ Args:
189
+ num_qubits: number of qubits.
190
+ depth: depth of the network (number of layers of building blocks).
191
+
192
+ Returns:
193
+ A matrix of size ``2 x L`` that defines layers in qubit network.
194
+ """
195
+ layer = 0
196
+ cnots = np.zeros((2, depth), dtype=int)
197
+ while True:
198
+ for i in range(0, num_qubits - 1, 2):
199
+ cnots[0, layer] = i
200
+ cnots[1, layer] = i + 1
201
+ layer += 1
202
+ if layer >= depth:
203
+ return cnots
204
+
205
+ for i in range(1, num_qubits - 1, 2):
206
+ cnots[0, layer] = i
207
+ cnots[1, layer] = i + 1
208
+ layer += 1
209
+ if layer >= depth:
210
+ return cnots
211
+
212
+
213
+ def _cartan_network(num_qubits: int) -> np.ndarray:
214
+ """
215
+ Cartan decomposition in a recursive way, starting from n = 3.
216
+
217
+ Args:
218
+ num_qubits: number of qubits.
219
+
220
+ Returns:
221
+ 2xN matrix that defines layers in qubit network, where N is the
222
+ depth of Cartan decomposition.
223
+
224
+ Raises:
225
+ ValueError: if number of qubits is less than 3.
226
+ """
227
+ n = num_qubits
228
+ if n > 3:
229
+ cnots = np.asarray([[0, 0, 0], [1, 1, 1]])
230
+ mult = np.asarray([[n - 2, n - 3, n - 2, n - 3], [n - 1, n - 1, n - 1, n - 1]])
231
+ for _ in range(n - 2):
232
+ cnots = np.hstack((np.tile(np.hstack((cnots, mult)), 3), cnots))
233
+ mult[0, -1] -= 1
234
+ mult = np.tile(mult, 2)
235
+ elif n == 3:
236
+ cnots = np.asarray(
237
+ [
238
+ [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
239
+ [1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1],
240
+ ]
241
+ )
242
+ else:
243
+ raise ValueError(f"The number of qubits must be >= 3, got {n}.")
244
+
245
+ return cnots
246
+
247
+
248
+ def _cyclic_spin_network(num_qubits: int, depth: int) -> np.ndarray:
249
+ """
250
+ Same as in the spin-like network, but the first and the last qubits are also connected.
251
+
252
+ Args:
253
+ num_qubits: number of qubits.
254
+ depth: depth of the network (number of layers of building blocks).
255
+
256
+ Returns:
257
+ A matrix of size ``2 x L`` that defines layers in qubit network.
258
+ """
259
+
260
+ cnots = np.zeros((2, depth), dtype=int)
261
+ z = 0
262
+ while True:
263
+ for i in range(0, num_qubits, 2):
264
+ if i + 1 <= num_qubits - 1:
265
+ cnots[0, z] = i
266
+ cnots[1, z] = i + 1
267
+ z += 1
268
+ if z >= depth:
269
+ return cnots
270
+
271
+ for i in range(1, num_qubits, 2):
272
+ if i + 1 <= num_qubits - 1:
273
+ cnots[0, z] = i
274
+ cnots[1, z] = i + 1
275
+ z += 1
276
+ elif i == num_qubits - 1:
277
+ cnots[0, z] = i
278
+ cnots[1, z] = 0
279
+ z += 1
280
+ if z >= depth:
281
+ return cnots
282
+
283
+
284
+ def _cyclic_line_network(num_qubits: int, depth: int) -> np.ndarray:
285
+ """
286
+ Generates a line based CNOT structure.
287
+
288
+ Args:
289
+ num_qubits: number of qubits.
290
+ depth: depth of the network (number of layers of building blocks).
291
+
292
+ Returns:
293
+ A matrix of size ``2 x L`` that defines layers in qubit network.
294
+ """
295
+
296
+ cnots = np.zeros((2, depth), dtype=int)
297
+ for i in range(depth):
298
+ cnots[0, i] = (i + 0) % num_qubits
299
+ cnots[1, i] = (i + 1) % num_qubits
300
+ return cnots
@@ -0,0 +1,103 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+ """
13
+ This is the Parametric Circuit class: anything that you need for a circuit
14
+ to be parametrized and used for approximate compiling optimization.
15
+ """
16
+ from __future__ import annotations
17
+ from typing import Optional
18
+
19
+ import numpy as np
20
+
21
+ from .approximate import ApproximateCircuit
22
+
23
+
24
+ class CNOTUnitCircuit(ApproximateCircuit):
25
+ """A class that represents an approximate circuit based on CNOT unit blocks."""
26
+
27
+ def __init__(
28
+ self,
29
+ num_qubits: int,
30
+ cnots: np.ndarray,
31
+ tol: Optional[float] = 0.0,
32
+ name: Optional[str] = None,
33
+ ) -> None:
34
+ """
35
+ Args:
36
+ num_qubits: the number of qubits in this circuit.
37
+ cnots: an array of dimensions ``(2, L)`` indicating where the CNOT units will be placed.
38
+ tol: angle parameter less or equal this (small) value is considered equal zero and
39
+ corresponding gate is not inserted into the output circuit (because it becomes
40
+ identity one in this case).
41
+ name: name of this circuit
42
+
43
+ Raises:
44
+ ValueError: if an unsupported parameter is passed.
45
+ """
46
+ super().__init__(num_qubits=num_qubits, name=name)
47
+
48
+ if cnots.ndim != 2 or cnots.shape[0] != 2:
49
+ raise ValueError("CNOT structure must be defined as an array of the size (2, N)")
50
+
51
+ self._cnots = cnots
52
+ self._num_cnots = cnots.shape[1]
53
+ self._tol = tol
54
+
55
+ # Thetas to be optimized by the AQC algorithm
56
+ self._thetas: np.ndarray | None = None
57
+
58
+ @property
59
+ def thetas(self) -> np.ndarray:
60
+ """
61
+ Returns a vector of rotation angles used by CNOT units in this circuit.
62
+
63
+ Returns:
64
+ Parameters of the rotation gates in this circuit.
65
+ """
66
+ return self._thetas
67
+
68
+ def build(self, thetas: np.ndarray) -> None:
69
+ """
70
+ Constructs a Qiskit quantum circuit out of the parameters (angles) of this circuit. If a
71
+ parameter value is less in absolute value than the specified tolerance then the
72
+ corresponding rotation gate will be skipped in the circuit.
73
+ """
74
+ n = self.num_qubits
75
+ self._thetas = thetas
76
+ cnots = self._cnots
77
+
78
+ for k in range(n):
79
+ # add initial three rotation gates for each qubit
80
+ p = 4 * self._num_cnots + 3 * k
81
+ k = n - k - 1
82
+ if np.abs(thetas[2 + p]) > self._tol:
83
+ self.rz(thetas[2 + p], k)
84
+ if np.abs(thetas[1 + p]) > self._tol:
85
+ self.ry(thetas[1 + p], k)
86
+ if np.abs(thetas[0 + p]) > self._tol:
87
+ self.rz(thetas[0 + p], k)
88
+
89
+ for c in range(self._num_cnots):
90
+ p = 4 * c
91
+ # Extract where the CNOT goes
92
+ q1 = n - 1 - int(cnots[0, c])
93
+ q2 = n - 1 - int(cnots[1, c])
94
+ # Construct a CNOT unit
95
+ self.cx(q1, q2)
96
+ if np.abs(thetas[0 + p]) > self._tol:
97
+ self.ry(thetas[0 + p], q1)
98
+ if np.abs(thetas[1 + p]) > self._tol:
99
+ self.rz(thetas[1 + p], q1)
100
+ if np.abs(thetas[2 + p]) > self._tol:
101
+ self.ry(thetas[2 + p], q2)
102
+ if np.abs(thetas[3 + p]) > self._tol:
103
+ self.rx(thetas[3 + p], q2)