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,231 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """A class for parsing and synthesizing boolean expressions"""
14
+
15
+ import ast
16
+ import itertools
17
+ import re
18
+ from os.path import isfile
19
+ from typing import Union, Callable
20
+ import numpy as np
21
+
22
+ from .boolean_expression_visitor import (
23
+ BooleanExpressionEvalVisitor,
24
+ BooleanExpressionArgsCollectorVisitor,
25
+ )
26
+
27
+
28
+ class TruthTable:
29
+ """A simple implementation of a truth table for a boolean function
30
+
31
+ The truth table is built from a callable which takes an assignment, which
32
+ is a tuple of boolean values of a fixed given length (the number of bits
33
+ of the truth table) and returns a boolean value.
34
+
35
+ For a number of bits at most `EXPLICIT_REP_THRESHOLD` the values of the table
36
+ are explicitly computed and stored. Otherwise, the values are computed on the fly
37
+ and stored in a dictionary."""
38
+
39
+ EXPLICIT_REP_THRESHOLD = (
40
+ 12 # above this number of bits, do not explicitly save the values in a list
41
+ )
42
+
43
+ def __init__(self, func: Callable, num_bits: int):
44
+ self.func = func
45
+ self.num_bits = num_bits
46
+ self.explicit_storage = self.num_bits <= self.EXPLICIT_REP_THRESHOLD
47
+ if self.explicit_storage:
48
+ self.values = np.array(
49
+ [self.func(assignment) for assignment in self.all_assignments()],
50
+ dtype=bool,
51
+ )
52
+ else:
53
+ self.implicit_values = {}
54
+
55
+ def all_assignments(self) -> list[tuple[bool]]:
56
+ """Return an ordered list of all assignments, ordered from right to left
57
+ i.e. 000, 100, 010, 110, 001, 101, 011, 111"""
58
+ return [
59
+ tuple(reversed(assignment))
60
+ for assignment in itertools.product([False, True], repeat=self.num_bits)
61
+ ]
62
+
63
+ def __getitem__(self, key: Union[str, tuple[bool]]) -> bool:
64
+ if isinstance(key, str):
65
+ key = (bit != "0" for bit in key)
66
+ if self.explicit_storage:
67
+ key = sum(2**n for n, bit in enumerate(key) if bit)
68
+ return self.values[key]
69
+ else:
70
+ return self.implicit_values.setdefault(key, self.func(key))
71
+
72
+ def __str__(self) -> str:
73
+ if self.explicit_storage:
74
+ return "".join(
75
+ "1" if self[assignemnt] else "0" for assignemnt in self.all_assignments()
76
+ )
77
+ else:
78
+ return f"Truth table on {self.num_bits} bits (implicit representation)"
79
+
80
+
81
+ class BooleanExpression:
82
+ """A Boolean Expression"""
83
+
84
+ def __init__(self, expression: str, var_order: list = None) -> None:
85
+ """
86
+ Args:
87
+ expression (str): The logical expression string.
88
+ name (str): Optional. Instruction gate name. Otherwise part of the expression is
89
+ going to be used.
90
+ var_order(list): A list with the order in which variables will be created.
91
+ (default: by appearance)
92
+ """
93
+ self.expression = expression
94
+ self.expression_ast = ast.parse(expression)
95
+ args_collector = BooleanExpressionArgsCollectorVisitor()
96
+ args_collector.visit(self.expression_ast)
97
+ self.args = args_collector.get_sorted_args()
98
+ self.num_bits = len(self.args)
99
+ if var_order is not None:
100
+ missing_args = set(self.args) - set(var_order)
101
+ if len(missing_args) > 0:
102
+ raise ValueError(f"var_order missing the variable(s) {', '.join(missing_args)}")
103
+ self.args.sort(key=var_order.index)
104
+ self.truth_table_ = None
105
+
106
+ def simulate(self, bitstring: Union[str, tuple]) -> bool:
107
+ """Evaluate the expression on a bitstring.
108
+
109
+ This evaluation is done classically.
110
+
111
+ Args:
112
+ bitstring: The bitstring for which to evaluate,
113
+ either as a string of 0 and 1 or a tuple of booleans.
114
+
115
+ Returns:
116
+ bool: result of the evaluation.
117
+ """
118
+ if self.num_bits != len(bitstring):
119
+ raise ValueError(
120
+ f"bitstring length differs from the number of variables "
121
+ f"({len(bitstring)} != {self.num_bits}"
122
+ )
123
+ if isinstance(bitstring, str):
124
+ bitstring = (bit != "0" for bit in bitstring)
125
+ eval_visitor = BooleanExpressionEvalVisitor()
126
+ eval_visitor.arg_values = dict(zip(self.args, bitstring))
127
+ return eval_visitor.visit(self.expression_ast)
128
+
129
+ @property
130
+ def truth_table(self) -> dict:
131
+ """Generates the full truth table for the expression
132
+ Returns:
133
+ dict: A dictionary mapping boolean assignments to the boolean result
134
+ """
135
+ if self.truth_table_ is None:
136
+ self.truth_table_ = TruthTable(self.simulate, self.num_bits)
137
+ return self.truth_table_
138
+
139
+ def synth(self, circuit_type: str = "bit"):
140
+ r"""Synthesize the logic network into a :class:`~qiskit.circuit.QuantumCircuit`.
141
+ There are two common types of circuits for a boolean function :math:`f(x)`:
142
+
143
+ 1. **Bit-flip oracles** which compute:
144
+
145
+ .. math::
146
+
147
+ |x\rangle|y\rangle |-> |x\rangle|f(x)\oplusy\rangle
148
+
149
+ 2. **Phase-flip** oracles which compute:
150
+
151
+ .. math::
152
+
153
+ |x\rangle |-> (-1)^{f(x)}|x\rangle
154
+
155
+ By default the bit-flip oracle is generated.
156
+
157
+ Args:
158
+ circuit_type: which type of oracle to create, 'bit' or 'phase' flip oracle.
159
+ Returns:
160
+ QuantumCircuit: A circuit implementing the logic network.
161
+ Raises:
162
+ ValueError: If ``circuit_type`` is not either 'bit' or 'phase'.
163
+ """
164
+ # pylint: disable=cyclic-import
165
+ from .boolean_expression_synth import (
166
+ synth_bit_oracle_from_esop,
167
+ synth_phase_oracle_from_esop,
168
+ EsopGenerator,
169
+ ) # import here to avoid cyclic import
170
+
171
+ # generating the esop currntly requires generating the full truth table
172
+ # there are many optimizations that can be done to improve this step
173
+ esop = EsopGenerator(self.truth_table).esop
174
+ if circuit_type == "bit":
175
+ return synth_bit_oracle_from_esop(esop, self.num_bits + 1)
176
+ if circuit_type == "phase":
177
+ return synth_phase_oracle_from_esop(esop, self.num_bits)
178
+ raise ValueError("'circuit_type' must be either 'bit' or 'phase'")
179
+
180
+ @staticmethod
181
+ def from_dimacs(dimacs: str):
182
+ """Create a BooleanExpression from a string in the DIMACS format.
183
+ Args:
184
+ dimacs : A string in DIMACS format.
185
+
186
+ Returns:
187
+ BooleanExpression: A gate for the input string
188
+
189
+ Raises:
190
+ ValueError: If the string is not formatted according to DIMACS rules
191
+ """
192
+ header_regex = re.compile(r"p\s+cnf\s+(\d+)\s+(\d+)")
193
+ clause_regex = re.compile(r"(-?\d+)")
194
+ lines = [
195
+ line for line in dimacs.split("\n") if not line.startswith("c") and line != ""
196
+ ] # DIMACS comment line start with c
197
+ header_match = header_regex.match(lines[0])
198
+ if not header_match:
199
+ raise ValueError("First line must start with 'p cnf'")
200
+ num_vars, _ = map(int, header_match.groups())
201
+ variables = [f"x{i+1}" for i in range(num_vars)]
202
+ clauses = []
203
+ for line in lines[1:]:
204
+ literals = clause_regex.findall(line)
205
+ if len(literals) == 0 or literals[-1] != "0":
206
+ continue
207
+ clauses.append([int(c) for c in literals[:-1]])
208
+ clause_strings = [
209
+ " | ".join([f'{"~" if lit < 0 else ""}{variables[abs(lit)-1]}' for lit in clause])
210
+ for clause in clauses
211
+ ]
212
+ expr = " & ".join([f"({c})" for c in clause_strings])
213
+ return BooleanExpression(expr, var_order=variables)
214
+
215
+ @staticmethod
216
+ def from_dimacs_file(filename: str):
217
+ """Create a BooleanExpression from a file in the DIMACS format.
218
+ Args:
219
+ filename: A file in DIMACS format.
220
+
221
+ Returns:
222
+ BooleanExpression: A gate for the input string
223
+
224
+ Raises:
225
+ FileNotFoundError: If filename is not found.
226
+ """
227
+ if not isfile(filename):
228
+ raise FileNotFoundError(f"The file {filename} does not exists.")
229
+ with open(filename, "r") as dimacs_file:
230
+ dimacs = dimacs_file.read()
231
+ return BooleanExpression.from_dimacs(dimacs)
@@ -0,0 +1,124 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2025.
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
+ """Circuit synthesizers and related classes for boolean expressions"""
13
+
14
+ import itertools
15
+ from qiskit.circuit import QuantumCircuit
16
+ from qiskit.circuit.library import ZGate, XGate
17
+
18
+
19
+ class EsopGenerator:
20
+ """Generates an ESOP (Exlusive-sum-of-products) representation
21
+ for a boolean function given by its truth table"""
22
+
23
+ def __init__(self, truth_table):
24
+ self.truth_table = truth_table
25
+ self.cofactor_table = {}
26
+ self.esop = self.generate_esop(assignment=())
27
+
28
+ def clause_diff(self, clause1, clause2):
29
+ """The indices of variables where the clauses differ"""
30
+ return [i for i in range(len(clause1)) if clause1[i] != clause2[i]]
31
+
32
+ def combine_and_optimize(self, clauses_1, clauses_2):
33
+ """Combining clauses of distance 1 until no more combinations can be performed"""
34
+ something_changed = True
35
+ combined_clauses = clauses_1 + clauses_2
36
+ while something_changed:
37
+ something_changed = False
38
+ for clause_1, clause_2 in itertools.combinations(combined_clauses, 2):
39
+ diff = self.clause_diff(clause_1, clause_2)
40
+ if len(diff) == 1:
41
+ new_clause = clause_1[: diff[0]] + "-" + clause_1[diff[0] + 1 :]
42
+ if new_clause not in combined_clauses:
43
+ combined_clauses.remove(clause_1)
44
+ combined_clauses.remove(clause_2)
45
+ combined_clauses.append(new_clause)
46
+ something_changed = True
47
+ break
48
+ return combined_clauses
49
+
50
+ def generate_esop(self, assignment):
51
+ """Recursively generates an ESOP for a partially determined boolean expression
52
+ 'assignment' is a partial assignment to the expression's variables
53
+ """
54
+ # this base case is non-optimized;
55
+ # we may be able to terminate even before having a full assignment
56
+ if len(assignment) == self.truth_table.num_bits:
57
+ if self.truth_table[assignment]:
58
+ return ["-" * self.truth_table.num_bits] # True; a don't care clause
59
+ else:
60
+ return [] # False
61
+ i = len(assignment) # current variable
62
+ negative_esop = self.generate_esop(assignment + (False,))
63
+ positive_esop = self.generate_esop(assignment + (True,))
64
+ # Shannon's expansion
65
+ negative_esop_bool_expanded = [
66
+ clause[:i] + "0" + clause[i + 1 :] for clause in negative_esop
67
+ ]
68
+ positive_esop_bool_expanded = [
69
+ clause[:i] + "1" + clause[i + 1 :] for clause in positive_esop
70
+ ]
71
+ self.cofactor_table[assignment] = self.combine_and_optimize(
72
+ negative_esop_bool_expanded, positive_esop_bool_expanded
73
+ )
74
+ return self.cofactor_table[assignment]
75
+
76
+
77
+ def synth_phase_oracle_from_esop(esop, num_qubits):
78
+ """
79
+ Generates a phase oracle for the boolean function f given in ESOP (Exlusive sum of products) form
80
+ esop is of the form ('01-1', '11-0', ...) etc
81
+ where 1 is the variable, 0 is negated variable and - is don't care
82
+ """
83
+ qc = QuantumCircuit(num_qubits)
84
+ clause_data = [
85
+ (zip(*[qubit_data for qubit_data in enumerate(clause) if qubit_data[1] != "-"]))
86
+ for clause in esop
87
+ ]
88
+ for qubit_indices, control_data in clause_data:
89
+ control_state = "".join(control_data)
90
+ if len(control_state) == 1: # single qubit; either Z or XZX
91
+ if control_state == "0":
92
+ qc.x(qubit_indices[0])
93
+ qc.z(qubit_indices[0])
94
+ if control_state == "0":
95
+ qc.x(qubit_indices[0])
96
+ else: # use custom controlled-Z gate
97
+ # we use the last qubit as the target, flipping it if the control is 0 for that qubit
98
+ gate = ZGate().control(len(qubit_indices) - 1, ctrl_state=control_state[:-1][::-1])
99
+ if control_state[-1] == "0":
100
+ qc.x(qubit_indices[-1])
101
+ qc.append(gate, qubit_indices)
102
+ if control_state[-1] == "0":
103
+ qc.x(qubit_indices[-1])
104
+ return qc
105
+
106
+
107
+ def synth_bit_oracle_from_esop(esop, num_qubits):
108
+ """
109
+ Generates a bit-flip oracle for the boolean function f given in ESOP (Exlusive sum of products) form
110
+ esop is of the form ('01-1', '11-0', ...) etc
111
+ where 1 is the variable, 0 is negated variable and - is don't care
112
+ """
113
+ output_index = num_qubits - 1
114
+ qc = QuantumCircuit(num_qubits)
115
+ clause_data = [
116
+ (zip(*[qubit_data for qubit_data in enumerate(clause) if qubit_data[1] != "-"]))
117
+ for clause in esop
118
+ ]
119
+ for qubit_indices, control_data in clause_data:
120
+ control_state = "".join(control_data)
121
+ # use custom controlled-X gate
122
+ gate = XGate().control(len(qubit_indices), ctrl_state=control_state[::-1])
123
+ qc.append(gate, qubit_indices + (output_index,))
124
+ return qc
@@ -0,0 +1,96 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2025.
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
+ """Node visitor as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor
14
+ This module is used internally by ``qiskit.synthesis.boolean.BooleanExpression``.
15
+ """
16
+
17
+ import ast
18
+ import _ast
19
+
20
+
21
+ class BooleanExpressionEvalVisitor(ast.NodeVisitor):
22
+ """Node visitor to compute the value of the expression, given the boolean values of the args
23
+ as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor"""
24
+
25
+ # pylint: disable=invalid-name
26
+ bitops = {
27
+ _ast.BitAnd: lambda values: values[0] and values[1],
28
+ _ast.And: lambda values: values[0] and values[1],
29
+ _ast.BitOr: lambda values: values[0] or values[1],
30
+ _ast.Or: lambda values: values[0] or values[1],
31
+ _ast.BitXor: lambda values: values[0] ^ values[1],
32
+ _ast.Not: lambda values: not values[0],
33
+ _ast.Invert: lambda values: not values[0],
34
+ }
35
+
36
+ def __init__(self):
37
+ self.arg_values = {}
38
+ super().__init__()
39
+
40
+ def bit_binop(self, op, values):
41
+ """Performs the operation, if it is recognized"""
42
+ op_type = type(op)
43
+ if op_type not in self.bitops:
44
+ raise ValueError(f"Unknown op: {op_type}")
45
+ return self.bitops[op_type](values)
46
+
47
+ def visit_BinOp(self, node):
48
+ """Handles ``&``, ``^``, and ``|``."""
49
+ return self.bit_binop(node.op, [self.visit(node.left), self.visit(node.right)])
50
+
51
+ def visit_UnaryOp(self, node):
52
+ """Handles ``~``."""
53
+ return self.bit_binop(node.op, [self.visit(node.operand)])
54
+
55
+ def visit_Name(self, node):
56
+ """Reduce variable names."""
57
+ if node.id not in self.arg_values:
58
+ raise ValueError(f"Undefined value for {node.id}")
59
+ return self.arg_values[node.id]
60
+
61
+ def visit_Module(self, node):
62
+ """Returns the value of the single expression comprising the boolean expression"""
63
+ if len(node.body) != 1 or not isinstance(node.body[0], ast.Expr):
64
+ raise ValueError("Incorrectly formatted boolean expression")
65
+ return self.visit(node.body[0])
66
+
67
+ def visit_Expr(self, node):
68
+ """Returns the value of the expression"""
69
+ return self.visit(node.value)
70
+
71
+ def generic_visit(self, node):
72
+ """Catch all for the unhandled nodes."""
73
+ raise ValueError(f"Unknown node: {type(node)}")
74
+
75
+
76
+ class BooleanExpressionArgsCollectorVisitor(ast.NodeVisitor):
77
+ """Node visitor to collect the name of the args of the expression
78
+ as defined in https://docs.python.org/3/library/ast.html#ast.NodeVisitor"""
79
+
80
+ # pylint: disable=invalid-name
81
+ def __init__(self):
82
+ self.args = set()
83
+ self.args_pos = {}
84
+ super().__init__()
85
+
86
+ def visit_Name(self, node):
87
+ """Collect arg name."""
88
+ self.args.add(node.id)
89
+ if node.id not in self.args_pos or (
90
+ self.args_pos[node.id] > (node.lineno, node.col_offset)
91
+ ):
92
+ self.args_pos[node.id] = (node.lineno, node.col_offset)
93
+
94
+ def get_sorted_args(self):
95
+ """Returns a list of the args, sorted by their appearance locations"""
96
+ return sorted(self.args, key=lambda arg: self.args_pos[arg])
@@ -0,0 +1,19 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2023.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Module containing clifford circuit synthesis."""
14
+
15
+ from .clifford_decompose_full import synth_clifford_full
16
+ from .clifford_decompose_ag import synth_clifford_ag
17
+ from .clifford_decompose_bm import synth_clifford_bm
18
+ from .clifford_decompose_greedy import synth_clifford_greedy
19
+ from .clifford_decompose_layers import synth_clifford_layers, synth_clifford_depth_lnn
@@ -0,0 +1,178 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021, 2022.
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
+ Circuit synthesis for the Clifford class.
14
+ """
15
+
16
+
17
+ # ---------------------------------------------------------------------
18
+ # Synthesis based on Aaronson & Gottesman decomposition
19
+ # ---------------------------------------------------------------------
20
+
21
+ import numpy as np
22
+
23
+ from qiskit.circuit import QuantumCircuit
24
+ from qiskit.quantum_info import Clifford
25
+ from qiskit.quantum_info.operators.symplectic.clifford_circuits import (
26
+ _append_cx,
27
+ _append_h,
28
+ _append_s,
29
+ _append_swap,
30
+ _append_x,
31
+ _append_z,
32
+ )
33
+ from .clifford_decompose_bm import synth_clifford_bm
34
+
35
+
36
+ def synth_clifford_ag(clifford: Clifford) -> QuantumCircuit:
37
+ """Decompose a :class:`.Clifford` operator into a :class:`.QuantumCircuit`
38
+ based on Aaronson-Gottesman method [1].
39
+
40
+ Args:
41
+ clifford: A Clifford operator.
42
+
43
+ Returns:
44
+ A circuit implementation of the Clifford.
45
+
46
+ References:
47
+ 1. S. Aaronson, D. Gottesman, *Improved Simulation of Stabilizer Circuits*,
48
+ Phys. Rev. A 70, 052328 (2004).
49
+ `arXiv:quant-ph/0406196 <https://arxiv.org/abs/quant-ph/0406196>`_
50
+ """
51
+ # Use 1-qubit decomposition method
52
+ if clifford.num_qubits == 1:
53
+ return synth_clifford_bm(clifford)
54
+
55
+ # Compose a circuit which we will convert to an instruction
56
+ circuit = QuantumCircuit(clifford.num_qubits, name=str(clifford))
57
+
58
+ # Make a copy of Clifford as we are going to do row reduction to
59
+ # reduce it to an identity
60
+ clifford_cpy = clifford.copy()
61
+
62
+ for i in range(clifford.num_qubits):
63
+ # put a 1 one into position by permuting and using Hadamards(i,i)
64
+ _set_qubit_x_true(clifford_cpy, circuit, i)
65
+ # make all entries in row i except ith equal to 0
66
+ # by using phase gate and CNOTS
67
+ _set_row_x_zero(clifford_cpy, circuit, i)
68
+ # treat Zs
69
+ _set_row_z_zero(clifford_cpy, circuit, i)
70
+
71
+ for i in range(clifford.num_qubits):
72
+ if clifford_cpy.destab_phase[i]:
73
+ _append_z(clifford_cpy, i)
74
+ circuit.z(i)
75
+ if clifford_cpy.stab_phase[i]:
76
+ _append_x(clifford_cpy, i)
77
+ circuit.x(i)
78
+ # Next we invert the circuit to undo the row reduction and return the
79
+ # result as a gate instruction
80
+ return circuit.inverse()
81
+
82
+
83
+ # ---------------------------------------------------------------------
84
+ # Helper functions for Aaronson & Gottesman decomposition
85
+ # ---------------------------------------------------------------------
86
+
87
+
88
+ def _set_qubit_x_true(clifford, circuit, qubit):
89
+ """Set destabilizer.X[qubit, qubit] to be True.
90
+
91
+ This is done by permuting columns l > qubit or if necessary applying
92
+ a Hadamard
93
+ """
94
+ x = clifford.destab_x[qubit]
95
+ z = clifford.destab_z[qubit]
96
+
97
+ if x[qubit]:
98
+ return
99
+
100
+ # Try to find non-zero element
101
+ for i in range(qubit + 1, clifford.num_qubits):
102
+ if x[i]:
103
+ _append_swap(clifford, i, qubit)
104
+ circuit.swap(i, qubit)
105
+ return
106
+
107
+ # no non-zero element found: need to apply Hadamard somewhere
108
+ for i in range(qubit, clifford.num_qubits):
109
+ if z[i]:
110
+ _append_h(clifford, i)
111
+ circuit.h(i)
112
+ if i != qubit:
113
+ _append_swap(clifford, i, qubit)
114
+ circuit.swap(i, qubit)
115
+ return
116
+
117
+
118
+ def _set_row_x_zero(clifford, circuit, qubit):
119
+ r"""Set destabilizer.X[qubit, i] to False for all i > qubit.
120
+
121
+ This is done by applying CNOTs assuming :math:`k \leq N` and A[k][k]=1
122
+ """
123
+ x = clifford.destab_x[qubit]
124
+ z = clifford.destab_z[qubit]
125
+
126
+ # Check X first
127
+ for i in range(qubit + 1, clifford.num_qubits):
128
+ if x[i]:
129
+ _append_cx(clifford, qubit, i)
130
+ circuit.cx(qubit, i)
131
+
132
+ # Check whether Zs need to be set to zero:
133
+ if np.any(z[qubit:]):
134
+ if not z[qubit]:
135
+ # to treat Zs: make sure row.Z[k] to True
136
+ _append_s(clifford, qubit)
137
+ circuit.s(qubit)
138
+
139
+ # reverse CNOTS
140
+ for i in range(qubit + 1, clifford.num_qubits):
141
+ if z[i]:
142
+ _append_cx(clifford, i, qubit)
143
+ circuit.cx(i, qubit)
144
+ # set row.Z[qubit] to False
145
+ _append_s(clifford, qubit)
146
+ circuit.s(qubit)
147
+
148
+
149
+ def _set_row_z_zero(clifford, circuit, qubit):
150
+ """Set stabilizer.Z[qubit, i] to False for all i > qubit.
151
+
152
+ Implemented by applying (reverse) CNOTS assumes qubit < num_qubits
153
+ and _set_row_x_zero has been called first
154
+ """
155
+
156
+ x = clifford.stab_x[qubit]
157
+ z = clifford.stab_z[qubit]
158
+
159
+ # check whether Zs need to be set to zero:
160
+ if np.any(z[qubit + 1 :]):
161
+ for i in range(qubit + 1, clifford.num_qubits):
162
+ if z[i]:
163
+ _append_cx(clifford, i, qubit)
164
+ circuit.cx(i, qubit)
165
+
166
+ # check whether Xs need to be set to zero:
167
+ if np.any(x[qubit:]):
168
+ _append_h(clifford, qubit)
169
+ circuit.h(qubit)
170
+ for i in range(qubit + 1, clifford.num_qubits):
171
+ if x[i]:
172
+ _append_cx(clifford, qubit, i)
173
+ circuit.cx(qubit, i)
174
+ if z[qubit]:
175
+ _append_s(clifford, qubit)
176
+ circuit.s(qubit)
177
+ _append_h(clifford, qubit)
178
+ circuit.h(qubit)
@@ -0,0 +1,46 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021, 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
+ Circuit synthesis for 2-qubit and 3-qubit Cliffords based on Bravyi & Maslov
14
+ decomposition.
15
+ """
16
+
17
+ from qiskit.circuit import QuantumCircuit
18
+ from qiskit.quantum_info import Clifford
19
+
20
+ from qiskit._accelerate.synthesis.clifford import (
21
+ synth_clifford_bm as synth_clifford_bm_inner,
22
+ )
23
+
24
+
25
+ def synth_clifford_bm(clifford: Clifford) -> QuantumCircuit:
26
+ """Optimal CX-cost decomposition of a :class:`.Clifford` operator on 2 qubits
27
+ or 3 qubits into a :class:`.QuantumCircuit` based on the Bravyi-Maslov method [1].
28
+
29
+ Args:
30
+ clifford: A Clifford operator.
31
+
32
+ Returns:
33
+ A circuit implementation of the Clifford.
34
+
35
+ Raises:
36
+ QiskitError: if Clifford is on more than 3 qubits.
37
+
38
+ References:
39
+ 1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
40
+ structure of the Clifford group*,
41
+ `arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
42
+ """
43
+ circuit = QuantumCircuit._from_circuit_data(
44
+ synth_clifford_bm_inner(clifford.tableau.astype(bool)), add_regs=True, name=str(clifford)
45
+ )
46
+ return circuit