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,719 @@
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
+ Optimized list of Pauli operators
14
+ """
15
+ # pylint: disable=invalid-name
16
+
17
+ from __future__ import annotations
18
+ import copy
19
+ from typing import Literal, TYPE_CHECKING
20
+
21
+ import numpy as np
22
+
23
+ from qiskit.circuit import QuantumCircuit
24
+ from qiskit.circuit.barrier import Barrier
25
+ from qiskit.circuit.delay import Delay
26
+ from qiskit.exceptions import QiskitError
27
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
28
+ from qiskit.quantum_info.operators.mixins import AdjointMixin, MultiplyMixin
29
+
30
+ if TYPE_CHECKING:
31
+ from qiskit.quantum_info.operators.symplectic.clifford import Clifford
32
+
33
+
34
+ # utility for _to_matrix
35
+ _PARITY = np.array([-1 if bin(i).count("1") % 2 else 1 for i in range(256)], dtype=complex)
36
+ # Utility for `_to_label`
37
+ _TO_LABEL_CHARS = np.array([ord("I"), ord("X"), ord("Z"), ord("Y")], dtype=np.uint8)
38
+
39
+
40
+ class BasePauli(BaseOperator, AdjointMixin, MultiplyMixin):
41
+ r"""Symplectic representation of a list of N-qubit Paulis.
42
+
43
+ Base class for Pauli and PauliList.
44
+ """
45
+
46
+ def __init__(self, z: np.ndarray, x: np.ndarray, phase: np.ndarray):
47
+ """Initialize the BasePauli.
48
+
49
+ This is an array of M N-qubit Paulis defined as
50
+ P = (-i)^phase Z^z X^x.
51
+
52
+ Args:
53
+ z (np.ndarray): input z matrix.
54
+ x (np.ndarray): input x matrix.
55
+ phase (np.ndarray): input phase vector.
56
+ """
57
+ self._z = z
58
+ self._x = x
59
+ self._phase = phase
60
+ self._num_paulis, num_qubits = self._z.shape
61
+ super().__init__(num_qubits=num_qubits)
62
+
63
+ def copy(self):
64
+ """Make a deep copy of current operator."""
65
+ # Deepcopy has terrible performance on objects with Numpy arrays
66
+ # attributes so we make a shallow copy and then manually copy the
67
+ # Numpy arrays to efficiently mimic a deepcopy
68
+ ret = copy.copy(self)
69
+ ret._z = self._z.copy()
70
+ ret._x = self._x.copy()
71
+ ret._phase = self._phase.copy()
72
+ return ret
73
+
74
+ # ---------------------------------------------------------------------
75
+ # BaseOperator methods
76
+ # ---------------------------------------------------------------------
77
+
78
+ def tensor(self, other):
79
+ return self._tensor(self, other)
80
+
81
+ def expand(self, other):
82
+ return self._tensor(other, self)
83
+
84
+ @classmethod
85
+ def _tensor(cls, a, b):
86
+ x1 = cls._stack(a._x, b._num_paulis, False)
87
+ x2 = cls._stack(b._x, a._num_paulis)
88
+ z1 = cls._stack(a._z, b._num_paulis, False)
89
+ z2 = cls._stack(b._z, a._num_paulis)
90
+ phase1 = (
91
+ np.vstack(b._num_paulis * [a._phase])
92
+ .transpose(1, 0)
93
+ .reshape(a._num_paulis * b._num_paulis)
94
+ )
95
+ phase2 = cls._stack(b._phase, a._num_paulis)
96
+ z = np.hstack([z2, z1])
97
+ x = np.hstack([x2, x1])
98
+ phase = np.mod(phase1 + phase2, 4)
99
+ return BasePauli(z, x, phase)
100
+
101
+ def compose(self, other, qargs: list | None = None, front: bool = False, inplace=False):
102
+ """Return the composition of Paulis.
103
+
104
+ Args:
105
+ a ({cls}): an operator object.
106
+ b ({cls}): an operator object.
107
+ qargs (list or None): Optional, qubits to apply dot product
108
+ on (default: None).
109
+ inplace (bool): If True update in-place (default: False).
110
+
111
+ Returns:
112
+ {cls}: The operator a.compose(b)
113
+
114
+ Raises:
115
+ QiskitError: if number of qubits of other does not match qargs.
116
+ """.format(
117
+ cls=type(self).__name__
118
+ )
119
+ # Validation
120
+ if qargs is None and other.num_qubits != self.num_qubits:
121
+ raise QiskitError(f"other {type(self).__name__} must be on the same number of qubits.")
122
+
123
+ if qargs and other.num_qubits != len(qargs):
124
+ raise QiskitError(
125
+ f"Number of qubits of the other {type(self).__name__} does not match qargs."
126
+ )
127
+
128
+ if other._num_paulis not in [1, self._num_paulis]:
129
+ raise QiskitError(
130
+ "Incompatible BasePaulis. Second list must "
131
+ "either have 1 or the same number of Paulis."
132
+ )
133
+
134
+ # Compute phase shift
135
+ if qargs is not None:
136
+ x1, z1 = self._x[:, qargs], self._z[:, qargs]
137
+ else:
138
+ x1, z1 = self._x, self._z
139
+ x2, z2 = other._x, other._z
140
+
141
+ # Get phase shift
142
+ phase = self._phase + other._phase
143
+ if front:
144
+ phase += 2 * _count_y(x1, z2, dtype=phase.dtype)
145
+ else:
146
+ phase += 2 * _count_y(x2, z1, dtype=phase.dtype)
147
+
148
+ # Update Pauli
149
+ x = np.logical_xor(x1, x2)
150
+ z = np.logical_xor(z1, z2)
151
+
152
+ if qargs is None:
153
+ if not inplace:
154
+ return BasePauli(z, x, phase)
155
+ # Inplace update
156
+ self._x = x
157
+ self._z = z
158
+ self._phase = phase
159
+ return self
160
+
161
+ # Qargs update
162
+ ret = self if inplace else self.copy()
163
+ ret._x[:, qargs] = x
164
+ ret._z[:, qargs] = z
165
+ ret._phase = np.mod(phase, 4)
166
+ return ret
167
+
168
+ def _multiply(self, other):
169
+ """Return the {cls} other * self.
170
+
171
+ Args:
172
+ other (complex): a complex number in ``[1, -1j, -1, 1j]``.
173
+
174
+ Returns:
175
+ {cls}: the {cls} other * self.
176
+
177
+ Raises:
178
+ QiskitError: if the phase is not in the set ``[1, -1j, -1, 1j]``.
179
+ """.format(
180
+ cls=type(self).__name__
181
+ )
182
+ if isinstance(other, (np.ndarray, list, tuple)):
183
+ phase = np.array([self._phase_from_complex(phase) for phase in other])
184
+ else:
185
+ phase = self._phase_from_complex(other)
186
+ return BasePauli(self._z, self._x, np.mod(self._phase + phase, 4))
187
+
188
+ def conjugate(self):
189
+ """Return the complex conjugate of the Pauli with respect to the Z basis."""
190
+ complex_phase = np.mod(self._phase, 2)
191
+ if np.all(complex_phase == 0):
192
+ return self
193
+ return BasePauli(self._z, self._x, np.mod(self._phase + 2 * complex_phase, 4))
194
+
195
+ def transpose(self):
196
+ """Return the transpose of each Pauli in the list."""
197
+ # Transpose sets Y -> -Y. This has effect on changing the phase
198
+ parity_y = self._count_y(dtype=self._phase.dtype) % 2
199
+ if np.all(parity_y == 0):
200
+ return self
201
+ return BasePauli(self._z, self._x, np.mod(self._phase + 2 * parity_y, 4))
202
+
203
+ def commutes(self, other: BasePauli, qargs: list | None = None) -> np.ndarray:
204
+ """Return ``True`` if Pauli commutes with ``other``.
205
+
206
+ Args:
207
+ other (BasePauli): another BasePauli operator.
208
+ qargs (list): qubits to apply dot product on (default: ``None``).
209
+
210
+ Returns:
211
+ np.array: Boolean array of ``True`` if Paulis commute, ``False`` if
212
+ they anti-commute.
213
+
214
+ Raises:
215
+ QiskitError: if number of qubits of ``other`` does not match ``qargs``.
216
+ """
217
+ if qargs is not None and len(qargs) != other.num_qubits:
218
+ raise QiskitError(
219
+ "Number of qubits of other Pauli does not match number of "
220
+ f"qargs ({other.num_qubits} != {len(qargs)})."
221
+ )
222
+ if qargs is None and self.num_qubits != other.num_qubits:
223
+ raise QiskitError(
224
+ "Number of qubits of other Pauli does not match the current "
225
+ f"Pauli ({other.num_qubits} != {self.num_qubits})."
226
+ )
227
+ if qargs is not None:
228
+ inds = list(qargs)
229
+ x1, z1 = self._x[:, inds], self._z[:, inds]
230
+ else:
231
+ x1, z1 = self._x, self._z
232
+ a_dot_b = np.mod(_count_y(x1, other._z), 2)
233
+ b_dot_a = np.mod(_count_y(other._x, z1), 2)
234
+ return a_dot_b == b_dot_a
235
+
236
+ def evolve(
237
+ self,
238
+ other: BasePauli | QuantumCircuit | Clifford,
239
+ qargs: list | None = None,
240
+ frame: Literal["h", "s"] = "h",
241
+ ) -> BasePauli:
242
+ r"""Performs either Heisenberg (default) or Schrödinger picture
243
+ evolution of the Pauli by a Clifford and returns the evolved Pauli.
244
+
245
+ Schrödinger picture evolution can be chosen by passing parameter ``frame='s'``.
246
+ This option yields a faster calculation.
247
+
248
+ Heisenberg picture evolves the Pauli as :math:`P^\prime = C^\dagger.P.C`.
249
+
250
+ Schrödinger picture evolves the Pauli as :math:`P^\prime = C.P.C^\dagger`.
251
+
252
+ Args:
253
+ other (BasePauli or QuantumCircuit): The Clifford circuit to evolve by.
254
+ qargs (list): a list of qubits to apply the Clifford to.
255
+ frame (string): ``'h'`` for Heisenberg or ``'s'`` for Schrödinger framework.
256
+
257
+ Returns:
258
+ BasePauli: the Pauli :math:`C^\dagger.P.C` (Heisenberg picture)
259
+ or the Pauli :math:`C.P.C^\dagger` (Schrödinger picture).
260
+
261
+ Raises:
262
+ QiskitError: if the Clifford number of qubits and ``qargs`` don't match.
263
+ """
264
+ # Check dimension
265
+ if qargs is not None and len(qargs) != other.num_qubits:
266
+ raise QiskitError(
267
+ f"Incorrect number of qubits for Clifford circuit ({other.num_qubits} != {len(qargs)})."
268
+ )
269
+ if qargs is None and self.num_qubits != other.num_qubits:
270
+ raise QiskitError(
271
+ f"Incorrect number of qubits for Clifford circuit "
272
+ f"({other.num_qubits} != {self.num_qubits})."
273
+ )
274
+
275
+ # Evolve via Pauli
276
+ if isinstance(other, BasePauli):
277
+ if frame == "s":
278
+ ret = self.compose(other, qargs=qargs)
279
+ ret = ret.compose(other.adjoint(), front=True, qargs=qargs)
280
+ else:
281
+ ret = self.compose(other.adjoint(), qargs=qargs)
282
+ ret = ret.compose(other, front=True, qargs=qargs)
283
+ return ret
284
+
285
+ # pylint: disable=cyclic-import
286
+ from qiskit.quantum_info.operators.symplectic.clifford import Clifford
287
+
288
+ # Convert Clifford to quantum circuits
289
+ if isinstance(other, Clifford):
290
+ return self._evolve_clifford(other, qargs=qargs, frame=frame)
291
+
292
+ # Otherwise evolve by the inverse circuit to compute C^dg.P.C
293
+ if frame == "s":
294
+ return self.copy()._append_circuit(other, qargs=qargs)
295
+ return self.copy()._append_circuit(other.inverse(), qargs=qargs)
296
+
297
+ def _evolve_clifford(self, other, qargs=None, frame="h"):
298
+ """Heisenberg picture evolution of a Pauli by a Clifford."""
299
+
300
+ if frame == "s":
301
+ adj = other
302
+ else:
303
+ adj = other.adjoint()
304
+
305
+ if qargs is None:
306
+ qargs_ = slice(None)
307
+ else:
308
+ qargs_ = list(qargs)
309
+
310
+ # pylint: disable=cyclic-import
311
+ from qiskit.quantum_info.operators.symplectic.pauli_list import PauliList
312
+
313
+ num_paulis = self._x.shape[0]
314
+
315
+ ret = self.copy()
316
+ ret._x[:, qargs_] = False
317
+ ret._z[:, qargs_] = False
318
+
319
+ idx = np.concatenate((self._x[:, qargs_], self._z[:, qargs_]), axis=1)
320
+ for idx_, row in zip(
321
+ idx.T,
322
+ PauliList.from_symplectic(z=adj.z, x=adj.x, phase=2 * adj.phase),
323
+ ):
324
+ # most of the logic below is to properly index if self is a PauliList (2D),
325
+ # while not trying to index if the object is just a Pauli (1D).
326
+ if idx_.any():
327
+ if np.sum(idx_) == num_paulis:
328
+ ret.compose(row, qargs=qargs, inplace=True)
329
+ else:
330
+ ret[idx_] = ret[idx_].compose(row, qargs=qargs)
331
+
332
+ return ret
333
+
334
+ def _eq(self, other):
335
+ """Entrywise comparison of Pauli equality."""
336
+ return (
337
+ self.num_qubits == other.num_qubits
338
+ and np.all(np.mod(self._phase, 4) == np.mod(other._phase, 4))
339
+ and np.all(self._z == other._z)
340
+ and np.all(self._x == other._x)
341
+ )
342
+
343
+ # ---------------------------------------------------------------------
344
+ # Helper Methods
345
+ # ---------------------------------------------------------------------
346
+
347
+ def __imul__(self, other):
348
+ return self.compose(other, front=True, inplace=True)
349
+
350
+ def __neg__(self):
351
+ ret = copy.copy(self)
352
+ ret._phase = np.mod(self._phase + 2, 4)
353
+ return ret
354
+
355
+ def _count_y(self, dtype=None):
356
+ """Count the number of I Paulis"""
357
+ return _count_y(self._x, self._z, dtype=dtype)
358
+
359
+ @staticmethod
360
+ def _stack(array, size, vertical=True):
361
+ """Stack array."""
362
+ if size == 1:
363
+ return array
364
+ if vertical:
365
+ return np.vstack(size * [array]).reshape((size * len(array),) + array.shape[1:])
366
+ return np.hstack(size * [array]).reshape((size * len(array),) + array.shape[1:])
367
+
368
+ @staticmethod
369
+ def _phase_from_complex(coeff):
370
+ """Return the phase from a label"""
371
+ if np.isclose(coeff, 1):
372
+ return 0
373
+ if np.isclose(coeff, -1j):
374
+ return 1
375
+ if np.isclose(coeff, -1):
376
+ return 2
377
+ if np.isclose(coeff, 1j):
378
+ return 3
379
+ raise QiskitError("Pauli can only be multiplied by 1, -1j, -1, 1j.")
380
+
381
+ @staticmethod
382
+ def _from_array(z, x, phase=0):
383
+ """Convert array data to BasePauli data."""
384
+ if isinstance(z, np.ndarray) and z.dtype == bool:
385
+ base_z = z
386
+ else:
387
+ base_z = np.asarray(z, dtype=bool)
388
+ if base_z.ndim == 1:
389
+ base_z = base_z.reshape((1, base_z.size))
390
+ elif base_z.ndim != 2:
391
+ raise QiskitError("Invalid Pauli z vector shape.")
392
+
393
+ if isinstance(x, np.ndarray) and x.dtype == bool:
394
+ base_x = x
395
+ else:
396
+ base_x = np.asarray(x, dtype=bool)
397
+ if base_x.ndim == 1:
398
+ base_x = base_x.reshape((1, base_x.size))
399
+ elif base_x.ndim != 2:
400
+ raise QiskitError("Invalid Pauli x vector shape.")
401
+
402
+ if base_z.shape != base_x.shape:
403
+ raise QiskitError("z and x vectors are different size.")
404
+
405
+ # Convert group phase convention to internal ZX-phase conversion.
406
+ dtype = getattr(phase, "dtype", None)
407
+ base_phase = np.mod(_count_y(base_x, base_z, dtype=dtype) + phase, 4)
408
+ return base_z, base_x, base_phase
409
+
410
+ @staticmethod
411
+ def _to_matrix(z, x, phase=0, group_phase=False, sparse=False):
412
+ """Return the matrix from symplectic representation.
413
+
414
+ The Pauli is defined as :math:`P = (-i)^{phase + z.x} * Z^z.x^x`
415
+ where ``array = [x, z]``.
416
+
417
+ Args:
418
+ z (array): The symplectic representation z vector.
419
+ x (array): The symplectic representation x vector.
420
+ phase (int): Pauli phase.
421
+ group_phase (bool): Optional. If ``True`` use group-phase convention
422
+ instead of BasePauli ZX-phase convention.
423
+ (default: ``False``).
424
+ sparse (bool): Optional. Of ``True`` return a sparse CSR matrix,
425
+ otherwise return a dense Numpy array
426
+ (default: ``False``).
427
+
428
+ Returns:
429
+ array: if ``sparse=False``.
430
+ csr_matrix: if ``sparse=True``.
431
+ """
432
+ num_qubits = z.size
433
+
434
+ # Convert to zx_phase
435
+ if group_phase:
436
+ phase += np.sum(x & z)
437
+ phase %= 4
438
+
439
+ dim = 2**num_qubits
440
+ twos_array = 1 << np.arange(num_qubits, dtype=np.uint)
441
+ x_indices = np.asarray(x).dot(twos_array)
442
+ z_indices = np.asarray(z).dot(twos_array)
443
+
444
+ indptr = np.arange(dim + 1, dtype=np.uint)
445
+ indices = indptr ^ x_indices
446
+ if phase:
447
+ coeff = (-1j) ** phase
448
+ else:
449
+ coeff = 1
450
+
451
+ # Compute parities of `z_indices & indptr`, i.e.,
452
+ # np.array([(-1) ** bin(i).count("1") for i in z_indices & indptr])
453
+ vec_u64 = z_indices & indptr
454
+ mat_u8 = np.zeros((vec_u64.size, 8), dtype=np.uint8)
455
+ for i in range(8):
456
+ mat_u8[:, i] = vec_u64 & 255
457
+ vec_u64 >>= 8
458
+ if np.all(vec_u64 == 0):
459
+ break
460
+ parity = _PARITY[np.bitwise_xor.reduce(mat_u8, axis=1)]
461
+
462
+ data = coeff * parity
463
+ if sparse:
464
+ # Return sparse matrix
465
+ from scipy.sparse import csr_matrix
466
+
467
+ return csr_matrix((data, indices, indptr), shape=(dim, dim), dtype=complex)
468
+
469
+ # Build dense matrix using csr format
470
+ mat = np.zeros((dim, dim), dtype=complex)
471
+ mat[range(dim), indices[:dim]] = data[:dim]
472
+ return mat
473
+
474
+ @staticmethod
475
+ def _to_label(z, x, phase, group_phase=False, full_group=True, return_phase=False):
476
+ """Return the label string for a Pauli.
477
+
478
+ Args:
479
+ z (array): The symplectic representation z vector.
480
+ x (array): The symplectic representation x vector.
481
+ phase (int): Pauli phase.
482
+ group_phase (bool): Optional. If ``True`` use group-phase convention
483
+ instead of BasePauli ZX-phase convention.
484
+ (default: ``False``).
485
+ full_group (bool): If True return the Pauli label from the full Pauli group
486
+ including complex coefficient from [1, -1, 1j, -1j]. If
487
+ ``False`` return the unsigned Pauli label with coefficient 1
488
+ (default: ``True``).
489
+ return_phase (bool): If ``True`` return the adjusted phase for the coefficient
490
+ of the returned Pauli label. This can be used even if
491
+ ``full_group=False``.
492
+
493
+ Returns:
494
+ str: the Pauli label from the full Pauli group (if ``full_group=True``) or
495
+ from the unsigned Pauli group (if ``full_group=False``).
496
+ tuple[str, int]: if ``return_phase=True`` returns a tuple of the Pauli
497
+ label (from either the full or unsigned Pauli group) and
498
+ the phase ``q`` for the coefficient :math:`(-i)^(q + x.z)`
499
+ for the label from the full Pauli group.
500
+ """
501
+ # Map each qubit to the {I: 0, X: 1, Z: 2, Y: 3} integer form, then use Numpy advanced
502
+ # indexing to get a new data buffer which is compatible with an ASCII string label.
503
+ index = z << 1
504
+ index += x
505
+ ascii_label = _TO_LABEL_CHARS[index[::-1]].data.tobytes()
506
+ phase = (int(phase) if group_phase else int(phase) - ascii_label.count(b"Y")) % 4
507
+ label = ascii_label.decode("ascii")
508
+ if phase and full_group:
509
+ label = ("", "-i", "-", "i")[phase] + label
510
+ if return_phase:
511
+ return label, phase
512
+ return label
513
+
514
+ def _append_circuit(self, circuit, qargs=None):
515
+ """Update BasePauli inplace by applying a Clifford circuit.
516
+
517
+ Args:
518
+ circuit (QuantumCircuit or Instruction): the gate or composite gate to apply.
519
+ qargs (list or None): The qubits to apply gate to.
520
+
521
+ Returns:
522
+ BasePauli: the updated Pauli.
523
+
524
+ Raises:
525
+ QiskitError: if input gate cannot be decomposed into Clifford gates.
526
+ """
527
+ if isinstance(circuit, (Barrier, Delay)):
528
+ return self
529
+
530
+ if qargs is None:
531
+ qargs = list(range(self.num_qubits))
532
+
533
+ if not isinstance(circuit, QuantumCircuit):
534
+ gate = circuit
535
+
536
+ if isinstance(gate, str):
537
+ # Check if gate is a valid Clifford basis gate string
538
+ if gate not in _basis_1q and gate not in _basis_2q:
539
+ raise QiskitError(f"Invalid Clifford gate name string {gate}")
540
+ name = gate
541
+ else:
542
+ # Assume gate is an Instruction
543
+ name = gate.name
544
+
545
+ # Apply gate if it is a Clifford basis gate
546
+ if name in _non_clifford:
547
+ raise QiskitError(f"Cannot update Pauli with non-Clifford gate {name}")
548
+ if name in _basis_1q:
549
+ if len(qargs) != 1:
550
+ raise QiskitError("Invalid qubits for 1-qubit gate.")
551
+ return _basis_1q[name](self, qargs[0])
552
+ if name in _basis_2q:
553
+ if len(qargs) != 2:
554
+ raise QiskitError("Invalid qubits for 2-qubit gate.")
555
+ return _basis_2q[name](self, qargs[0], qargs[1])
556
+
557
+ # If not a Clifford basis gate we try to unroll the gate and
558
+ # raise an exception if unrolling reaches a non-Clifford gate.
559
+ if gate.definition is None:
560
+ raise QiskitError(f"Cannot apply Instruction: {gate.name}")
561
+ if not isinstance(gate.definition, QuantumCircuit):
562
+ raise QiskitError(
563
+ f"{gate.name} instruction definition is {type(gate.definition)};"
564
+ f" expected QuantumCircuit"
565
+ )
566
+
567
+ circuit = gate.definition
568
+
569
+ for instruction in circuit:
570
+ if instruction.clbits:
571
+ raise QiskitError(
572
+ f"Cannot apply Instruction with classical bits: {instruction.operation.name}"
573
+ )
574
+ # Get the integer position of the flat register
575
+ new_qubits = [qargs[circuit.find_bit(qb)[0]] for qb in instruction.qubits]
576
+ self._append_circuit(instruction.operation, new_qubits)
577
+
578
+ # Since the individual gate evolution functions don't take mod
579
+ # of phase we update it at the end
580
+ self._phase %= 4
581
+ return self
582
+
583
+
584
+ # ---------------------------------------------------------------------
585
+ # Evolution by Clifford gates
586
+ # ---------------------------------------------------------------------
587
+
588
+
589
+ def _evolve_h(base_pauli, qubit):
590
+ """Update P -> H.P.H"""
591
+ x = base_pauli._x[:, qubit].copy()
592
+ z = base_pauli._z[:, qubit].copy()
593
+ base_pauli._x[:, qubit] = z
594
+ base_pauli._z[:, qubit] = x
595
+ base_pauli._phase += 2 * np.logical_and(x, z).T.astype(base_pauli._phase.dtype)
596
+ return base_pauli
597
+
598
+
599
+ def _evolve_s(base_pauli, qubit):
600
+ """Update P -> S.P.Sdg"""
601
+ x = base_pauli._x[:, qubit]
602
+ base_pauli._z[:, qubit] ^= x
603
+ base_pauli._phase += x.T.astype(base_pauli._phase.dtype)
604
+ return base_pauli
605
+
606
+
607
+ def _evolve_sdg(base_pauli, qubit):
608
+ """Update P -> Sdg.P.S"""
609
+ x = base_pauli._x[:, qubit]
610
+ base_pauli._z[:, qubit] ^= x
611
+ base_pauli._phase -= x.T.astype(base_pauli._phase.dtype)
612
+ return base_pauli
613
+
614
+
615
+ # pylint: disable=unused-argument
616
+ def _evolve_i(base_pauli, qubit):
617
+ """Update P -> P"""
618
+ return base_pauli
619
+
620
+
621
+ def _evolve_x(base_pauli, qubit):
622
+ """Update P -> X.P.X"""
623
+ base_pauli._phase += 2 * base_pauli._z[:, qubit].T.astype(base_pauli._phase.dtype)
624
+ return base_pauli
625
+
626
+
627
+ def _evolve_y(base_pauli, qubit):
628
+ """Update P -> Y.P.Y"""
629
+ xp = base_pauli._x[:, qubit].T.astype(base_pauli._phase.dtype)
630
+ zp = base_pauli._z[:, qubit].T.astype(base_pauli._phase.dtype)
631
+ base_pauli._phase += 2 * (xp + zp)
632
+ return base_pauli
633
+
634
+
635
+ def _evolve_z(base_pauli, qubit):
636
+ """Update P -> Z.P.Z"""
637
+ base_pauli._phase += 2 * base_pauli._x[:, qubit].T.astype(base_pauli._phase.dtype)
638
+ return base_pauli
639
+
640
+
641
+ def _evolve_cx(base_pauli, qctrl, qtrgt):
642
+ """Update P -> CX.P.CX"""
643
+ base_pauli._x[:, qtrgt] ^= base_pauli._x[:, qctrl]
644
+ base_pauli._z[:, qctrl] ^= base_pauli._z[:, qtrgt]
645
+ return base_pauli
646
+
647
+
648
+ def _evolve_cz(base_pauli, q1, q2):
649
+ """Update P -> CZ.P.CZ"""
650
+ x1 = base_pauli._x[:, q1].copy()
651
+ x2 = base_pauli._x[:, q2].copy()
652
+ base_pauli._z[:, q1] ^= x2
653
+ base_pauli._z[:, q2] ^= x1
654
+ base_pauli._phase += 2 * np.logical_and(x1, x2).T.astype(base_pauli._phase.dtype)
655
+ return base_pauli
656
+
657
+
658
+ def _evolve_cy(base_pauli, qctrl, qtrgt):
659
+ """Update P -> CY.P.CY"""
660
+ x1 = base_pauli._x[:, qctrl].copy()
661
+ x2 = base_pauli._x[:, qtrgt].copy()
662
+ z2 = base_pauli._z[:, qtrgt].copy()
663
+ base_pauli._x[:, qtrgt] ^= x1
664
+ base_pauli._z[:, qtrgt] ^= x1
665
+ base_pauli._z[:, qctrl] ^= np.logical_xor(x2, z2)
666
+ base_pauli._phase += x1 + 2 * np.logical_and(x1, x2).T.astype(base_pauli._phase.dtype)
667
+ return base_pauli
668
+
669
+
670
+ def _evolve_swap(base_pauli, q1, q2):
671
+ """Update P -> SWAP.P.SWAP"""
672
+ x1 = base_pauli._x[:, q1].copy()
673
+ z1 = base_pauli._z[:, q1].copy()
674
+ base_pauli._x[:, q1] = base_pauli._x[:, q2]
675
+ base_pauli._z[:, q1] = base_pauli._z[:, q2]
676
+ base_pauli._x[:, q2] = x1
677
+ base_pauli._z[:, q2] = z1
678
+ return base_pauli
679
+
680
+
681
+ def _evolve_ecr(base_pauli, q1, q2):
682
+ """Update P -> ECR.P.ECR"""
683
+ base_pauli = _evolve_s(base_pauli, q1)
684
+ base_pauli = _evolve_h(base_pauli, q2)
685
+ base_pauli = _evolve_s(base_pauli, q2)
686
+ base_pauli = _evolve_h(base_pauli, q2)
687
+ base_pauli = _evolve_cx(base_pauli, q1, q2)
688
+ base_pauli = _evolve_x(base_pauli, q1)
689
+ return base_pauli
690
+
691
+
692
+ def _count_y(x, z, dtype=None):
693
+ """Count the number of I Paulis"""
694
+ return (x & z).sum(axis=1, dtype=dtype)
695
+
696
+
697
+ # Basis Clifford Gates
698
+ _basis_1q = {
699
+ "i": _evolve_i,
700
+ "id": _evolve_i,
701
+ "iden": _evolve_i,
702
+ "x": _evolve_x,
703
+ "y": _evolve_y,
704
+ "z": _evolve_z,
705
+ "h": _evolve_h,
706
+ "s": _evolve_s,
707
+ "sdg": _evolve_sdg,
708
+ "sinv": _evolve_sdg,
709
+ }
710
+ _basis_2q = {
711
+ "cx": _evolve_cx,
712
+ "cz": _evolve_cz,
713
+ "cy": _evolve_cy,
714
+ "swap": _evolve_swap,
715
+ "ecr": _evolve_ecr,
716
+ }
717
+
718
+ # Non-Clifford gates
719
+ _non_clifford = ["t", "tdg", "ccx", "ccz"]