qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +141 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1343 -0
  6. qiskit/circuit/_add_control.py +312 -0
  7. qiskit/circuit/_classical_resource_map.py +150 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/barrier.py +46 -0
  12. qiskit/circuit/classical/__init__.py +41 -0
  13. qiskit/circuit/classical/expr/__init__.py +266 -0
  14. qiskit/circuit/classical/expr/constructors.py +764 -0
  15. qiskit/circuit/classical/expr/expr.py +498 -0
  16. qiskit/circuit/classical/expr/visitors.py +375 -0
  17. qiskit/circuit/classical/types/__init__.py +113 -0
  18. qiskit/circuit/classical/types/ordering.py +229 -0
  19. qiskit/circuit/classical/types/types.py +153 -0
  20. qiskit/circuit/commutation_checker.py +133 -0
  21. qiskit/circuit/commutation_library.py +20 -0
  22. qiskit/circuit/controlflow/__init__.py +59 -0
  23. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  24. qiskit/circuit/controlflow/box.py +163 -0
  25. qiskit/circuit/controlflow/break_loop.py +56 -0
  26. qiskit/circuit/controlflow/builder.py +791 -0
  27. qiskit/circuit/controlflow/continue_loop.py +56 -0
  28. qiskit/circuit/controlflow/control_flow.py +94 -0
  29. qiskit/circuit/controlflow/for_loop.py +218 -0
  30. qiskit/circuit/controlflow/if_else.py +498 -0
  31. qiskit/circuit/controlflow/switch_case.py +411 -0
  32. qiskit/circuit/controlflow/while_loop.py +166 -0
  33. qiskit/circuit/controlledgate.py +274 -0
  34. qiskit/circuit/delay.py +157 -0
  35. qiskit/circuit/duration.py +80 -0
  36. qiskit/circuit/equivalence.py +94 -0
  37. qiskit/circuit/equivalence_library.py +18 -0
  38. qiskit/circuit/exceptions.py +19 -0
  39. qiskit/circuit/gate.py +261 -0
  40. qiskit/circuit/instruction.py +564 -0
  41. qiskit/circuit/instructionset.py +132 -0
  42. qiskit/circuit/library/__init__.py +984 -0
  43. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  44. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  45. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  46. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  47. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  48. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  49. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  50. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  51. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  52. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  53. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  54. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  55. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  56. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  57. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  58. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
  59. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
  60. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
  61. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  62. qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
  63. qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
  64. qiskit/circuit/library/basis_change/__init__.py +15 -0
  65. qiskit/circuit/library/basis_change/qft.py +316 -0
  66. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  67. qiskit/circuit/library/blueprintcircuit.py +316 -0
  68. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  69. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  70. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  71. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  72. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  73. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  74. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  75. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  76. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  77. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  78. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  79. qiskit/circuit/library/fourier_checking.py +160 -0
  80. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  81. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  82. qiskit/circuit/library/generalized_gates/gms.py +175 -0
  83. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  84. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  85. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  86. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  87. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  88. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  89. qiskit/circuit/library/generalized_gates/permutation.py +198 -0
  90. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  91. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  92. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  93. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  94. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  96. qiskit/circuit/library/generalized_gates/unitary.py +217 -0
  97. qiskit/circuit/library/graph_state.py +172 -0
  98. qiskit/circuit/library/grover_operator.py +583 -0
  99. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  100. qiskit/circuit/library/hidden_linear_function.py +163 -0
  101. qiskit/circuit/library/iqp.py +180 -0
  102. qiskit/circuit/library/n_local/__init__.py +45 -0
  103. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  104. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  105. qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
  106. qiskit/circuit/library/n_local/n_local.py +1477 -0
  107. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  108. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  109. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  110. qiskit/circuit/library/n_local/two_local.py +289 -0
  111. qiskit/circuit/library/overlap.py +183 -0
  112. qiskit/circuit/library/pauli_evolution.py +201 -0
  113. qiskit/circuit/library/phase_estimation.py +177 -0
  114. qiskit/circuit/library/phase_oracle.py +239 -0
  115. qiskit/circuit/library/quantum_volume.py +180 -0
  116. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  117. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  118. qiskit/circuit/library/standard_gates/ecr.py +129 -0
  119. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  120. qiskit/circuit/library/standard_gates/global_phase.py +84 -0
  121. qiskit/circuit/library/standard_gates/h.py +253 -0
  122. qiskit/circuit/library/standard_gates/i.py +76 -0
  123. qiskit/circuit/library/standard_gates/iswap.py +133 -0
  124. qiskit/circuit/library/standard_gates/p.py +422 -0
  125. qiskit/circuit/library/standard_gates/r.py +114 -0
  126. qiskit/circuit/library/standard_gates/rx.py +293 -0
  127. qiskit/circuit/library/standard_gates/rxx.py +180 -0
  128. qiskit/circuit/library/standard_gates/ry.py +286 -0
  129. qiskit/circuit/library/standard_gates/ryy.py +180 -0
  130. qiskit/circuit/library/standard_gates/rz.py +307 -0
  131. qiskit/circuit/library/standard_gates/rzx.py +226 -0
  132. qiskit/circuit/library/standard_gates/rzz.py +193 -0
  133. qiskit/circuit/library/standard_gates/s.py +419 -0
  134. qiskit/circuit/library/standard_gates/swap.py +281 -0
  135. qiskit/circuit/library/standard_gates/sx.py +310 -0
  136. qiskit/circuit/library/standard_gates/t.py +178 -0
  137. qiskit/circuit/library/standard_gates/u.py +395 -0
  138. qiskit/circuit/library/standard_gates/u1.py +490 -0
  139. qiskit/circuit/library/standard_gates/u2.py +145 -0
  140. qiskit/circuit/library/standard_gates/u3.py +428 -0
  141. qiskit/circuit/library/standard_gates/x.py +1481 -0
  142. qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
  143. qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
  144. qiskit/circuit/library/standard_gates/y.py +257 -0
  145. qiskit/circuit/library/standard_gates/z.py +338 -0
  146. qiskit/circuit/library/templates/__init__.py +92 -0
  147. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  148. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  153. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  157. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  158. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  163. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  166. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  167. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  170. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  175. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  179. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  214. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  215. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  216. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  217. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  218. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  221. qiskit/circuit/measure.py +53 -0
  222. qiskit/circuit/operation.py +68 -0
  223. qiskit/circuit/parameter.py +179 -0
  224. qiskit/circuit/parameterexpression.py +703 -0
  225. qiskit/circuit/parametertable.py +119 -0
  226. qiskit/circuit/parametervector.py +140 -0
  227. qiskit/circuit/quantumcircuit.py +7540 -0
  228. qiskit/circuit/quantumcircuitdata.py +136 -0
  229. qiskit/circuit/random/__init__.py +15 -0
  230. qiskit/circuit/random/utils.py +366 -0
  231. qiskit/circuit/reset.py +37 -0
  232. qiskit/circuit/singleton.py +600 -0
  233. qiskit/circuit/store.py +89 -0
  234. qiskit/circuit/tools/__init__.py +16 -0
  235. qiskit/circuit/tools/pi_check.py +193 -0
  236. qiskit/circuit/twirling.py +145 -0
  237. qiskit/compiler/__init__.py +27 -0
  238. qiskit/compiler/transpiler.py +375 -0
  239. qiskit/converters/__init__.py +74 -0
  240. qiskit/converters/circuit_to_dag.py +80 -0
  241. qiskit/converters/circuit_to_dagdependency.py +49 -0
  242. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  243. qiskit/converters/circuit_to_gate.py +107 -0
  244. qiskit/converters/circuit_to_instruction.py +142 -0
  245. qiskit/converters/dag_to_circuit.py +79 -0
  246. qiskit/converters/dag_to_dagdependency.py +54 -0
  247. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  248. qiskit/converters/dagdependency_to_circuit.py +40 -0
  249. qiskit/converters/dagdependency_to_dag.py +48 -0
  250. qiskit/dagcircuit/__init__.py +55 -0
  251. qiskit/dagcircuit/collect_blocks.py +407 -0
  252. qiskit/dagcircuit/dagcircuit.py +24 -0
  253. qiskit/dagcircuit/dagdependency.py +612 -0
  254. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  255. qiskit/dagcircuit/dagdepnode.py +160 -0
  256. qiskit/dagcircuit/dagnode.py +188 -0
  257. qiskit/dagcircuit/exceptions.py +42 -0
  258. qiskit/exceptions.py +153 -0
  259. qiskit/passmanager/__init__.py +258 -0
  260. qiskit/passmanager/base_tasks.py +230 -0
  261. qiskit/passmanager/compilation_status.py +74 -0
  262. qiskit/passmanager/exceptions.py +19 -0
  263. qiskit/passmanager/flow_controllers.py +116 -0
  264. qiskit/passmanager/passmanager.py +353 -0
  265. qiskit/primitives/__init__.py +490 -0
  266. qiskit/primitives/backend_estimator_v2.py +530 -0
  267. qiskit/primitives/backend_sampler_v2.py +339 -0
  268. qiskit/primitives/base/__init__.py +20 -0
  269. qiskit/primitives/base/base_estimator.py +247 -0
  270. qiskit/primitives/base/base_primitive_job.py +78 -0
  271. qiskit/primitives/base/base_primitive_v1.py +45 -0
  272. qiskit/primitives/base/base_result_v1.py +65 -0
  273. qiskit/primitives/base/base_sampler.py +196 -0
  274. qiskit/primitives/base/estimator_result_v1.py +46 -0
  275. qiskit/primitives/base/sampler_result_v1.py +45 -0
  276. qiskit/primitives/base/validation_v1.py +250 -0
  277. qiskit/primitives/containers/__init__.py +26 -0
  278. qiskit/primitives/containers/bindings_array.py +391 -0
  279. qiskit/primitives/containers/bit_array.py +764 -0
  280. qiskit/primitives/containers/data_bin.py +175 -0
  281. qiskit/primitives/containers/estimator_pub.py +222 -0
  282. qiskit/primitives/containers/object_array.py +94 -0
  283. qiskit/primitives/containers/observables_array.py +296 -0
  284. qiskit/primitives/containers/primitive_result.py +53 -0
  285. qiskit/primitives/containers/pub_result.py +51 -0
  286. qiskit/primitives/containers/sampler_pub.py +193 -0
  287. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  288. qiskit/primitives/containers/shape.py +129 -0
  289. qiskit/primitives/primitive_job.py +81 -0
  290. qiskit/primitives/statevector_estimator.py +175 -0
  291. qiskit/primitives/statevector_sampler.py +290 -0
  292. qiskit/primitives/utils.py +72 -0
  293. qiskit/providers/__init__.py +677 -0
  294. qiskit/providers/backend.py +364 -0
  295. qiskit/providers/basic_provider/__init__.py +47 -0
  296. qiskit/providers/basic_provider/basic_provider.py +121 -0
  297. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  298. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  299. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  300. qiskit/providers/basic_provider/exceptions.py +30 -0
  301. qiskit/providers/exceptions.py +33 -0
  302. qiskit/providers/fake_provider/__init__.py +69 -0
  303. qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
  304. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  305. qiskit/providers/job.py +147 -0
  306. qiskit/providers/jobstatus.py +30 -0
  307. qiskit/providers/options.py +273 -0
  308. qiskit/providers/providerutils.py +110 -0
  309. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  310. qiskit/qasm/libs/qelib1.inc +266 -0
  311. qiskit/qasm/libs/stdgates.inc +82 -0
  312. qiskit/qasm2/__init__.py +669 -0
  313. qiskit/qasm2/exceptions.py +27 -0
  314. qiskit/qasm2/export.py +364 -0
  315. qiskit/qasm2/parse.py +438 -0
  316. qiskit/qasm3/__init__.py +372 -0
  317. qiskit/qasm3/ast.py +782 -0
  318. qiskit/qasm3/exceptions.py +27 -0
  319. qiskit/qasm3/experimental.py +70 -0
  320. qiskit/qasm3/exporter.py +1340 -0
  321. qiskit/qasm3/printer.py +608 -0
  322. qiskit/qpy/__init__.py +1965 -0
  323. qiskit/qpy/binary_io/__init__.py +35 -0
  324. qiskit/qpy/binary_io/circuits.py +1455 -0
  325. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  326. qiskit/qpy/binary_io/schedules.py +308 -0
  327. qiskit/qpy/binary_io/value.py +1165 -0
  328. qiskit/qpy/common.py +353 -0
  329. qiskit/qpy/exceptions.py +53 -0
  330. qiskit/qpy/formats.py +442 -0
  331. qiskit/qpy/interface.py +344 -0
  332. qiskit/qpy/type_keys.py +409 -0
  333. qiskit/quantum_info/__init__.py +162 -0
  334. qiskit/quantum_info/analysis/__init__.py +17 -0
  335. qiskit/quantum_info/analysis/average.py +47 -0
  336. qiskit/quantum_info/analysis/distance.py +104 -0
  337. qiskit/quantum_info/analysis/make_observable.py +44 -0
  338. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  339. qiskit/quantum_info/operators/__init__.py +28 -0
  340. qiskit/quantum_info/operators/base_operator.py +145 -0
  341. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  342. qiskit/quantum_info/operators/channel/chi.py +191 -0
  343. qiskit/quantum_info/operators/channel/choi.py +218 -0
  344. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  345. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  346. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  347. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  348. qiskit/quantum_info/operators/channel/superop.py +373 -0
  349. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  350. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  351. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  352. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  354. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  355. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  356. qiskit/quantum_info/operators/linear_op.py +25 -0
  357. qiskit/quantum_info/operators/measures.py +418 -0
  358. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  359. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  360. qiskit/quantum_info/operators/mixins/group.py +171 -0
  361. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  362. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  363. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  364. qiskit/quantum_info/operators/op_shape.py +525 -0
  365. qiskit/quantum_info/operators/operator.py +869 -0
  366. qiskit/quantum_info/operators/operator_utils.py +76 -0
  367. qiskit/quantum_info/operators/predicates.py +183 -0
  368. qiskit/quantum_info/operators/random.py +154 -0
  369. qiskit/quantum_info/operators/scalar_op.py +254 -0
  370. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  371. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  372. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  373. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  374. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  375. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  377. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  378. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  379. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  380. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  381. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  383. qiskit/quantum_info/quaternion.py +156 -0
  384. qiskit/quantum_info/random.py +26 -0
  385. qiskit/quantum_info/states/__init__.py +28 -0
  386. qiskit/quantum_info/states/densitymatrix.py +857 -0
  387. qiskit/quantum_info/states/measures.py +288 -0
  388. qiskit/quantum_info/states/quantum_state.py +503 -0
  389. qiskit/quantum_info/states/random.py +157 -0
  390. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  391. qiskit/quantum_info/states/statevector.py +977 -0
  392. qiskit/quantum_info/states/utils.py +247 -0
  393. qiskit/result/__init__.py +61 -0
  394. qiskit/result/counts.py +189 -0
  395. qiskit/result/distributions/__init__.py +17 -0
  396. qiskit/result/distributions/probability.py +100 -0
  397. qiskit/result/distributions/quasi.py +154 -0
  398. qiskit/result/exceptions.py +40 -0
  399. qiskit/result/models.py +241 -0
  400. qiskit/result/postprocess.py +239 -0
  401. qiskit/result/result.py +385 -0
  402. qiskit/result/sampled_expval.py +74 -0
  403. qiskit/result/utils.py +294 -0
  404. qiskit/synthesis/__init__.py +240 -0
  405. qiskit/synthesis/arithmetic/__init__.py +18 -0
  406. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  407. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  408. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  409. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  410. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  411. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  412. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  413. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  414. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  415. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  416. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  417. qiskit/synthesis/boolean/__init__.py +13 -0
  418. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  419. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  420. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  421. qiskit/synthesis/clifford/__init__.py +19 -0
  422. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  423. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  424. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  425. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  426. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  427. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  428. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  429. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  431. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  432. qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
  433. qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +120 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +313 -0
  442. qiskit/synthesis/evolution/qdrift.py +130 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +25 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +288 -0
  495. qiskit/transpiler/__init__.py +1345 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +281 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +276 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +177 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  556. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  557. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  558. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  559. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  560. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  561. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  562. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  563. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  564. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  565. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  566. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  567. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
  569. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  570. qiskit/transpiler/passes/routing/__init__.py +21 -0
  571. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  572. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  573. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  574. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  575. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  576. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  581. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  582. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  583. qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
  584. qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
  585. qiskit/transpiler/passes/routing/utils.py +35 -0
  586. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  587. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  588. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  589. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  590. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  591. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  592. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  593. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  594. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  595. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  599. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  600. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  601. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  602. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  603. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  604. qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
  605. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  606. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  607. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
  608. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  609. qiskit/transpiler/passes/utils/__init__.py +32 -0
  610. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  611. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  612. qiskit/transpiler/passes/utils/check_map.py +78 -0
  613. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  614. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  615. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  616. qiskit/transpiler/passes/utils/error.py +69 -0
  617. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  618. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  619. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  620. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  621. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  622. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  623. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  624. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  625. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  626. qiskit/transpiler/passmanager.py +503 -0
  627. qiskit/transpiler/passmanager_config.py +151 -0
  628. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  629. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
  630. qiskit/transpiler/preset_passmanagers/common.py +672 -0
  631. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
  632. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  633. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  634. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  635. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  636. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  637. qiskit/transpiler/target.py +905 -0
  638. qiskit/transpiler/timing_constraints.py +59 -0
  639. qiskit/user_config.py +266 -0
  640. qiskit/utils/__init__.py +90 -0
  641. qiskit/utils/classtools.py +146 -0
  642. qiskit/utils/deprecation.py +382 -0
  643. qiskit/utils/lazy_tester.py +363 -0
  644. qiskit/utils/optionals.py +354 -0
  645. qiskit/utils/parallel.py +318 -0
  646. qiskit/utils/units.py +146 -0
  647. qiskit/version.py +84 -0
  648. qiskit/visualization/__init__.py +290 -0
  649. qiskit/visualization/array.py +207 -0
  650. qiskit/visualization/bloch.py +778 -0
  651. qiskit/visualization/circuit/__init__.py +15 -0
  652. qiskit/visualization/circuit/_utils.py +675 -0
  653. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  654. qiskit/visualization/circuit/latex.py +661 -0
  655. qiskit/visualization/circuit/matplotlib.py +2019 -0
  656. qiskit/visualization/circuit/qcstyle.py +278 -0
  657. qiskit/visualization/circuit/styles/__init__.py +13 -0
  658. qiskit/visualization/circuit/styles/bw.json +202 -0
  659. qiskit/visualization/circuit/styles/clifford.json +202 -0
  660. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  661. qiskit/visualization/circuit/styles/iqp.json +214 -0
  662. qiskit/visualization/circuit/styles/textbook.json +202 -0
  663. qiskit/visualization/circuit/text.py +1849 -0
  664. qiskit/visualization/circuit_visualization.py +19 -0
  665. qiskit/visualization/counts_visualization.py +487 -0
  666. qiskit/visualization/dag_visualization.py +318 -0
  667. qiskit/visualization/exceptions.py +21 -0
  668. qiskit/visualization/gate_map.py +1424 -0
  669. qiskit/visualization/library.py +40 -0
  670. qiskit/visualization/pass_manager_visualization.py +312 -0
  671. qiskit/visualization/state_visualization.py +1546 -0
  672. qiskit/visualization/timeline/__init__.py +21 -0
  673. qiskit/visualization/timeline/core.py +495 -0
  674. qiskit/visualization/timeline/drawings.py +260 -0
  675. qiskit/visualization/timeline/generators.py +506 -0
  676. qiskit/visualization/timeline/interface.py +444 -0
  677. qiskit/visualization/timeline/layouts.py +115 -0
  678. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  679. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  680. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  681. qiskit/visualization/timeline/stylesheet.py +301 -0
  682. qiskit/visualization/timeline/types.py +148 -0
  683. qiskit/visualization/transition_visualization.py +369 -0
  684. qiskit/visualization/utils.py +49 -0
  685. qiskit-2.0.3.dist-info/METADATA +220 -0
  686. qiskit-2.0.3.dist-info/RECORD +690 -0
  687. qiskit-2.0.3.dist-info/WHEEL +6 -0
  688. qiskit-2.0.3.dist-info/entry_points.txt +82 -0
  689. qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
  690. qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,370 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2019.
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
+ # pylint: disable=invalid-name
14
+ # pylint: disable=unused-variable
15
+ # pylint: disable=missing-param-doc
16
+ # pylint: disable=missing-type-doc
17
+
18
+ """
19
+ Generic isometries from m to n qubits.
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import math
25
+ import numpy as np
26
+ from qiskit.circuit.exceptions import CircuitError
27
+ from qiskit.circuit.instruction import Instruction
28
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
29
+ from qiskit.circuit import QuantumRegister
30
+ from qiskit.exceptions import QiskitError
31
+ from qiskit.quantum_info.operators.predicates import is_isometry
32
+ from qiskit._accelerate import isometry as isometry_rs
33
+
34
+ from .diagonal import DiagonalGate
35
+ from .uc import UCGate
36
+ from .mcg_up_to_diagonal import MCGupDiag
37
+
38
+ _EPS = 1e-10 # global variable used to chop very small numbers to zero
39
+
40
+
41
+ class Isometry(Instruction):
42
+ r"""Decomposition of arbitrary isometries from :math:`m` to :math:`n` qubits.
43
+
44
+ In particular, this allows to decompose unitaries (m=n) and to do state preparation (:math:`m=0`).
45
+
46
+ The decomposition is based on [1].
47
+
48
+ References:
49
+ 1. Iten et al., Quantum circuits for isometries (2016).
50
+ `Phys. Rev. A 93, 032318
51
+ <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.93.032318>`__.
52
+
53
+ """
54
+
55
+ # Notation: In the following decomposition we label the qubit by
56
+ # 0 -> most significant one
57
+ # ...
58
+ # n -> least significant one
59
+ # finally, we convert the labels back to the qubit numbering used in Qiskit
60
+ # (using: _get_qubits_by_label)
61
+
62
+ def __init__(
63
+ self,
64
+ isometry: np.ndarray,
65
+ num_ancillas_zero: int,
66
+ num_ancillas_dirty: int,
67
+ epsilon: float = _EPS,
68
+ ) -> None:
69
+ r"""
70
+ Args:
71
+ isometry: An isometry from :math:`m` to :math`n` qubits, i.e., a complex
72
+ ``np.ndarray`` of dimension :math:`2^n \times 2^m` with orthonormal columns (given
73
+ in the computational basis specified by the order of the ancillas
74
+ and the input qubits, where the ancillas are considered to be more
75
+ significant than the input qubits).
76
+ num_ancillas_zero: Number of additional ancillas that start in the state :math:`|0\rangle`
77
+ (the :math:`n-m` ancillas required for providing the output of the isometry are
78
+ not accounted for here).
79
+ num_ancillas_dirty: Number of additional ancillas that start in an arbitrary state.
80
+ epsilon: Error tolerance of calculations.
81
+ """
82
+ # Convert to numpy array in case not already an array
83
+ isometry = np.array(isometry, dtype=complex)
84
+
85
+ # change a row vector to a column vector (in the case of state preparation)
86
+ if len(isometry.shape) == 1:
87
+ isometry = isometry.reshape(isometry.shape[0], 1)
88
+
89
+ self.iso_data = isometry
90
+
91
+ self.num_ancillas_zero = num_ancillas_zero
92
+ self.num_ancillas_dirty = num_ancillas_dirty
93
+ self._inverse = None
94
+ self._epsilon = epsilon
95
+
96
+ # Check if the isometry has the right dimension and if the columns are orthonormal
97
+ n = math.log2(isometry.shape[0])
98
+ m = math.log2(isometry.shape[1])
99
+ if not n.is_integer() or n < 0:
100
+ raise QiskitError(
101
+ "The number of rows of the isometry is not a non negative power of 2."
102
+ )
103
+ if not m.is_integer() or m < 0:
104
+ raise QiskitError(
105
+ "The number of columns of the isometry is not a non negative power of 2."
106
+ )
107
+ if m > n:
108
+ raise QiskitError(
109
+ "The input matrix has more columns than rows and hence it can't be an isometry."
110
+ )
111
+ if not is_isometry(isometry, self._epsilon):
112
+ raise QiskitError(
113
+ "The input matrix has non orthonormal columns and hence it is not an isometry."
114
+ )
115
+
116
+ num_qubits = int(n) + num_ancillas_zero + num_ancillas_dirty
117
+
118
+ super().__init__("isometry", num_qubits, 0, [isometry])
119
+
120
+ def _define(self):
121
+ # TODO The inverse().inverse() is because there is code to uncompute (_gates_to_uncompute)
122
+ # an isometry, but not for generating its decomposition. It would be cheaper to do the
123
+ # later here instead.
124
+ gate = self.inv_gate()
125
+ gate = gate.inverse()
126
+ q = QuantumRegister(self.num_qubits, "q")
127
+ iso_circuit = QuantumCircuit(q, name="isometry")
128
+ iso_circuit.append(gate, q[:])
129
+ self.definition = iso_circuit
130
+
131
+ def inverse(self, annotated: bool = False):
132
+ self.params = []
133
+ inv = super().inverse(annotated=annotated)
134
+ self.params = [self.iso_data]
135
+ return inv
136
+
137
+ def _gates_to_uncompute(self):
138
+ """
139
+ Call to create a circuit with gates that take the desired isometry to the first 2^m columns
140
+ of the 2^n*2^n identity matrix (see https://arxiv.org/abs/1501.06911)
141
+ """
142
+ q = QuantumRegister(self.num_qubits, "q")
143
+ circuit = QuantumCircuit(q, name="isometry_to_uncompute")
144
+ (
145
+ q_input,
146
+ q_ancillas_for_output,
147
+ q_ancillas_zero,
148
+ q_ancillas_dirty,
149
+ ) = self._define_qubit_role(q)
150
+ # Copy the isometry (this is computationally expensive for large isometries but guarantees
151
+ # to keep a copyof the input isometry)
152
+ remaining_isometry = self.iso_data.astype(complex) # note: "astype" does copy the isometry
153
+ diag = []
154
+ m = int(math.log2(self.iso_data.shape[1]))
155
+ # Decompose the column with index column_index and attache the gate to the circuit object.
156
+ # Return the isometry that is left to decompose, where the columns up to index column_index
157
+ # correspond to the firstfew columns of the identity matrix up to diag, and hence we only
158
+ # have to save a list containing them.
159
+ for column_index in range(2**m):
160
+ remaining_isometry, diag = self._decompose_column(
161
+ circuit, q, diag, remaining_isometry, column_index
162
+ )
163
+ # extract phase of the state that was sent to the basis state ket(column_index)
164
+ diag.append(remaining_isometry[column_index, 0])
165
+ # remove first column (which is now stored in diag)
166
+ remaining_isometry = remaining_isometry[:, 1:]
167
+ if len(diag) > 1 and not isometry_rs.diag_is_identity_up_to_global_phase(
168
+ diag, self._epsilon
169
+ ):
170
+ diagonal = DiagonalGate(np.conj(diag))
171
+ circuit.append(diagonal, q_input)
172
+ return circuit
173
+
174
+ def _decompose_column(self, circuit, q, diag, remaining_isometry, column_index):
175
+ """
176
+ Decomposes the column with index column_index.
177
+ """
178
+ n = int(math.log2(self.iso_data.shape[0]))
179
+ for s in range(n):
180
+ remaining_isometry, diag = self._disentangle(
181
+ circuit, q, diag, remaining_isometry, column_index, s
182
+ )
183
+ return remaining_isometry, diag
184
+
185
+ def _disentangle(self, circuit, q, diag, remaining_isometry, column_index, s):
186
+ """
187
+ Disentangle the s-th significant qubit (starting with s = 0) into the zero or the one state
188
+ (dependent on column_index)
189
+ """
190
+ # To shorten the notation, we introduce:
191
+ k = column_index
192
+ # k_prime is the index of the column with index column_index in the remaining isometry
193
+ # (note that we remove columns of the isometry during the procedure for efficiency)
194
+ k_prime = 0
195
+ v = remaining_isometry
196
+ n = int(math.log2(self.iso_data.shape[0]))
197
+
198
+ # MCG to set one entry to zero (preparation for disentangling with UCGate):
199
+ index1 = 2 * isometry_rs.a(k, s + 1) * 2**s + isometry_rs.b(k, s + 1)
200
+ index2 = (2 * isometry_rs.a(k, s + 1) + 1) * 2**s + isometry_rs.b(k, s + 1)
201
+ target_label = n - s - 1
202
+ # Check if a MCG is required
203
+ if (
204
+ isometry_rs.k_s(k, s) == 0
205
+ and isometry_rs.b(k, s + 1) != 0
206
+ and np.abs(v[index2, k_prime]) > self._epsilon
207
+ ):
208
+ # Find the MCG, decompose it and apply it to the remaining isometry
209
+ gate = isometry_rs.reverse_qubit_state(
210
+ [v[index1, k_prime], v[index2, k_prime]], 0, self._epsilon
211
+ )
212
+ control_labels = [
213
+ i
214
+ for i, x in enumerate(_get_binary_rep_as_list(k, n))
215
+ if x == 1 and i != target_label
216
+ ]
217
+ diagonal_mcg = self._append_mcg_up_to_diagonal(
218
+ circuit, q, gate, control_labels, target_label
219
+ )
220
+ # apply the MCG to the remaining isometry
221
+ v = isometry_rs.apply_multi_controlled_gate(v, control_labels, target_label, gate)
222
+ # correct for the implementation "up to diagonal"
223
+ diag_mcg_inverse = np.conj(diagonal_mcg).astype(complex, copy=False)
224
+ v = isometry_rs.apply_diagonal_gate(
225
+ v, control_labels + [target_label], diag_mcg_inverse
226
+ )
227
+ # update the diag according to the applied diagonal gate
228
+ diag = isometry_rs.apply_diagonal_gate_to_diag(
229
+ diag, control_labels + [target_label], diag_mcg_inverse, n
230
+ )
231
+
232
+ # UCGate to disentangle a qubit:
233
+ # Find the UCGate, decompose it and apply it to the remaining isometry
234
+ single_qubit_gates = self._find_squs_for_disentangling(v, k, s)
235
+ if not isometry_rs.ucg_is_identity_up_to_global_phase(single_qubit_gates, self._epsilon):
236
+ control_labels = list(range(target_label))
237
+ diagonal_ucg = self._append_ucg_up_to_diagonal(
238
+ circuit, q, single_qubit_gates, control_labels, target_label
239
+ )
240
+ # merge the diagonal into the UCGate for efficient application of both together
241
+ diagonal_ucg_inverse = np.conj(diagonal_ucg).astype(complex, copy=False)
242
+ single_qubit_gates = isometry_rs.merge_ucgate_and_diag(
243
+ single_qubit_gates, diagonal_ucg_inverse
244
+ )
245
+ # apply the UCGate (with the merged diagonal gate) to the remaining isometry
246
+ v = isometry_rs.apply_ucg(v, len(control_labels), single_qubit_gates)
247
+ # update the diag according to the applied diagonal gate
248
+ diag = isometry_rs.apply_diagonal_gate_to_diag(
249
+ diag, control_labels + [target_label], diagonal_ucg_inverse, n
250
+ )
251
+ # # correct for the implementation "up to diagonal"
252
+ # diag_inv = np.conj(diag).tolist()
253
+ # _apply_diagonal_gate(v, control_labels + [target_label], diag_inv)
254
+ return v, diag
255
+
256
+ # This method finds the single-qubit gates for a UCGate to disentangle a qubit:
257
+ # we consider the n-qubit state v[:,0] starting with k zeros (in the computational basis).
258
+ # The qubit with label n-s-1 is disentangled into the basis state k_s(k,s).
259
+ def _find_squs_for_disentangling(self, v, k, s):
260
+ res = isometry_rs.find_squs_for_disentangling(
261
+ v, k, s, self._epsilon, n=int(math.log2(self.iso_data.shape[0]))
262
+ )
263
+ return res
264
+
265
+ # Append a UCGate up to diagonal to the circuit circ.
266
+ def _append_ucg_up_to_diagonal(self, circ, q, single_qubit_gates, control_labels, target_label):
267
+ (
268
+ q_input,
269
+ q_ancillas_for_output,
270
+ q_ancillas_zero,
271
+ q_ancillas_dirty,
272
+ ) = self._define_qubit_role(q)
273
+ n = int(math.log2(self.iso_data.shape[0]))
274
+ qubits = q_input + q_ancillas_for_output
275
+ # Note that we have to reverse the control labels, since controls are provided by
276
+ # increasing qubit number toa UCGate by convention
277
+ control_qubits = _reverse_qubit_oder(_get_qubits_by_label(control_labels, qubits, n))
278
+ target_qubit = _get_qubits_by_label([target_label], qubits, n)[0]
279
+ ucg = UCGate(single_qubit_gates, up_to_diagonal=True)
280
+ circ.append(ucg, [target_qubit] + control_qubits)
281
+ return ucg._get_diagonal()
282
+
283
+ # Append a MCG up to diagonal to the circuit circ. The diagonal should only act on the control
284
+ # and target qubits and not on the ancillas. In principle, it would be allowed to act on the
285
+ # dirty ancillas on which we perform the isometry (i.e., on the qubits listed in "qubits"
286
+ # below). But for simplicity, the current code version ignores this future optimization
287
+ # possibility.
288
+ def _append_mcg_up_to_diagonal(self, circ, q, gate, control_labels, target_label):
289
+ (
290
+ q_input,
291
+ q_ancillas_for_output,
292
+ q_ancillas_zero,
293
+ q_ancillas_dirty,
294
+ ) = self._define_qubit_role(q)
295
+ n = int(math.log2(self.iso_data.shape[0]))
296
+ qubits = q_input + q_ancillas_for_output
297
+ control_qubits = _reverse_qubit_oder(_get_qubits_by_label(control_labels, qubits, n))
298
+ target_qubit = _get_qubits_by_label([target_label], qubits, n)[0]
299
+ # The qubits on which we neither act nor control on with the MCG, can be used
300
+ # as dirty ancillas
301
+ ancilla_dirty_labels = [i for i in range(n) if i not in control_labels + [target_label]]
302
+ ancillas_dirty = (
303
+ _reverse_qubit_oder(_get_qubits_by_label(ancilla_dirty_labels, qubits, n))
304
+ + q_ancillas_dirty
305
+ )
306
+ mcg_up_to_diag = MCGupDiag(
307
+ gate, len(control_qubits), len(q_ancillas_zero), len(ancillas_dirty)
308
+ )
309
+ circ.append(
310
+ mcg_up_to_diag, [target_qubit] + control_qubits + q_ancillas_zero + ancillas_dirty
311
+ )
312
+ return mcg_up_to_diag._get_diagonal()
313
+
314
+ def _define_qubit_role(self, q):
315
+
316
+ n = int(math.log2(self.iso_data.shape[0]))
317
+ m = int(math.log2(self.iso_data.shape[1]))
318
+
319
+ # Define the role of the qubits
320
+ q_input = q[:m]
321
+ q_ancillas_for_output = q[m:n]
322
+ q_ancillas_zero = q[n : n + self.num_ancillas_zero]
323
+ q_ancillas_dirty = q[n + self.num_ancillas_zero :]
324
+ return q_input, q_ancillas_for_output, q_ancillas_zero, q_ancillas_dirty
325
+
326
+ def validate_parameter(self, parameter):
327
+ """Isometry parameter has to be an ndarray."""
328
+ if isinstance(parameter, np.ndarray):
329
+ return parameter
330
+ if isinstance(parameter, (list, int)):
331
+ return parameter
332
+ else:
333
+ raise CircuitError(f"invalid param type {type(parameter)} for gate {self.name}")
334
+
335
+ def inv_gate(self):
336
+ """Return the adjoint of the unitary."""
337
+ if self._inverse is None:
338
+ # call to generate the circuit that takes the isometry to the first 2^m columns
339
+ # of the 2^n identity matrix
340
+ iso_circuit = self._gates_to_uncompute()
341
+ # invert the circuit to create the circuit implementing the isometry
342
+ self._inverse = iso_circuit.to_instruction()
343
+ return self._inverse
344
+
345
+
346
+ # Get the qubits in the list qubits corresponding to the labels listed in labels. The total number
347
+ # of qubits is given by num_qubits (and determines the convention for the qubit labeling)
348
+
349
+ # Remark: We labeled the qubits with decreasing significance. So we have to transform the labels to
350
+ # be compatible with the standard convention of Qiskit.
351
+
352
+
353
+ def _get_qubits_by_label(labels, qubits, num_qubits):
354
+ return [qubits[num_qubits - label - 1] for label in labels]
355
+
356
+
357
+ def _reverse_qubit_oder(qubits):
358
+ return list(reversed(qubits))
359
+
360
+
361
+ # Convert list of binary digits to integer
362
+
363
+
364
+ def _get_binary_rep_as_list(n, num_digits):
365
+ binary_string = np.binary_repr(n).zfill(num_digits)
366
+ binary = []
367
+ for line in binary_string:
368
+ for c in line:
369
+ binary.append(int(c))
370
+ return binary[-num_digits:]
@@ -0,0 +1,318 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Linear Function."""
14
+
15
+ from __future__ import annotations
16
+ import numpy as np
17
+ from qiskit.circuit.quantumcircuit import QuantumCircuit, Gate
18
+ from qiskit.circuit.exceptions import CircuitError
19
+ from qiskit.circuit.library.generalized_gates.permutation import PermutationGate
20
+ from qiskit.utils.deprecation import deprecate_func
21
+
22
+ # pylint: disable=cyclic-import
23
+ from qiskit.quantum_info import Clifford
24
+
25
+
26
+ class LinearFunction(Gate):
27
+ r"""A linear reversible circuit on n qubits.
28
+
29
+ Internally, a linear function acting on n qubits is represented
30
+ as a n x n matrix of 0s and 1s in numpy array format.
31
+
32
+ A linear function can be synthesized into CX and SWAP gates using the Patel–Markov–Hayes
33
+ algorithm, as implemented in :func:`~qiskit.synthesis.synth_cnot_count_full_pmh`
34
+ based on reference [1].
35
+
36
+ For efficiency, the internal n x n matrix is stored in the format expected
37
+ by cnot_synth, which is the big-endian (and not the little-endian) bit-ordering convention.
38
+
39
+ **Example:** the circuit
40
+
41
+ .. code-block:: text
42
+
43
+ q_0: ──■──
44
+ ┌─┴─┐
45
+ q_1: ┤ X ├
46
+ └───┘
47
+ q_2: ─────
48
+
49
+ is represented by a 3x3 linear matrix
50
+
51
+ .. math::
52
+
53
+ \begin{pmatrix}
54
+ 1 & 0 & 0 \\
55
+ 1 & 1 & 0 \\
56
+ 0 & 0 & 1
57
+ \end{pmatrix}
58
+
59
+
60
+ **References:**
61
+
62
+ [1] Ketan N. Patel, Igor L. Markov, and John P. Hayes,
63
+ Optimal synthesis of linear reversible circuits,
64
+ Quantum Inf. Comput. 8(3) (2008).
65
+ `Online at umich.edu. <https://web.eecs.umich.edu/~imarkov/pubs/jour/qic08-cnot.pdf>`_
66
+ """
67
+
68
+ def __init__(
69
+ self,
70
+ linear: (
71
+ list[list[bool]]
72
+ | np.ndarray[bool]
73
+ | QuantumCircuit
74
+ | LinearFunction
75
+ | PermutationGate
76
+ | Clifford
77
+ ),
78
+ validate_input: bool = False,
79
+ ) -> None:
80
+ """Create a new linear function.
81
+
82
+ Args:
83
+ linear: data from which a linear function can be constructed. It can be either a
84
+ nxn matrix (describing the linear transformation), a permutation (which is a
85
+ special case of a linear function), another linear function, a clifford (when
86
+ it corresponds to a linear function), or a quantum circuit composed of
87
+ linear gates (CX and SWAP) and other objects described above, including
88
+ nested subcircuits.
89
+
90
+ validate_input: if True, performs more expensive input validation checks,
91
+ such as checking that a given n x n matrix is invertible.
92
+
93
+ Raises:
94
+ CircuitError: if the input is invalid:
95
+ either the input matrix is not square or not invertible,
96
+ or the input quantum circuit contains non-linear objects
97
+ (for example, a Hadamard gate, or a Clifford that does
98
+ not correspond to a linear function).
99
+ """
100
+
101
+ original_circuit = None
102
+
103
+ if isinstance(linear, (list, np.ndarray)):
104
+ # Normalize to numpy array (coercing entries to 0s and 1s)
105
+ try:
106
+ linear = np.array(linear, dtype=bool, copy=True)
107
+ except ValueError:
108
+ raise CircuitError(
109
+ "A linear function must be represented by a square matrix."
110
+ ) from None
111
+
112
+ # Check that the matrix is square
113
+ if len(linear.shape) != 2 or linear.shape[0] != linear.shape[1]:
114
+ raise CircuitError("A linear function must be represented by a square matrix.")
115
+
116
+ # Optionally, check that the matrix is invertible
117
+ if validate_input:
118
+ from qiskit.synthesis.linear import check_invertible_binary_matrix
119
+
120
+ if not check_invertible_binary_matrix(linear):
121
+ raise CircuitError(
122
+ "A linear function must be represented by an invertible matrix."
123
+ )
124
+
125
+ elif isinstance(linear, QuantumCircuit):
126
+ # The following function will raise a CircuitError if there are nonlinear gates.
127
+ original_circuit = linear
128
+ linear = LinearFunction._circuit_to_mat(linear)
129
+
130
+ elif isinstance(linear, LinearFunction):
131
+ linear = linear.linear.copy()
132
+
133
+ elif isinstance(linear, PermutationGate):
134
+ linear = LinearFunction._permutation_to_mat(linear)
135
+
136
+ elif isinstance(linear, Clifford):
137
+ # The following function will raise a CircuitError if clifford does not correspond
138
+ # to a linear function.
139
+ linear = LinearFunction._clifford_to_mat(linear)
140
+
141
+ # Note: if we wanted, we could also try to construct a linear function from a
142
+ # general operator, by first attempting to convert it to clifford, and then to
143
+ # a linear function.
144
+
145
+ else:
146
+ raise CircuitError("A linear function cannot be successfully constructed.")
147
+
148
+ super().__init__(
149
+ name="linear_function", num_qubits=len(linear), params=[linear, original_circuit]
150
+ )
151
+
152
+ @staticmethod
153
+ def _circuit_to_mat(qc: QuantumCircuit):
154
+ """This creates a nxn matrix corresponding to the given quantum circuit."""
155
+ nq = qc.num_qubits
156
+ mat = np.eye(nq, nq, dtype=bool)
157
+
158
+ for instruction in qc.data:
159
+ if instruction.operation.name in ("barrier", "delay"):
160
+ # can be ignored
161
+ continue
162
+ if instruction.operation.name == "cx":
163
+ # implemented directly
164
+ cb = qc.find_bit(instruction.qubits[0]).index
165
+ tb = qc.find_bit(instruction.qubits[1]).index
166
+ mat[tb, :] = (mat[tb, :]) ^ (mat[cb, :])
167
+ continue
168
+ if instruction.operation.name == "swap":
169
+ # implemented directly
170
+ cb = qc.find_bit(instruction.qubits[0]).index
171
+ tb = qc.find_bit(instruction.qubits[1]).index
172
+ mat[[cb, tb]] = mat[[tb, cb]]
173
+ continue
174
+
175
+ # In all other cases, we construct the linear function for the operation.
176
+ # and compose (multiply) linear matrices.
177
+
178
+ if getattr(instruction.operation, "definition", None) is not None:
179
+ other = LinearFunction(instruction.operation.definition)
180
+ else:
181
+ other = LinearFunction(instruction.operation)
182
+
183
+ positions = [qc.find_bit(q).index for q in instruction.qubits]
184
+ other = other.extend_with_identity(len(mat), positions)
185
+ mat = np.dot(other.linear.astype(int), mat.astype(int)) % 2
186
+ mat = mat.astype(bool)
187
+
188
+ return mat
189
+
190
+ @staticmethod
191
+ def _clifford_to_mat(cliff):
192
+ """This creates a nxn matrix corresponding to the given Clifford, when Clifford
193
+ can be converted to a linear function. This is possible when the clifford has
194
+ tableau of the form [[A, B], [C, D]], with B = C = 0 and D = A^{-1}^t, and zero
195
+ phase vector. In this case, the required matrix is A^t.
196
+ Raises an error otherwise.
197
+ """
198
+ # Note: since cliff is a valid Clifford, then the condition D = A^{-1}^t
199
+ # holds automatically once B = C = 0.
200
+ if cliff.phase.any() or cliff.destab_z.any() or cliff.stab_x.any():
201
+ raise CircuitError("The given clifford does not correspond to a linear function.")
202
+ return np.transpose(cliff.destab_x)
203
+
204
+ @staticmethod
205
+ def _permutation_to_mat(perm):
206
+ """This creates a nxn matrix from a given permutation gate."""
207
+ nq = len(perm.pattern)
208
+ mat = np.zeros((nq, nq), dtype=bool)
209
+ for i, j in enumerate(perm.pattern):
210
+ mat[i, j] = True
211
+ return mat
212
+
213
+ def __eq__(self, other):
214
+ """Check if two linear functions represent the same matrix."""
215
+ if not isinstance(other, LinearFunction):
216
+ return False
217
+ return (self.linear == other.linear).all()
218
+
219
+ def validate_parameter(self, parameter):
220
+ """Parameter validation"""
221
+ return parameter
222
+
223
+ def _define(self):
224
+ """Populates self.definition with a decomposition of this gate."""
225
+ from qiskit.synthesis.linear import synth_cnot_count_full_pmh
226
+
227
+ self.definition = synth_cnot_count_full_pmh(self.linear)
228
+
229
+ @deprecate_func(
230
+ since="1.3",
231
+ pending=True,
232
+ additional_msg="Call LinearFunction.definition instead, or compile the circuit.",
233
+ )
234
+ def synthesize(self):
235
+ """Synthesizes the linear function into a quantum circuit.
236
+
237
+ Returns:
238
+ QuantumCircuit: A circuit implementing the evolution.
239
+ """
240
+ return self.definition
241
+
242
+ @property
243
+ def linear(self):
244
+ """Returns the n x n matrix representing this linear function."""
245
+ return self.params[0]
246
+
247
+ @property
248
+ def original_circuit(self):
249
+ """Returns the original circuit used to construct this linear function
250
+ (including None, when the linear function is not constructed from a circuit).
251
+ """
252
+ return self.params[1]
253
+
254
+ def is_permutation(self) -> bool:
255
+ """Returns whether this linear function is a permutation,
256
+ that is whether every row and every column of the n x n matrix
257
+ has exactly one 1.
258
+ """
259
+ linear = self.linear
260
+ perm = np.all(np.sum(linear, axis=0) == 1) and np.all(np.sum(linear, axis=1) == 1)
261
+ return perm
262
+
263
+ def permutation_pattern(self):
264
+ """This method first checks if a linear function is a permutation and raises a
265
+ `qiskit.circuit.exceptions.CircuitError` if not. In the case that this linear function
266
+ is a permutation, returns the permutation pattern.
267
+ """
268
+ if not self.is_permutation():
269
+ raise CircuitError("The linear function is not a permutation")
270
+
271
+ linear = self.linear
272
+ locs = np.where(linear == 1)
273
+ return locs[1]
274
+
275
+ def extend_with_identity(self, num_qubits: int, positions: list[int]) -> LinearFunction:
276
+ """Extend linear function to a linear function over nq qubits,
277
+ with identities on other subsystems.
278
+
279
+ Args:
280
+ num_qubits: number of qubits of the extended function.
281
+
282
+ positions: describes the positions of original qubits in the extended
283
+ function's qubits.
284
+
285
+ Returns:
286
+ LinearFunction: extended linear function.
287
+ """
288
+ extended_mat = np.eye(num_qubits, dtype=bool)
289
+
290
+ for i, pos in enumerate(positions):
291
+ extended_mat[positions, pos] = self.linear[:, i]
292
+
293
+ return LinearFunction(extended_mat)
294
+
295
+ def mat_str(self):
296
+ """Return string representation of the linear function
297
+ viewed as a matrix with 0/1 entries.
298
+ """
299
+ return str(self.linear.astype(int))
300
+
301
+ def function_str(self):
302
+ """Return string representation of the linear function
303
+ viewed as a linear transformation.
304
+ """
305
+ out = "("
306
+ mat = self.linear
307
+ for row in range(self.num_qubits):
308
+ first_entry = True
309
+ for col in range(self.num_qubits):
310
+ if mat[row, col]:
311
+ if not first_entry:
312
+ out += " + "
313
+ out += "x_" + str(col)
314
+ first_entry = False
315
+ if row != self.num_qubits - 1:
316
+ out += ", "
317
+ out += ")\n"
318
+ return out