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,164 @@
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
+ # The structure of the code is based on Emanuel Malvetti's semester thesis at ETH in 2018,
14
+ # which was supervised by Raban Iten and Prof. Renato Renner.
15
+
16
+ """Uniformly controlled Pauli rotations."""
17
+
18
+ from __future__ import annotations
19
+
20
+ import math
21
+
22
+ import numpy as np
23
+
24
+ from qiskit.circuit.gate import Gate
25
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
26
+ from qiskit.circuit import QuantumRegister
27
+ from qiskit.exceptions import QiskitError
28
+
29
+ _EPS = 1e-10 # global variable used to chop very small numbers to zero
30
+
31
+
32
+ class UCPauliRotGate(Gate):
33
+ r"""Uniformly controlled Pauli rotations.
34
+
35
+ Implements the :class:`.UCGate` for the special case that all unitaries are Pauli rotations,
36
+ :math:`U_i = R_P(a_i)` where :math:`P \in \{X, Y, Z\}` and :math:`a_i \in \mathbb{R}` is
37
+ the rotation angle.
38
+ """
39
+
40
+ def __init__(self, angle_list: list[float], rot_axis: str) -> None:
41
+ r"""
42
+ Args:
43
+ angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
44
+ rot_axis: Rotation axis. Must be either of ``"X"``, ``"Y"`` or ``"Z"``.
45
+ """
46
+ self.rot_axes = rot_axis
47
+ # Check if angle_list has type "list"
48
+ if not isinstance(angle_list, list):
49
+ raise QiskitError("The angles are not provided in a list.")
50
+ # Check if the angles in angle_list are real numbers
51
+ for angle in angle_list:
52
+ try:
53
+ float(angle)
54
+ except TypeError as ex:
55
+ raise QiskitError(
56
+ "An angle cannot be converted to type float (real angles are expected)."
57
+ ) from ex
58
+ num_contr = math.log2(len(angle_list))
59
+ if num_contr < 0 or not num_contr.is_integer():
60
+ raise QiskitError(
61
+ "The number of controlled rotation gates is not a non-negative power of 2."
62
+ )
63
+ if rot_axis not in ("X", "Y", "Z"):
64
+ raise QiskitError("Rotation axis is not supported.")
65
+ # Create new gate.
66
+ num_qubits = int(num_contr) + 1
67
+ super().__init__("ucr" + rot_axis.lower(), num_qubits, angle_list)
68
+
69
+ def _define(self):
70
+ ucr_circuit = self._dec_ucrot()
71
+ gate = ucr_circuit.to_instruction()
72
+ q = QuantumRegister(self.num_qubits, "q")
73
+ ucr_circuit = QuantumCircuit(q)
74
+ ucr_circuit.append(gate, q[:])
75
+ self.definition = ucr_circuit
76
+
77
+ def _dec_ucrot(self):
78
+ """
79
+ Finds a decomposition of a UC rotation gate into elementary gates
80
+ (C-NOTs and single-qubit rotations).
81
+ """
82
+ q = QuantumRegister(self.num_qubits, "q")
83
+ circuit = QuantumCircuit(q)
84
+ q_target = q[0]
85
+ q_controls = q[1:]
86
+ if not q_controls: # equivalent to: if len(q_controls) == 0
87
+ if self.rot_axes == "X":
88
+ if np.abs(self.params[0]) > _EPS:
89
+ circuit.rx(self.params[0], q_target)
90
+ if self.rot_axes == "Y":
91
+ if np.abs(self.params[0]) > _EPS:
92
+ circuit.ry(self.params[0], q_target)
93
+ if self.rot_axes == "Z":
94
+ if np.abs(self.params[0]) > _EPS:
95
+ circuit.rz(self.params[0], q_target)
96
+ else:
97
+ # First, we find the rotation angles of the single-qubit rotations acting
98
+ # on the target qubit
99
+ angles = self.params.copy()
100
+ UCPauliRotGate._dec_uc_rotations(angles, 0, len(angles), False)
101
+ # Now, it is easy to place the C-NOT gates to get back the full decomposition.
102
+ for i, angle in enumerate(angles):
103
+ if self.rot_axes == "X":
104
+ if np.abs(angle) > _EPS:
105
+ circuit.rx(angle, q_target)
106
+ if self.rot_axes == "Y":
107
+ if np.abs(angle) > _EPS:
108
+ circuit.ry(angle, q_target)
109
+ if self.rot_axes == "Z":
110
+ if np.abs(angle) > _EPS:
111
+ circuit.rz(angle, q_target)
112
+ # Determine the index of the qubit we want to control the C-NOT gate.
113
+ # Note that it corresponds
114
+ # to the number of trailing zeros in the binary representation of i+1
115
+ if not i == len(angles) - 1:
116
+ binary_rep = np.binary_repr(i + 1)
117
+ q_contr_index = len(binary_rep) - len(binary_rep.rstrip("0"))
118
+ else:
119
+ # Handle special case:
120
+ q_contr_index = len(q_controls) - 1
121
+ # For X rotations, we have to additionally place some Ry gates around the
122
+ # C-NOT gates. They change the basis of the NOT operation, such that the
123
+ # decomposition of for uniformly controlled X rotations works correctly by symmetry
124
+ # with the decomposition of uniformly controlled Z or Y rotations
125
+ if self.rot_axes == "X":
126
+ circuit.ry(np.pi / 2, q_target)
127
+ circuit.cx(q_controls[q_contr_index], q_target)
128
+ if self.rot_axes == "X":
129
+ circuit.ry(-np.pi / 2, q_target)
130
+ return circuit
131
+
132
+ @staticmethod
133
+ def _dec_uc_rotations(angles, start_index, end_index, reversed_dec):
134
+ """
135
+ Calculates rotation angles for a uniformly controlled R_t gate with a C-NOT gate at
136
+ the end of the circuit. The rotation angles of the gate R_t are stored in
137
+ angles[start_index:end_index]. If reversed_dec == True, it decomposes the gate such that
138
+ there is a C-NOT gate at the start of the circuit (in fact, the circuit topology for
139
+ the reversed decomposition is the reversed one of the original decomposition)
140
+ """
141
+ interval_len_half = (end_index - start_index) // 2
142
+ for i in range(start_index, start_index + interval_len_half):
143
+ if not reversed_dec:
144
+ angles[i], angles[i + interval_len_half] = UCPauliRotGate._update_angles(
145
+ angles[i], angles[i + interval_len_half]
146
+ )
147
+ else:
148
+ angles[i + interval_len_half], angles[i] = UCPauliRotGate._update_angles(
149
+ angles[i], angles[i + interval_len_half]
150
+ )
151
+ if interval_len_half <= 1:
152
+ return
153
+ else:
154
+ UCPauliRotGate._dec_uc_rotations(
155
+ angles, start_index, start_index + interval_len_half, False
156
+ )
157
+ UCPauliRotGate._dec_uc_rotations(
158
+ angles, start_index + interval_len_half, end_index, True
159
+ )
160
+
161
+ @staticmethod
162
+ def _update_angles(angle1, angle2):
163
+ """Calculate the new rotation angles according to Shende's decomposition."""
164
+ return (angle1 + angle2) / 2.0, (angle1 - angle2) / 2.0
@@ -0,0 +1,32 @@
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
+ """Uniformly controlled Pauli-X rotations."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from .uc_pauli_rot import UCPauliRotGate
18
+
19
+
20
+ class UCRXGate(UCPauliRotGate):
21
+ r"""Uniformly controlled Pauli-X rotations.
22
+
23
+ Implements the :class:`.UCGate` for the special case that all unitaries are Pauli-X rotations,
24
+ :math:`U_i = R_X(a_i)` where :math:`a_i \in \mathbb{R}` is the rotation angle.
25
+ """
26
+
27
+ def __init__(self, angle_list: list[float]) -> None:
28
+ r"""
29
+ Args:
30
+ angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
31
+ """
32
+ super().__init__(angle_list, "X")
@@ -0,0 +1,32 @@
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
+ """Uniformly controlled Pauli-Y rotations."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from .uc_pauli_rot import UCPauliRotGate
18
+
19
+
20
+ class UCRYGate(UCPauliRotGate):
21
+ r"""Uniformly controlled Pauli-Y rotations.
22
+
23
+ Implements the :class:`.UCGate` for the special case that all unitaries are Pauli-Y rotations,
24
+ :math:`U_i = R_Y(a_i)` where :math:`a_i \in \mathbb{R}` is the rotation angle.
25
+ """
26
+
27
+ def __init__(self, angle_list: list[float]) -> None:
28
+ r"""
29
+ Args:
30
+ angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
31
+ """
32
+ super().__init__(angle_list, "Y")
@@ -0,0 +1,32 @@
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
+ """Uniformly controlled Pauli-Z rotations."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from .uc_pauli_rot import UCPauliRotGate
18
+
19
+
20
+ class UCRZGate(UCPauliRotGate):
21
+ r"""Uniformly controlled Pauli-Z rotations.
22
+
23
+ Implements the :class:`.UCGate` for the special case that all unitaries are Pauli-Z rotations,
24
+ :math:`U_i = R_Z(a_i)` where :math:`a_i \in \mathbb{R}` is the rotation angle.
25
+ """
26
+
27
+ def __init__(self, angle_list: list[float]):
28
+ r"""
29
+ Args:
30
+ angle_list: List of rotation angles :math:`[a_0, ..., a_{2^{k-1}}]`.
31
+ """
32
+ super().__init__(angle_list, "Z")
@@ -0,0 +1,236 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Arbitrary unitary circuit instruction."""
14
+
15
+ from __future__ import annotations
16
+ import math
17
+
18
+ import typing
19
+ import numpy
20
+
21
+ from qiskit import _numpy_compat
22
+ from qiskit.circuit.gate import Gate
23
+ from qiskit.circuit.controlledgate import ControlledGate
24
+ from qiskit.circuit.annotated_operation import AnnotatedOperation, ControlModifier
25
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
26
+ from qiskit.circuit import QuantumRegister
27
+ from qiskit.circuit.exceptions import CircuitError
28
+ from qiskit.circuit._utils import _compute_control_matrix
29
+ from qiskit.circuit.library.standard_gates.u import UGate
30
+ from qiskit.quantum_info.operators.predicates import matrix_equal
31
+ from qiskit.quantum_info.operators.predicates import is_unitary_matrix
32
+
33
+ from .isometry import Isometry
34
+
35
+ if typing.TYPE_CHECKING:
36
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
37
+
38
+
39
+ class UnitaryGate(Gate):
40
+ """Class quantum gates specified by a unitary matrix.
41
+
42
+ Example:
43
+
44
+ We can create a unitary gate from a unitary matrix then add it to a
45
+ quantum circuit. The matrix can also be directly applied to the quantum
46
+ circuit, see :meth:`.QuantumCircuit.unitary`.
47
+
48
+ .. plot::
49
+ :include-source:
50
+ :nofigs:
51
+
52
+ from qiskit import QuantumCircuit
53
+ from qiskit.circuit.library import UnitaryGate
54
+
55
+ matrix = [[0, 0, 0, 1],
56
+ [0, 0, 1, 0],
57
+ [1, 0, 0, 0],
58
+ [0, 1, 0, 0]]
59
+ gate = UnitaryGate(matrix)
60
+
61
+ circuit = QuantumCircuit(2)
62
+ circuit.append(gate, [0, 1])
63
+ """
64
+
65
+ def __init__(
66
+ self,
67
+ data: numpy.ndarray | Gate | BaseOperator,
68
+ label: str | None = None,
69
+ check_input: bool = True,
70
+ *,
71
+ num_qubits: int | None = None,
72
+ ) -> None:
73
+ """Create a gate from a numeric unitary matrix.
74
+
75
+ Args:
76
+ data: Unitary operator.
77
+ label: Unitary name for backend [Default: ``None``].
78
+ check_input: If set to ``False`` this asserts the input
79
+ is known to be unitary and the checking to validate this will
80
+ be skipped. This should only ever be used if you know the
81
+ input is unitary, setting this to ``False`` and passing in
82
+ a non-unitary matrix will result unexpected behavior and errors.
83
+ num_qubits: If given, the number of qubits in the matrix. If not given, it is inferred.
84
+
85
+ Raises:
86
+ ValueError: If input data is not an N-qubit unitary operator.
87
+ """
88
+ if hasattr(data, "to_matrix"):
89
+ # If input is Gate subclass or some other class object that has
90
+ # a to_matrix method this will call that method.
91
+ data = data.to_matrix()
92
+ elif hasattr(data, "to_operator"):
93
+ # If input is a BaseOperator subclass this attempts to convert
94
+ # the object to an Operator so that we can extract the underlying
95
+ # numpy matrix from `Operator.data`.
96
+ data = data.to_operator().data
97
+ # Convert to numpy array in case not already an array
98
+ data = numpy.asarray(data, dtype=complex)
99
+ input_dim, output_dim = data.shape
100
+ num_qubits = num_qubits if num_qubits is not None else int(math.log2(input_dim))
101
+ if check_input:
102
+ # Check input is unitary
103
+ if not is_unitary_matrix(data):
104
+ raise ValueError("Input matrix is not unitary.")
105
+ # Check input is N-qubit matrix
106
+ if input_dim != output_dim or 2**num_qubits != input_dim:
107
+ raise ValueError("Input matrix is not an N-qubit operator.")
108
+ # Store instruction params
109
+ super().__init__("unitary", num_qubits, [data], label=label)
110
+
111
+ def __eq__(self, other):
112
+ if not isinstance(other, UnitaryGate):
113
+ return False
114
+ if self.label != other.label:
115
+ return False
116
+ return matrix_equal(self.params[0], other.params[0])
117
+
118
+ def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
119
+ """Return matrix for the unitary."""
120
+ dtype = self.params[0].dtype if dtype is None else dtype
121
+ return numpy.array(self.params[0], dtype=dtype, copy=copy)
122
+
123
+ def inverse(self, annotated: bool = False):
124
+ """Return the adjoint of the unitary."""
125
+ return self.adjoint()
126
+
127
+ def conjugate(self):
128
+ """Return the conjugate of the unitary."""
129
+ return UnitaryGate(numpy.conj(self.to_matrix()))
130
+
131
+ def adjoint(self):
132
+ """Return the adjoint of the unitary."""
133
+ return self.transpose().conjugate()
134
+
135
+ def transpose(self):
136
+ """Return the transpose of the unitary."""
137
+ return UnitaryGate(numpy.transpose(self.to_matrix()))
138
+
139
+ def _define(self):
140
+ """Calculate a subcircuit that implements this unitary."""
141
+ if self.num_qubits == 1:
142
+ from qiskit.synthesis.one_qubit.one_qubit_decompose import OneQubitEulerDecomposer
143
+
144
+ q = QuantumRegister(1, "q")
145
+ qc = QuantumCircuit(q, name=self.name)
146
+ theta, phi, lam, global_phase = OneQubitEulerDecomposer("U").angles_and_phase(
147
+ self.to_matrix()
148
+ )
149
+ qc._append(UGate(theta, phi, lam), [q[0]], [])
150
+ qc.global_phase = global_phase
151
+ self.definition = qc
152
+ elif self.num_qubits == 2:
153
+ from qiskit.synthesis.two_qubit.two_qubit_decompose import ( # pylint: disable=cyclic-import
154
+ two_qubit_cnot_decompose,
155
+ )
156
+
157
+ self.definition = two_qubit_cnot_decompose(self.to_matrix())
158
+ else:
159
+ from qiskit.synthesis.unitary.qsd import ( # pylint: disable=cyclic-import
160
+ qs_decomposition,
161
+ )
162
+
163
+ self.definition = qs_decomposition(self.to_matrix())
164
+ # Since iterative cosine-sine decomposition may provide imprecise matrices,
165
+ # we use the Isometry decomposition in this case
166
+ # pylint: disable=cyclic-import
167
+ from qiskit.quantum_info.operators import Operator
168
+
169
+ if not (
170
+ matrix_equal(Operator(self.definition).to_matrix(), self.to_matrix(), atol=1e-7)
171
+ ):
172
+ self.definition = Isometry(self.matrix, 0, 0).definition
173
+
174
+ def control(
175
+ self,
176
+ num_ctrl_qubits: int = 1,
177
+ label: str | None = None,
178
+ ctrl_state: int | str | None = None,
179
+ annotated: bool | None = None,
180
+ ) -> ControlledGate | AnnotatedOperation:
181
+ """Return controlled version of gate.
182
+
183
+ Args:
184
+ num_ctrl_qubits: Number of controls to add to gate (default is 1).
185
+ label: Optional gate label.
186
+ ctrl_state: The control state in decimal or as a bit string (e.g. ``"1011"``).
187
+ If ``None``, use ``2**num_ctrl_qubits - 1``.
188
+ annotated: indicates whether the controlled gate should be implemented
189
+ as an annotated gate. If ``None``, this is handled as ``False``.
190
+
191
+ Returns:
192
+ Controlled version of gate.
193
+ """
194
+ if not annotated:
195
+ mat = self.to_matrix()
196
+ cmat = _compute_control_matrix(mat, num_ctrl_qubits, ctrl_state=None)
197
+ from qiskit.synthesis.unitary.qsd import qs_decomposition
198
+
199
+ cmat_def = qs_decomposition(cmat, opt_a1=True, opt_a2=False)
200
+ # Since iterative cosine-sine decomposition may provide imprecise matrices,
201
+ # we use the Isometry decomposition in this case
202
+ # pylint: disable=cyclic-import
203
+ from qiskit.quantum_info.operators import Operator
204
+
205
+ if not matrix_equal(Operator(cmat_def).to_matrix(), cmat, atol=1e-7):
206
+ self.definition = Isometry(cmat, 0, 0).definition
207
+
208
+ gate = ControlledGate(
209
+ "c-unitary",
210
+ num_qubits=self.num_qubits + num_ctrl_qubits,
211
+ params=[mat],
212
+ label=label,
213
+ num_ctrl_qubits=num_ctrl_qubits,
214
+ definition=cmat_def,
215
+ ctrl_state=ctrl_state,
216
+ base_gate=self.copy(),
217
+ )
218
+ else:
219
+ gate = AnnotatedOperation(
220
+ self, ControlModifier(num_ctrl_qubits=num_ctrl_qubits, ctrl_state=ctrl_state)
221
+ )
222
+ return gate
223
+
224
+ def _qasm_decomposition(self):
225
+ """Return an unparameterized version of ourselves, so the OQ2 exporter doesn't choke on the
226
+ non-standard things in our `params` field."""
227
+ out = self.definition.to_gate()
228
+ out.name = self.name
229
+ return out
230
+
231
+ def validate_parameter(self, parameter):
232
+ """Unitary gate parameter has to be an ndarray."""
233
+ if isinstance(parameter, numpy.ndarray):
234
+ return parameter
235
+ else:
236
+ raise CircuitError(f"invalid param type {type(parameter)} in gate {self.name}")
@@ -0,0 +1,172 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Graph State circuit and gate."""
14
+
15
+ from __future__ import annotations
16
+
17
+ import numpy as np
18
+ from qiskit.circuit.quantumcircuit import QuantumCircuit, Gate
19
+ from qiskit.circuit.exceptions import CircuitError
20
+ from qiskit.utils.deprecation import deprecate_func
21
+
22
+
23
+ class GraphState(QuantumCircuit):
24
+ r"""Circuit to prepare a graph state.
25
+
26
+ Given a graph G = (V, E), with the set of vertices V and the set of edges E,
27
+ the corresponding graph state is defined as
28
+
29
+ .. math::
30
+
31
+ |G\rangle = \prod_{(a,b) \in E} CZ_{(a,b)} {|+\rangle}^{\otimes V}
32
+
33
+ Such a state can be prepared by first preparing all qubits in the :math:`+`
34
+ state, then applying a :math:`CZ` gate for each corresponding graph edge.
35
+
36
+ Graph state preparation circuits are Clifford circuits, and thus
37
+ easy to simulate classically. However, by adding a layer of measurements
38
+ in a product basis at the end, there is evidence that the circuit becomes
39
+ hard to simulate [2].
40
+
41
+ **Reference Circuit:**
42
+
43
+ .. plot::
44
+ :alt: Diagram illustrating the previously described circuit.
45
+
46
+ from qiskit.circuit.library import GraphState
47
+ from qiskit.visualization.library import _generate_circuit_library_visualization
48
+ import rustworkx as rx
49
+ G = rx.generators.cycle_graph(5)
50
+ circuit = GraphState(rx.adjacency_matrix(G))
51
+ circuit.name = "Graph state"
52
+ _generate_circuit_library_visualization(circuit)
53
+
54
+ **References:**
55
+
56
+ [1] M. Hein, J. Eisert, H.J. Briegel, Multi-party Entanglement in Graph States,
57
+ `arXiv:0307130 <https://arxiv.org/pdf/quant-ph/0307130.pdf>`_
58
+ [2] D. Koh, Further Extensions of Clifford Circuits & their Classical Simulation Complexities.
59
+ `arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
60
+ """
61
+
62
+ @deprecate_func(
63
+ since="2.1",
64
+ additional_msg="Use qiskit.circuit.library.GraphStateGate instead.",
65
+ removal_timeline="in Qiskit 3.0",
66
+ )
67
+ def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
68
+ """Create graph state preparation circuit.
69
+
70
+ Args:
71
+ adjacency_matrix: input graph as n-by-n list of 0-1 lists
72
+
73
+ Raises:
74
+ CircuitError: If adjacency_matrix is not symmetric.
75
+
76
+ The circuit prepares a graph state with the given adjacency
77
+ matrix.
78
+ """
79
+
80
+ adjacency_matrix = np.asarray(adjacency_matrix)
81
+ if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
82
+ raise CircuitError("The adjacency matrix must be symmetric.")
83
+
84
+ graph_state_gate = GraphStateGate(adjacency_matrix)
85
+ super().__init__(graph_state_gate.num_qubits, name=f"graph: {adjacency_matrix}")
86
+ self.compose(graph_state_gate, qubits=self.qubits, inplace=True)
87
+
88
+
89
+ class GraphStateGate(Gate):
90
+ r"""A gate representing a graph state.
91
+
92
+ Given a graph G = (V, E), with the set of vertices V and the set of edges E,
93
+ the corresponding graph state is defined as
94
+
95
+ .. math::
96
+
97
+ |G\rangle = \prod_{(a,b) \in E} CZ_{(a,b)} {|+\rangle}^{\otimes V}
98
+
99
+ Such a state can be prepared by first preparing all qubits in the :math:`+`
100
+ state, then applying a :math:`CZ` gate for each corresponding graph edge.
101
+
102
+ Graph state preparation circuits are Clifford circuits, and thus
103
+ easy to simulate classically. However, by adding a layer of measurements
104
+ in a product basis at the end, there is evidence that the circuit becomes
105
+ hard to simulate [2].
106
+
107
+ **Reference Circuit:**
108
+
109
+ .. plot::
110
+ :alt: Circuit diagram output by the previous code.
111
+ :include-source:
112
+
113
+ from qiskit.circuit import QuantumCircuit
114
+ from qiskit.circuit.library import GraphStateGate
115
+ import rustworkx as rx
116
+
117
+ G = rx.generators.cycle_graph(5)
118
+ circuit = QuantumCircuit(5)
119
+ circuit.append(GraphStateGate(rx.adjacency_matrix(G)), [0, 1, 2, 3, 4])
120
+ circuit.decompose().draw('mpl')
121
+
122
+ **References:**
123
+
124
+ [1] M. Hein, J. Eisert, H.J. Briegel, Multi-party Entanglement in Graph States,
125
+ `arXiv:0307130 <https://arxiv.org/pdf/quant-ph/0307130.pdf>`_
126
+ [2] D. Koh, Further Extensions of Clifford Circuits & their Classical Simulation Complexities.
127
+ `arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
128
+ """
129
+
130
+ def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
131
+ """
132
+ Args:
133
+ adjacency_matrix: input graph as n-by-n list of 0-1 lists
134
+
135
+ Raises:
136
+ CircuitError: If adjacency_matrix is not symmetric.
137
+
138
+ The gate represents a graph state with the given adjacency matrix.
139
+ """
140
+
141
+ adjacency_matrix = np.asarray(adjacency_matrix)
142
+ if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
143
+ raise CircuitError("The adjacency matrix must be symmetric.")
144
+ num_qubits = len(adjacency_matrix)
145
+
146
+ super().__init__(name="graph_state", num_qubits=num_qubits, params=[adjacency_matrix])
147
+
148
+ def _define(self):
149
+ adjacency_matrix = self.adjacency_matrix
150
+ circuit = QuantumCircuit(self.num_qubits, name=self.name)
151
+ circuit.h(range(self.num_qubits))
152
+ for i in range(self.num_qubits):
153
+ for j in range(i + 1, self.num_qubits):
154
+ if adjacency_matrix[i][j] == 1:
155
+ circuit.cz(i, j)
156
+ self.definition = circuit
157
+
158
+ def validate_parameter(self, parameter):
159
+ """Parameter validation"""
160
+ return parameter
161
+
162
+ @property
163
+ def adjacency_matrix(self):
164
+ """Returns the adjacency matrix."""
165
+ return self.params[0]
166
+
167
+ def __eq__(self, other):
168
+ return (
169
+ isinstance(other, GraphStateGate)
170
+ and self.num_qubits == other.num_qubits
171
+ and np.all(self.adjacency_matrix == other.adjacency_matrix)
172
+ )