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,322 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Blueprint circuit object."""
14
+
15
+ from __future__ import annotations
16
+ from abc import ABC, abstractmethod
17
+ import copy as _copy
18
+
19
+ from qiskit._accelerate.circuit import CircuitData
20
+ from qiskit.circuit import QuantumRegister, ClassicalRegister
21
+ from qiskit.circuit.parametertable import ParameterView
22
+ from qiskit.circuit.quantumcircuit import QuantumCircuit, _copy_metadata
23
+ from qiskit.utils.deprecation import deprecate_func
24
+
25
+
26
+ class BlueprintCircuit(QuantumCircuit, ABC):
27
+ """Blueprint circuit object.
28
+
29
+ In many applications it is necessary to pass around the structure a circuit will have without
30
+ explicitly knowing e.g. its number of qubits, or other missing information. This can be solved
31
+ by having a circuit that knows how to construct itself, once all information is available.
32
+
33
+ This class provides an interface for such circuits. Before internal data of the circuit is
34
+ accessed, the ``_build`` method is called. There the configuration of the circuit is checked.
35
+ """
36
+
37
+ @deprecate_func(
38
+ since="2.1",
39
+ additional_msg="There is no direct replacement other than the QuantumCircuit class.",
40
+ removal_timeline="in Qiskit 3.0",
41
+ )
42
+ def __init__(self, *regs, name: str | None = None) -> None:
43
+ """Create a new blueprint circuit."""
44
+ self._is_initialized = False
45
+ super().__init__(*regs, name=name)
46
+ self._qregs: list[QuantumRegister] = []
47
+ self._cregs: list[ClassicalRegister] = []
48
+ self._is_built = False
49
+ self._is_initialized = True
50
+
51
+ @abstractmethod
52
+ def _check_configuration(self, raise_on_failure: bool = True) -> bool:
53
+ """Check if the current configuration allows the circuit to be built.
54
+
55
+ Args:
56
+ raise_on_failure: If True, raise if the configuration is invalid. If False, return
57
+ False if the configuration is invalid.
58
+
59
+ Returns:
60
+ True, if the configuration is valid. Otherwise, depending on the value of
61
+ ``raise_on_failure`` an error is raised or False is returned.
62
+ """
63
+ raise NotImplementedError
64
+
65
+ @abstractmethod
66
+ def _build(self) -> None:
67
+ """Build the circuit."""
68
+ if self._is_built:
69
+ return
70
+
71
+ # check whether the configuration is valid
72
+ self._check_configuration()
73
+ self._is_built = True
74
+
75
+ def _invalidate(self) -> None:
76
+ """Invalidate the current circuit build."""
77
+ # Take out the registers before invalidating
78
+ qregs = self._data.qregs
79
+ cregs = self._data.cregs
80
+ self._data = CircuitData(self._data.qubits, self._data.clbits)
81
+ # Re-add the registers
82
+ for qreg in qregs:
83
+ self._data.add_qreg(qreg)
84
+ for creg in cregs:
85
+ self._data.add_creg(creg)
86
+ self.global_phase = 0
87
+ self._is_built = False
88
+
89
+ @property
90
+ def qregs(self):
91
+ """A list of the quantum registers associated with the circuit."""
92
+ if not self._is_initialized:
93
+ return self._qregs
94
+ return super().qregs
95
+
96
+ @qregs.setter
97
+ def qregs(self, qregs):
98
+ """Set the quantum registers associated with the circuit."""
99
+ if not self._is_initialized:
100
+ # Workaround to ignore calls from QuantumCircuit.__init__() which
101
+ # doesn't expect 'qregs' to be an overridden property!
102
+ return
103
+ self._qregs = []
104
+ self._ancillas = []
105
+ self._data = CircuitData(clbits=self._data.clbits)
106
+ self.global_phase = 0
107
+ self._is_built = False
108
+
109
+ self.add_register(*qregs)
110
+
111
+ @property
112
+ def data(self):
113
+ """The circuit data (instructions and context).
114
+
115
+ Returns:
116
+ QuantumCircuitData: a list-like object containing the :class:`.CircuitInstruction`\\ s
117
+ for each instruction.
118
+ """
119
+ if not self._is_built:
120
+ self._build()
121
+ return super().data
122
+
123
+ def decompose(self, gates_to_decompose=None, reps=1):
124
+ if not self._is_built:
125
+ self._build()
126
+ return super().decompose(gates_to_decompose, reps)
127
+
128
+ def draw(self, *args, **kwargs):
129
+ if not self._is_built:
130
+ self._build()
131
+ return super().draw(*args, **kwargs)
132
+
133
+ @property
134
+ def num_parameters(self) -> int:
135
+ """The number of parameter objects in the circuit."""
136
+ if not self._is_built:
137
+ self._build()
138
+ return super().num_parameters
139
+
140
+ @property
141
+ def parameters(self) -> ParameterView:
142
+ """The parameters defined in the circuit.
143
+
144
+ This attribute returns the :class:`.Parameter` objects in the circuit sorted
145
+ alphabetically. Note that parameters instantiated with a :class:`.ParameterVector`
146
+ are still sorted numerically.
147
+
148
+ Examples:
149
+
150
+ The snippet below shows that insertion order of parameters does not matter.
151
+
152
+ .. code-block:: python
153
+
154
+ >>> from qiskit.circuit import QuantumCircuit, Parameter
155
+ >>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
156
+ >>> circuit = QuantumCircuit(1)
157
+ >>> circuit.rx(b, 0)
158
+ >>> circuit.rz(elephant, 0)
159
+ >>> circuit.ry(a, 0)
160
+ >>> circuit.parameters # sorted alphabetically!
161
+ ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])
162
+
163
+ Bear in mind that alphabetical sorting might be unintuitive when it comes to numbers.
164
+ The literal "10" comes before "2" in strict alphabetical sorting.
165
+
166
+ .. code-block:: python
167
+
168
+ >>> from qiskit.circuit import QuantumCircuit, Parameter
169
+ >>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
170
+ >>> circuit = QuantumCircuit(1)
171
+ >>> circuit.u(*angles, 0)
172
+ >>> circuit.draw()
173
+ ┌─────────────────────────────┐
174
+ q: ┤ U(angle_1,angle_2,angle_10) ├
175
+ └─────────────────────────────┘
176
+ >>> circuit.parameters
177
+ ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])
178
+
179
+ To respect numerical sorting, a :class:`.ParameterVector` can be used.
180
+
181
+ .. code-block:: python
182
+
183
+ >>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
184
+ >>> x = ParameterVector("x", 12)
185
+ >>> circuit = QuantumCircuit(1)
186
+ >>> for x_i in x:
187
+ ... circuit.rx(x_i, 0)
188
+ >>> circuit.parameters
189
+ ParameterView([
190
+ ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
191
+ ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
192
+ ..., ParameterVectorElement(x[11])
193
+ ])
194
+
195
+
196
+ Returns:
197
+ The sorted :class:`.Parameter` objects in the circuit.
198
+ """
199
+ if not self._is_built:
200
+ self._build()
201
+ return super().parameters
202
+
203
+ def _append(self, instruction, _qargs=None, _cargs=None, *, _standard_gate=False):
204
+ if not self._is_built:
205
+ self._build()
206
+ return super()._append(instruction, _qargs, _cargs, _standard_gate=_standard_gate)
207
+
208
+ def compose(
209
+ self,
210
+ other,
211
+ qubits=None,
212
+ clbits=None,
213
+ front=False,
214
+ inplace=False,
215
+ wrap=False,
216
+ *,
217
+ copy=True,
218
+ var_remap=None,
219
+ inline_captures=False,
220
+ ):
221
+ if not self._is_built:
222
+ self._build()
223
+ return super().compose(
224
+ other,
225
+ qubits,
226
+ clbits,
227
+ front,
228
+ inplace,
229
+ wrap,
230
+ copy=copy,
231
+ var_remap=var_remap,
232
+ inline_captures=False,
233
+ )
234
+
235
+ def inverse(self, annotated: bool = False):
236
+ if not self._is_built:
237
+ self._build()
238
+ return super().inverse(annotated=annotated)
239
+
240
+ def __len__(self):
241
+ return len(self.data)
242
+
243
+ def __getitem__(self, item):
244
+ return self.data[item]
245
+
246
+ def size(self, *args, **kwargs):
247
+ if not self._is_built:
248
+ self._build()
249
+ return super().size(*args, **kwargs)
250
+
251
+ def to_instruction(self, parameter_map=None, label=None):
252
+ if not self._is_built:
253
+ self._build()
254
+ return super().to_instruction(parameter_map, label=label)
255
+
256
+ def to_gate(self, parameter_map=None, label=None):
257
+ if not self._is_built:
258
+ self._build()
259
+ return super().to_gate(parameter_map, label=label)
260
+
261
+ def depth(self, *args, **kwargs):
262
+ if not self._is_built:
263
+ self._build()
264
+ return super().depth(*args, **kwargs)
265
+
266
+ def count_ops(self):
267
+ if not self._is_built:
268
+ self._build()
269
+ return super().count_ops()
270
+
271
+ def num_nonlocal_gates(self):
272
+ if not self._is_built:
273
+ self._build()
274
+ return super().num_nonlocal_gates()
275
+
276
+ def num_connected_components(self, unitary_only=False):
277
+ if not self._is_built:
278
+ self._build()
279
+ return super().num_connected_components(unitary_only=unitary_only)
280
+
281
+ def copy_empty_like(
282
+ self, name: str | None = None, *, vars_mode: str = "alike"
283
+ ) -> QuantumCircuit:
284
+ """Return an empty :class:`.QuantumCircuit` of same size and metadata.
285
+
286
+ See also :meth:`.QuantumCircuit.copy_empty_like` for more details on copied metadata.
287
+
288
+ Args:
289
+ name: Name for the copied circuit. If None, then the name stays the same.
290
+ vars_mode: The mode to handle realtime variables in.
291
+
292
+ Returns:
293
+ An empty circuit of same dimensions. Note that the result is no longer a
294
+ :class:`.BlueprintCircuit`.
295
+ """
296
+
297
+ cpy = QuantumCircuit(*self.qregs, *self.cregs, name=name, global_phase=self.global_phase)
298
+ _copy_metadata(self, cpy, vars_mode)
299
+ return cpy
300
+
301
+ def copy(self, name: str | None = None) -> BlueprintCircuit:
302
+ """Copy the blueprint circuit.
303
+
304
+ Args:
305
+ name: Name to be given to the copied circuit. If None, then the name stays the same.
306
+
307
+ Returns:
308
+ A deepcopy of the current blueprint circuit, with the specified name.
309
+ """
310
+ if not self._is_built:
311
+ self._build()
312
+
313
+ cpy = _copy.copy(self)
314
+ _copy_metadata(self, cpy, "alike")
315
+
316
+ cpy._is_built = self._is_built
317
+ cpy._data = self._data.copy()
318
+
319
+ if name is not None:
320
+ cpy.name = name
321
+
322
+ return cpy
@@ -0,0 +1,18 @@
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 Boolean logic circuit library."""
14
+
15
+ from .quantum_and import AND, AndGate
16
+ from .quantum_or import OR, OrGate
17
+ from .quantum_xor import XOR, BitwiseXorGate, random_bitwise_xor
18
+ from .inner_product import InnerProduct, InnerProductGate
@@ -0,0 +1,157 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2020, 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+
14
+ """InnerProduct circuit and gate."""
15
+
16
+
17
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate
18
+ from qiskit.utils.deprecation import deprecate_func
19
+
20
+
21
+ class InnerProduct(QuantumCircuit):
22
+ r"""A 2n-qubit Boolean function that computes the inner product of
23
+ two n-qubit vectors over :math:`F_2`.
24
+
25
+ This implementation is a phase oracle which computes the following transform.
26
+
27
+ .. math::
28
+
29
+ \mathcal{IP}_{2n} : F_2^{2n} \rightarrow {-1, 1}
30
+ \mathcal{IP}_{2n}(x_1, \cdots, x_n, y_1, \cdots, y_n) = (-1)^{x.y}
31
+
32
+ The corresponding unitary is a diagonal, which induces a -1 phase on any inputs
33
+ where the inner product of the top and bottom registers is 1. Otherwise it keeps
34
+ the input intact.
35
+
36
+ .. code-block:: text
37
+
38
+
39
+ q0_0: ─■──────────
40
+
41
+ q0_1: ─┼──■───────
42
+ │ │
43
+ q0_2: ─┼──┼──■────
44
+ │ │ │
45
+ q0_3: ─┼──┼──┼──■─
46
+ │ │ │ │
47
+ q1_0: ─■──┼──┼──┼─
48
+ │ │ │
49
+ q1_1: ────■──┼──┼─
50
+ │ │
51
+ q1_2: ───────■──┼─
52
+
53
+ q1_3: ──────────■─
54
+
55
+
56
+ Reference Circuit:
57
+ .. plot::
58
+ :alt: Diagram illustrating the previously described circuit.
59
+
60
+ from qiskit.circuit.library import InnerProduct
61
+ from qiskit.visualization.library import _generate_circuit_library_visualization
62
+ circuit = InnerProduct(4)
63
+ _generate_circuit_library_visualization(circuit)
64
+ """
65
+
66
+ @deprecate_func(
67
+ since="2.1",
68
+ additional_msg="Use qiskit.circuit.library.InnerProductGate instead.",
69
+ removal_timeline="in Qiskit 3.0",
70
+ )
71
+ def __init__(self, num_qubits: int) -> None:
72
+ """Return a circuit to compute the inner product of 2 n-qubit registers.
73
+
74
+ Args:
75
+ num_qubits: width of top and bottom registers (half total circuit width)
76
+ """
77
+ qr_a = QuantumRegister(num_qubits)
78
+ qr_b = QuantumRegister(num_qubits)
79
+ inner = QuantumCircuit(qr_a, qr_b, name="inner_product")
80
+
81
+ for i in range(num_qubits):
82
+ inner.cz(qr_a[i], qr_b[i])
83
+
84
+ super().__init__(*inner.qregs, name="inner_product")
85
+ self.compose(inner.to_gate(), qubits=self.qubits, inplace=True)
86
+
87
+
88
+ class InnerProductGate(Gate):
89
+ r"""A 2n-qubit Boolean function that computes the inner product of
90
+ two n-qubit vectors over :math:`F_2`.
91
+
92
+ This implementation is a phase oracle which computes the following transform.
93
+
94
+ .. math::
95
+
96
+ \mathcal{IP}_{2n} : F_2^{2n} \rightarrow {-1, 1}
97
+ \mathcal{IP}_{2n}(x_1, \cdots, x_n, y_1, \cdots, y_n) = (-1)^{x.y}
98
+
99
+ The corresponding unitary is a diagonal, which induces a -1 phase on any inputs
100
+ where the inner product of the top and bottom registers is 1. Otherwise, it keeps
101
+ the input intact.
102
+
103
+ .. parsed-literal::
104
+
105
+
106
+ q0_0: ─■──────────
107
+
108
+ q0_1: ─┼──■───────
109
+ │ │
110
+ q0_2: ─┼──┼──■────
111
+ │ │ │
112
+ q0_3: ─┼──┼──┼──■─
113
+ │ │ │ │
114
+ q1_0: ─■──┼──┼──┼─
115
+ │ │ │
116
+ q1_1: ────■──┼──┼─
117
+ │ │
118
+ q1_2: ───────■──┼─
119
+
120
+ q1_3: ──────────■─
121
+
122
+
123
+ Reference Circuit:
124
+ .. plot::
125
+ :alt: Diagram illustrating the previously described circuit.
126
+
127
+ from qiskit.circuit import QuantumCircuit
128
+ from qiskit.circuit.library import InnerProductGate
129
+ from qiskit.visualization.library import _generate_circuit_library_visualization
130
+ circuit = QuantumCircuit(8)
131
+ circuit.append(InnerProductGate(4), [0, 1, 2, 3, 4, 5, 6, 7])
132
+ _generate_circuit_library_visualization(circuit)
133
+ """
134
+
135
+ def __init__(
136
+ self,
137
+ num_qubits: int,
138
+ ) -> None:
139
+ """
140
+ Args:
141
+ num_qubits: width of top and bottom registers (half total number of qubits).
142
+ """
143
+ super().__init__("inner_product", 2 * num_qubits, [])
144
+
145
+ def _define(self):
146
+ num_qubits = self.num_qubits // 2
147
+ qr_a = QuantumRegister(num_qubits, name="x")
148
+ qr_b = QuantumRegister(num_qubits, name="y")
149
+
150
+ circuit = QuantumCircuit(qr_a, qr_b, name="inner_product")
151
+ for i in range(num_qubits):
152
+ circuit.cz(qr_a[i], qr_b[i])
153
+
154
+ self.definition = circuit
155
+
156
+ def __eq__(self, other):
157
+ return isinstance(other, InnerProductGate) and self.num_qubits == other.num_qubits
@@ -0,0 +1,204 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2020, 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+
14
+ """Boolean AND circuit and gate."""
15
+
16
+ from __future__ import annotations
17
+
18
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, AncillaRegister, Gate
19
+ from qiskit.circuit.library.standard_gates import MCXGate
20
+ from qiskit.utils.deprecation import deprecate_func
21
+
22
+
23
+ class AND(QuantumCircuit):
24
+ r"""A circuit implementing the logical AND operation on a number of qubits.
25
+
26
+ For the AND operation the state :math:`|1\rangle` is interpreted as ``True``. The result
27
+ qubit is flipped, if the state of all variable qubits is ``True``. In this format, the AND
28
+ operation equals a multi-controlled X gate, which is controlled on all variable qubits.
29
+ Using a list of flags however, qubits can be skipped or negated. Practically, the flags
30
+ allow to skip controls or to apply pre- and post-X gates to the negated qubits.
31
+
32
+ The AND gate without special flags equals the multi-controlled-X gate:
33
+
34
+ .. plot::
35
+ :alt: Diagram illustrating the previously described circuit.
36
+
37
+ from qiskit.circuit.library import AND
38
+ from qiskit.visualization.library import _generate_circuit_library_visualization
39
+ circuit = AND(5)
40
+ _generate_circuit_library_visualization(circuit)
41
+
42
+ Using flags we can negate qubits or skip them. For instance, if we have 5 qubits and want to
43
+ return ``True`` if the first qubit is ``False`` and the last two are ``True`` we use the flags
44
+ ``[-1, 0, 0, 1, 1]``.
45
+
46
+ .. plot::
47
+ :alt: Diagram illustrating the previously described circuit.
48
+
49
+ from qiskit.circuit.library import AND
50
+ from qiskit.visualization.library import _generate_circuit_library_visualization
51
+ circuit = AND(5, flags=[-1, 0, 0, 1, 1])
52
+ _generate_circuit_library_visualization(circuit)
53
+
54
+ """
55
+
56
+ @deprecate_func(
57
+ since="2.1",
58
+ additional_msg="Use qiskit.circuit.library.AndGate instead.",
59
+ removal_timeline="in Qiskit 3.0",
60
+ )
61
+ def __init__(
62
+ self,
63
+ num_variable_qubits: int,
64
+ flags: list[int] | None = None,
65
+ mcx_mode: str = "noancilla",
66
+ ) -> None:
67
+ """Create a new logical AND circuit.
68
+
69
+ Args:
70
+ num_variable_qubits: The qubits of which the AND is computed. The result will be written
71
+ into an additional result qubit.
72
+ flags: A list of +1/0/-1 marking negations or omissions of qubits.
73
+ mcx_mode: The mode to be used to implement the multi-controlled X gate.
74
+ """
75
+ self.num_variable_qubits = num_variable_qubits
76
+ self.flags = flags
77
+
78
+ # add registers
79
+ qr_variable = QuantumRegister(num_variable_qubits, name="variable")
80
+ qr_result = QuantumRegister(1, name="result")
81
+
82
+ circuit = QuantumCircuit(qr_variable, qr_result, name="and")
83
+
84
+ # determine the control qubits: all that have a nonzero flag
85
+ flags = flags or [1] * num_variable_qubits
86
+ control_qubits = [q for q, flag in zip(qr_variable, flags) if flag != 0]
87
+
88
+ # determine the qubits that need to be flipped (if a flag is < 0)
89
+ flip_qubits = [q for q, flag in zip(qr_variable, flags) if flag < 0]
90
+
91
+ # determine the number of ancillas
92
+ num_ancillas = MCXGate.get_num_ancilla_qubits(len(control_qubits), mode=mcx_mode)
93
+ if num_ancillas > 0:
94
+ qr_ancilla = AncillaRegister(num_ancillas, "ancilla")
95
+ circuit.add_register(qr_ancilla)
96
+ else:
97
+ qr_ancilla = AncillaRegister(0)
98
+
99
+ if len(flip_qubits) > 0:
100
+ circuit.x(flip_qubits)
101
+ circuit.mcx(control_qubits, qr_result[:], qr_ancilla[:], mode=mcx_mode)
102
+ if len(flip_qubits) > 0:
103
+ circuit.x(flip_qubits)
104
+
105
+ super().__init__(*circuit.qregs, name="and")
106
+ self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
107
+
108
+
109
+ class AndGate(Gate):
110
+ r"""A gate representing the logical AND operation on a number of qubits.
111
+
112
+ For the AND operation the state :math:`|1\rangle` is interpreted as ``True``. The result
113
+ qubit is flipped, if the state of all variable qubits is ``True``. In this format, the AND
114
+ operation equals a multi-controlled X gate, which is controlled on all variable qubits.
115
+ Using a list of flags however, qubits can be skipped or negated. Practically, the flags
116
+ allow to skip controls or to apply pre- and post-X gates to the negated qubits.
117
+
118
+ The AndGate gate without special flags equals the multi-controlled-X gate:
119
+
120
+ .. plot::
121
+ :alt: Diagram illustrating the previously described circuit.
122
+
123
+ from qiskit.circuit import QuantumCircuit
124
+ from qiskit.circuit.library import AndGate
125
+ from qiskit.visualization.library import _generate_circuit_library_visualization
126
+ circuit = QuantumCircuit(6)
127
+ circuit.append(AndGate(5), [0, 1, 2, 3, 4, 5])
128
+ _generate_circuit_library_visualization(circuit)
129
+
130
+ Using flags we can negate qubits or skip them. For instance, if we have 5 qubits and want to
131
+ return ``True`` if the first qubit is ``False`` and the last two are ``True`` we use the flags
132
+ ``[-1, 0, 0, 1, 1]``.
133
+
134
+ .. plot::
135
+ :alt: Diagram illustrating the previously described circuit.
136
+
137
+ from qiskit.circuit import QuantumCircuit
138
+ from qiskit.circuit.library import AndGate
139
+ from qiskit.visualization.library import _generate_circuit_library_visualization
140
+ circuit = QuantumCircuit(6)
141
+ circuit.append(AndGate(5, flags=[-1, 0, 0, 1, 1]), [0, 1, 2, 3, 4, 5])
142
+ _generate_circuit_library_visualization(circuit)
143
+
144
+ """
145
+
146
+ def __init__(
147
+ self,
148
+ num_variable_qubits: int,
149
+ flags: list[int] | None = None,
150
+ ) -> None:
151
+ """
152
+ Args:
153
+ num_variable_qubits: The qubits of which the AND is computed. The result will be written
154
+ into an additional result qubit.
155
+ flags: A list of +1/0/-1 marking negations or omissions of qubits.
156
+ """
157
+ super().__init__("and", num_variable_qubits + 1, [])
158
+ self.num_variable_qubits = num_variable_qubits
159
+ self.flags = flags
160
+
161
+ def _define(self):
162
+ # add registers
163
+ qr_variable = QuantumRegister(self.num_variable_qubits, name="variable")
164
+ qr_result = QuantumRegister(1, name="result")
165
+
166
+ # determine the control qubits: all that have a nonzero flag
167
+ flags = self.flags or [1] * self.num_variable_qubits
168
+ control_qubits = [q for q, flag in zip(qr_variable, flags) if flag != 0]
169
+
170
+ # determine the qubits that need to be flipped (if a flag is < 0)
171
+ flip_qubits = [q for q, flag in zip(qr_variable, flags) if flag < 0]
172
+
173
+ # create the definition circuit
174
+ circuit = QuantumCircuit(qr_variable, qr_result, name="and")
175
+
176
+ if len(flip_qubits) > 0:
177
+ circuit.x(flip_qubits)
178
+ circuit.mcx(control_qubits, qr_result[:])
179
+ if len(flip_qubits) > 0:
180
+ circuit.x(flip_qubits)
181
+
182
+ self.definition = circuit
183
+
184
+ # pylint: disable=unused-argument
185
+ def inverse(self, annotated: bool = False):
186
+ r"""Return inverted AND gate (itself).
187
+
188
+ Args:
189
+ annotated: when set to ``True``, this is typically used to return an
190
+ :class:`.AnnotatedOperation` with an inverse modifier set instead of a concrete
191
+ :class:`.Gate`. However, for this class this argument is ignored as this gate
192
+ is self-inverse.
193
+
194
+ Returns:
195
+ AndGate: inverse gate (self-inverse).
196
+ """
197
+ return AndGate(self.num_variable_qubits, self.flags)
198
+
199
+ def __eq__(self, other):
200
+ return (
201
+ isinstance(other, AndGate)
202
+ and self.num_variable_qubits == other.num_variable_qubits
203
+ and self.flags == other.flags
204
+ )