qiskit 1.0.0b1__cp38-abi3-manylinux_2_17_aarch64.manylinux2014_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 (1095) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +195 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_qasm2.abi3.so +0 -0
  5. qiskit/assembler/__init__.py +47 -0
  6. qiskit/assembler/assemble_circuits.py +408 -0
  7. qiskit/assembler/assemble_schedules.py +372 -0
  8. qiskit/assembler/disassemble.py +318 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +425 -0
  11. qiskit/circuit/_classical_resource_map.py +144 -0
  12. qiskit/circuit/_utils.py +170 -0
  13. qiskit/circuit/add_control.py +274 -0
  14. qiskit/circuit/annotated_operation.py +188 -0
  15. qiskit/circuit/barrier.py +51 -0
  16. qiskit/circuit/bit.py +142 -0
  17. qiskit/circuit/classical/__init__.py +41 -0
  18. qiskit/circuit/classical/expr/__init__.py +218 -0
  19. qiskit/circuit/classical/expr/constructors.py +473 -0
  20. qiskit/circuit/classical/expr/expr.py +356 -0
  21. qiskit/circuit/classical/expr/visitors.py +280 -0
  22. qiskit/circuit/classical/types/__init__.py +108 -0
  23. qiskit/circuit/classical/types/ordering.py +222 -0
  24. qiskit/circuit/classical/types/types.py +117 -0
  25. qiskit/circuit/classicalfunction/__init__.py +131 -0
  26. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  27. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  28. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  29. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  30. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  31. qiskit/circuit/classicalfunction/types.py +18 -0
  32. qiskit/circuit/classicalfunction/utils.py +91 -0
  33. qiskit/circuit/classicalregister.py +71 -0
  34. qiskit/circuit/commutation_checker.py +176 -0
  35. qiskit/circuit/controlflow/__init__.py +27 -0
  36. qiskit/circuit/controlflow/_builder_utils.py +199 -0
  37. qiskit/circuit/controlflow/break_loop.py +70 -0
  38. qiskit/circuit/controlflow/builder.py +651 -0
  39. qiskit/circuit/controlflow/continue_loop.py +72 -0
  40. qiskit/circuit/controlflow/control_flow.py +52 -0
  41. qiskit/circuit/controlflow/for_loop.py +232 -0
  42. qiskit/circuit/controlflow/if_else.py +517 -0
  43. qiskit/circuit/controlflow/switch_case.py +424 -0
  44. qiskit/circuit/controlflow/while_loop.py +177 -0
  45. qiskit/circuit/controlledgate.py +271 -0
  46. qiskit/circuit/delay.py +104 -0
  47. qiskit/circuit/duration.py +88 -0
  48. qiskit/circuit/equivalence.py +291 -0
  49. qiskit/circuit/equivalence_library.py +18 -0
  50. qiskit/circuit/exceptions.py +19 -0
  51. qiskit/circuit/gate.py +245 -0
  52. qiskit/circuit/instruction.py +655 -0
  53. qiskit/circuit/instructionset.py +191 -0
  54. qiskit/circuit/library/__init__.py +581 -0
  55. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  56. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  57. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  58. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  59. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  60. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
  61. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  62. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  63. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  64. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  65. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  66. qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
  67. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  68. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  69. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
  70. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  71. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  72. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  73. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  74. qiskit/circuit/library/arithmetic/quadratic_form.py +197 -0
  75. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  76. qiskit/circuit/library/basis_change/__init__.py +15 -0
  77. qiskit/circuit/library/basis_change/qft.py +289 -0
  78. qiskit/circuit/library/blueprintcircuit.py +186 -0
  79. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  80. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  81. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  82. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  83. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  84. qiskit/circuit/library/data_preparation/__init__.py +47 -0
  85. qiskit/circuit/library/data_preparation/initializer.py +96 -0
  86. qiskit/circuit/library/data_preparation/pauli_feature_map.py +296 -0
  87. qiskit/circuit/library/data_preparation/state_preparation.py +526 -0
  88. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  89. qiskit/circuit/library/data_preparation/zz_feature_map.py +114 -0
  90. qiskit/circuit/library/evolved_operator_ansatz.py +245 -0
  91. qiskit/circuit/library/fourier_checking.py +97 -0
  92. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  93. qiskit/circuit/library/generalized_gates/diagonal.py +164 -0
  94. qiskit/circuit/library/generalized_gates/gms.py +121 -0
  95. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  96. qiskit/circuit/library/generalized_gates/isometry.py +573 -0
  97. qiskit/circuit/library/generalized_gates/linear_function.py +302 -0
  98. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +138 -0
  99. qiskit/circuit/library/generalized_gates/mcmt.py +254 -0
  100. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  101. qiskit/circuit/library/generalized_gates/permutation.py +190 -0
  102. qiskit/circuit/library/generalized_gates/rv.py +93 -0
  103. qiskit/circuit/library/generalized_gates/uc.py +304 -0
  104. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  105. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  106. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  108. qiskit/circuit/library/generalized_gates/unitary.py +198 -0
  109. qiskit/circuit/library/graph_state.py +86 -0
  110. qiskit/circuit/library/grover_operator.py +311 -0
  111. qiskit/circuit/library/hamiltonian_gate.py +146 -0
  112. qiskit/circuit/library/hidden_linear_function.py +98 -0
  113. qiskit/circuit/library/iqp.py +96 -0
  114. qiskit/circuit/library/n_local/__init__.py +31 -0
  115. qiskit/circuit/library/n_local/efficient_su2.py +162 -0
  116. qiskit/circuit/library/n_local/excitation_preserving.py +176 -0
  117. qiskit/circuit/library/n_local/n_local.py +1044 -0
  118. qiskit/circuit/library/n_local/pauli_two_design.py +131 -0
  119. qiskit/circuit/library/n_local/qaoa_ansatz.py +288 -0
  120. qiskit/circuit/library/n_local/real_amplitudes.py +189 -0
  121. qiskit/circuit/library/n_local/two_local.py +334 -0
  122. qiskit/circuit/library/overlap.py +111 -0
  123. qiskit/circuit/library/pauli_evolution.py +180 -0
  124. qiskit/circuit/library/phase_estimation.py +99 -0
  125. qiskit/circuit/library/phase_oracle.py +153 -0
  126. qiskit/circuit/library/quantum_volume.py +114 -0
  127. qiskit/circuit/library/standard_gates/__init__.py +116 -0
  128. qiskit/circuit/library/standard_gates/dcx.py +71 -0
  129. qiskit/circuit/library/standard_gates/ecr.py +114 -0
  130. qiskit/circuit/library/standard_gates/equivalence_library.py +1677 -0
  131. qiskit/circuit/library/standard_gates/global_phase.py +63 -0
  132. qiskit/circuit/library/standard_gates/h.py +224 -0
  133. qiskit/circuit/library/standard_gates/i.py +60 -0
  134. qiskit/circuit/library/standard_gates/iswap.py +129 -0
  135. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +390 -0
  136. qiskit/circuit/library/standard_gates/p.py +364 -0
  137. qiskit/circuit/library/standard_gates/r.py +101 -0
  138. qiskit/circuit/library/standard_gates/rx.py +246 -0
  139. qiskit/circuit/library/standard_gates/rxx.py +128 -0
  140. qiskit/circuit/library/standard_gates/ry.py +241 -0
  141. qiskit/circuit/library/standard_gates/ryy.py +128 -0
  142. qiskit/circuit/library/standard_gates/rz.py +261 -0
  143. qiskit/circuit/library/standard_gates/rzx.py +174 -0
  144. qiskit/circuit/library/standard_gates/rzz.py +141 -0
  145. qiskit/circuit/library/standard_gates/s.py +303 -0
  146. qiskit/circuit/library/standard_gates/swap.py +246 -0
  147. qiskit/circuit/library/standard_gates/sx.py +268 -0
  148. qiskit/circuit/library/standard_gates/t.py +150 -0
  149. qiskit/circuit/library/standard_gates/u.py +338 -0
  150. qiskit/circuit/library/standard_gates/u1.py +383 -0
  151. qiskit/circuit/library/standard_gates/u2.py +132 -0
  152. qiskit/circuit/library/standard_gates/u3.py +358 -0
  153. qiskit/circuit/library/standard_gates/x.py +1370 -0
  154. qiskit/circuit/library/standard_gates/xx_minus_yy.py +179 -0
  155. qiskit/circuit/library/standard_gates/xx_plus_yy.py +180 -0
  156. qiskit/circuit/library/standard_gates/y.py +221 -0
  157. qiskit/circuit/library/standard_gates/z.py +294 -0
  158. qiskit/circuit/library/templates/__init__.py +92 -0
  159. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  160. qiskit/circuit/library/templates/clifford/clifford_2_1.py +33 -0
  161. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  164. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  166. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  170. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  171. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  176. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  179. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  180. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  182. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  188. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  191. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  226. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  227. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  228. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  229. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  230. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  231. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  233. qiskit/circuit/measure.py +41 -0
  234. qiskit/circuit/operation.py +62 -0
  235. qiskit/circuit/parameter.py +160 -0
  236. qiskit/circuit/parameterexpression.py +515 -0
  237. qiskit/circuit/parametertable.py +263 -0
  238. qiskit/circuit/parametervector.py +114 -0
  239. qiskit/circuit/qpy_serialization.py +28 -0
  240. qiskit/circuit/quantumcircuit.py +6074 -0
  241. qiskit/circuit/quantumcircuitdata.py +138 -0
  242. qiskit/circuit/quantumregister.py +90 -0
  243. qiskit/circuit/random/__init__.py +15 -0
  244. qiskit/circuit/random/utils.py +209 -0
  245. qiskit/circuit/register.py +256 -0
  246. qiskit/circuit/reset.py +31 -0
  247. qiskit/circuit/singleton.py +604 -0
  248. qiskit/circuit/store.py +87 -0
  249. qiskit/circuit/tools/__init__.py +16 -0
  250. qiskit/circuit/tools/pi_check.py +190 -0
  251. qiskit/compiler/__init__.py +33 -0
  252. qiskit/compiler/assembler.py +597 -0
  253. qiskit/compiler/scheduler.py +107 -0
  254. qiskit/compiler/sequencer.py +69 -0
  255. qiskit/compiler/transpiler.py +613 -0
  256. qiskit/converters/__init__.py +59 -0
  257. qiskit/converters/circuit_to_dag.py +96 -0
  258. qiskit/converters/circuit_to_dagdependency.py +51 -0
  259. qiskit/converters/circuit_to_gate.py +109 -0
  260. qiskit/converters/circuit_to_instruction.py +131 -0
  261. qiskit/converters/dag_to_circuit.py +77 -0
  262. qiskit/converters/dag_to_dagdependency.py +55 -0
  263. qiskit/converters/dagdependency_to_circuit.py +42 -0
  264. qiskit/converters/dagdependency_to_dag.py +49 -0
  265. qiskit/dagcircuit/__init__.py +44 -0
  266. qiskit/dagcircuit/collect_blocks.py +386 -0
  267. qiskit/dagcircuit/dagcircuit.py +2105 -0
  268. qiskit/dagcircuit/dagdependency.py +626 -0
  269. qiskit/dagcircuit/dagdepnode.py +157 -0
  270. qiskit/dagcircuit/dagnode.py +322 -0
  271. qiskit/dagcircuit/exceptions.py +42 -0
  272. qiskit/exceptions.py +97 -0
  273. qiskit/execute_function.py +354 -0
  274. qiskit/extensions/__init__.py +70 -0
  275. qiskit/extensions/exceptions.py +31 -0
  276. qiskit/extensions/quantum_initializer/__init__.py +26 -0
  277. qiskit/extensions/quantum_initializer/squ.py +163 -0
  278. qiskit/extensions/simulator/__init__.py +15 -0
  279. qiskit/extensions/simulator/snapshot.py +70 -0
  280. qiskit/namespace.py +76 -0
  281. qiskit/passmanager/__init__.py +242 -0
  282. qiskit/passmanager/base_tasks.py +230 -0
  283. qiskit/passmanager/compilation_status.py +74 -0
  284. qiskit/passmanager/exceptions.py +19 -0
  285. qiskit/passmanager/flow_controllers.py +336 -0
  286. qiskit/passmanager/passmanager.py +317 -0
  287. qiskit/primitives/__init__.py +62 -0
  288. qiskit/primitives/backend_estimator.py +473 -0
  289. qiskit/primitives/backend_sampler.py +209 -0
  290. qiskit/primitives/base/__init__.py +20 -0
  291. qiskit/primitives/base/base_estimator.py +256 -0
  292. qiskit/primitives/base/base_primitive.py +74 -0
  293. qiskit/primitives/base/base_result.py +87 -0
  294. qiskit/primitives/base/base_sampler.py +202 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/estimator.py +158 -0
  299. qiskit/primitives/primitive_job.py +73 -0
  300. qiskit/primitives/sampler.py +155 -0
  301. qiskit/primitives/utils.py +216 -0
  302. qiskit/providers/__init__.py +773 -0
  303. qiskit/providers/backend.py +653 -0
  304. qiskit/providers/backend_compat.py +347 -0
  305. qiskit/providers/basicaer/__init__.py +73 -0
  306. qiskit/providers/basicaer/basicaerjob.py +65 -0
  307. qiskit/providers/basicaer/basicaerprovider.py +127 -0
  308. qiskit/providers/basicaer/basicaertools.py +186 -0
  309. qiskit/providers/basicaer/exceptions.py +30 -0
  310. qiskit/providers/basicaer/qasm_simulator.py +678 -0
  311. qiskit/providers/basicaer/statevector_simulator.py +121 -0
  312. qiskit/providers/basicaer/unitary_simulator.py +395 -0
  313. qiskit/providers/exceptions.py +45 -0
  314. qiskit/providers/fake_provider/__init__.py +267 -0
  315. qiskit/providers/fake_provider/backends/__init__.py +110 -0
  316. qiskit/providers/fake_provider/backends/almaden/__init__.py +16 -0
  317. qiskit/providers/fake_provider/backends/almaden/conf_almaden.json +1 -0
  318. qiskit/providers/fake_provider/backends/almaden/fake_almaden.py +58 -0
  319. qiskit/providers/fake_provider/backends/almaden/props_almaden.json +1 -0
  320. qiskit/providers/fake_provider/backends/armonk/__init__.py +16 -0
  321. qiskit/providers/fake_provider/backends/armonk/conf_armonk.json +1 -0
  322. qiskit/providers/fake_provider/backends/armonk/defs_armonk.json +1 -0
  323. qiskit/providers/fake_provider/backends/armonk/fake_armonk.py +48 -0
  324. qiskit/providers/fake_provider/backends/armonk/props_armonk.json +1 -0
  325. qiskit/providers/fake_provider/backends/athens/__init__.py +16 -0
  326. qiskit/providers/fake_provider/backends/athens/conf_athens.json +1 -0
  327. qiskit/providers/fake_provider/backends/athens/defs_athens.json +1 -0
  328. qiskit/providers/fake_provider/backends/athens/fake_athens.py +38 -0
  329. qiskit/providers/fake_provider/backends/athens/props_athens.json +1 -0
  330. qiskit/providers/fake_provider/backends/auckland/__init__.py +15 -0
  331. qiskit/providers/fake_provider/backends/auckland/conf_auckland.json +1 -0
  332. qiskit/providers/fake_provider/backends/auckland/defs_auckland.json +1 -0
  333. qiskit/providers/fake_provider/backends/auckland/fake_auckland.py +29 -0
  334. qiskit/providers/fake_provider/backends/auckland/props_auckland.json +1 -0
  335. qiskit/providers/fake_provider/backends/belem/__init__.py +16 -0
  336. qiskit/providers/fake_provider/backends/belem/conf_belem.json +1 -0
  337. qiskit/providers/fake_provider/backends/belem/defs_belem.json +1 -0
  338. qiskit/providers/fake_provider/backends/belem/fake_belem.py +38 -0
  339. qiskit/providers/fake_provider/backends/belem/props_belem.json +1 -0
  340. qiskit/providers/fake_provider/backends/boeblingen/__init__.py +16 -0
  341. qiskit/providers/fake_provider/backends/boeblingen/conf_boeblingen.json +1 -0
  342. qiskit/providers/fake_provider/backends/boeblingen/defs_boeblingen.json +1 -0
  343. qiskit/providers/fake_provider/backends/boeblingen/fake_boeblingen.py +60 -0
  344. qiskit/providers/fake_provider/backends/boeblingen/props_boeblingen.json +1 -0
  345. qiskit/providers/fake_provider/backends/bogota/__init__.py +16 -0
  346. qiskit/providers/fake_provider/backends/bogota/conf_bogota.json +1 -0
  347. qiskit/providers/fake_provider/backends/bogota/defs_bogota.json +1 -0
  348. qiskit/providers/fake_provider/backends/bogota/fake_bogota.py +38 -0
  349. qiskit/providers/fake_provider/backends/bogota/props_bogota.json +1 -0
  350. qiskit/providers/fake_provider/backends/brooklyn/__init__.py +16 -0
  351. qiskit/providers/fake_provider/backends/brooklyn/conf_brooklyn.json +1 -0
  352. qiskit/providers/fake_provider/backends/brooklyn/defs_brooklyn.json +1 -0
  353. qiskit/providers/fake_provider/backends/brooklyn/fake_brooklyn.py +38 -0
  354. qiskit/providers/fake_provider/backends/brooklyn/props_brooklyn.json +1 -0
  355. qiskit/providers/fake_provider/backends/burlington/__init__.py +16 -0
  356. qiskit/providers/fake_provider/backends/burlington/conf_burlington.json +1 -0
  357. qiskit/providers/fake_provider/backends/burlington/fake_burlington.py +50 -0
  358. qiskit/providers/fake_provider/backends/burlington/props_burlington.json +1 -0
  359. qiskit/providers/fake_provider/backends/cairo/__init__.py +16 -0
  360. qiskit/providers/fake_provider/backends/cairo/conf_cairo.json +1 -0
  361. qiskit/providers/fake_provider/backends/cairo/defs_cairo.json +1 -0
  362. qiskit/providers/fake_provider/backends/cairo/fake_cairo.py +38 -0
  363. qiskit/providers/fake_provider/backends/cairo/props_cairo.json +1 -0
  364. qiskit/providers/fake_provider/backends/cambridge/__init__.py +17 -0
  365. qiskit/providers/fake_provider/backends/cambridge/conf_cambridge.json +1 -0
  366. qiskit/providers/fake_provider/backends/cambridge/fake_cambridge.py +72 -0
  367. qiskit/providers/fake_provider/backends/cambridge/props_cambridge.json +1 -0
  368. qiskit/providers/fake_provider/backends/cambridge/props_cambridge_alt.json +1 -0
  369. qiskit/providers/fake_provider/backends/casablanca/__init__.py +16 -0
  370. qiskit/providers/fake_provider/backends/casablanca/conf_casablanca.json +1 -0
  371. qiskit/providers/fake_provider/backends/casablanca/defs_casablanca.json +1 -0
  372. qiskit/providers/fake_provider/backends/casablanca/fake_casablanca.py +38 -0
  373. qiskit/providers/fake_provider/backends/casablanca/props_casablanca.json +1 -0
  374. qiskit/providers/fake_provider/backends/essex/__init__.py +16 -0
  375. qiskit/providers/fake_provider/backends/essex/conf_essex.json +1 -0
  376. qiskit/providers/fake_provider/backends/essex/fake_essex.py +54 -0
  377. qiskit/providers/fake_provider/backends/essex/props_essex.json +1 -0
  378. qiskit/providers/fake_provider/backends/geneva/__init__.py +15 -0
  379. qiskit/providers/fake_provider/backends/geneva/conf_geneva.json +1 -0
  380. qiskit/providers/fake_provider/backends/geneva/defs_geneva.json +1 -0
  381. qiskit/providers/fake_provider/backends/geneva/fake_geneva.py +29 -0
  382. qiskit/providers/fake_provider/backends/geneva/props_geneva.json +1 -0
  383. qiskit/providers/fake_provider/backends/guadalupe/__init__.py +16 -0
  384. qiskit/providers/fake_provider/backends/guadalupe/conf_guadalupe.json +1 -0
  385. qiskit/providers/fake_provider/backends/guadalupe/defs_guadalupe.json +1 -0
  386. qiskit/providers/fake_provider/backends/guadalupe/fake_guadalupe.py +39 -0
  387. qiskit/providers/fake_provider/backends/guadalupe/props_guadalupe.json +1 -0
  388. qiskit/providers/fake_provider/backends/hanoi/__init__.py +16 -0
  389. qiskit/providers/fake_provider/backends/hanoi/conf_hanoi.json +1 -0
  390. qiskit/providers/fake_provider/backends/hanoi/defs_hanoi.json +1 -0
  391. qiskit/providers/fake_provider/backends/hanoi/fake_hanoi.py +38 -0
  392. qiskit/providers/fake_provider/backends/hanoi/props_hanoi.json +1 -0
  393. qiskit/providers/fake_provider/backends/jakarta/__init__.py +16 -0
  394. qiskit/providers/fake_provider/backends/jakarta/conf_jakarta.json +1 -0
  395. qiskit/providers/fake_provider/backends/jakarta/defs_jakarta.json +1 -0
  396. qiskit/providers/fake_provider/backends/jakarta/fake_jakarta.py +38 -0
  397. qiskit/providers/fake_provider/backends/jakarta/props_jakarta.json +1 -0
  398. qiskit/providers/fake_provider/backends/johannesburg/__init__.py +16 -0
  399. qiskit/providers/fake_provider/backends/johannesburg/conf_johannesburg.json +1 -0
  400. qiskit/providers/fake_provider/backends/johannesburg/fake_johannesburg.py +58 -0
  401. qiskit/providers/fake_provider/backends/johannesburg/props_johannesburg.json +1 -0
  402. qiskit/providers/fake_provider/backends/kolkata/__init__.py +16 -0
  403. qiskit/providers/fake_provider/backends/kolkata/conf_kolkata.json +1 -0
  404. qiskit/providers/fake_provider/backends/kolkata/defs_kolkata.json +1 -0
  405. qiskit/providers/fake_provider/backends/kolkata/fake_kolkata.py +38 -0
  406. qiskit/providers/fake_provider/backends/kolkata/props_kolkata.json +1 -0
  407. qiskit/providers/fake_provider/backends/lagos/__init__.py +16 -0
  408. qiskit/providers/fake_provider/backends/lagos/conf_lagos.json +1 -0
  409. qiskit/providers/fake_provider/backends/lagos/defs_lagos.json +1 -0
  410. qiskit/providers/fake_provider/backends/lagos/fake_lagos.py +38 -0
  411. qiskit/providers/fake_provider/backends/lagos/props_lagos.json +1 -0
  412. qiskit/providers/fake_provider/backends/lima/__init__.py +16 -0
  413. qiskit/providers/fake_provider/backends/lima/conf_lima.json +1 -0
  414. qiskit/providers/fake_provider/backends/lima/defs_lima.json +1 -0
  415. qiskit/providers/fake_provider/backends/lima/fake_lima.py +38 -0
  416. qiskit/providers/fake_provider/backends/lima/props_lima.json +1 -0
  417. qiskit/providers/fake_provider/backends/london/__init__.py +16 -0
  418. qiskit/providers/fake_provider/backends/london/conf_london.json +1 -0
  419. qiskit/providers/fake_provider/backends/london/fake_london.py +54 -0
  420. qiskit/providers/fake_provider/backends/london/props_london.json +1 -0
  421. qiskit/providers/fake_provider/backends/manhattan/__init__.py +16 -0
  422. qiskit/providers/fake_provider/backends/manhattan/conf_manhattan.json +1 -0
  423. qiskit/providers/fake_provider/backends/manhattan/defs_manhattan.json +1 -0
  424. qiskit/providers/fake_provider/backends/manhattan/fake_manhattan.py +38 -0
  425. qiskit/providers/fake_provider/backends/manhattan/props_manhattan.json +1 -0
  426. qiskit/providers/fake_provider/backends/manila/__init__.py +16 -0
  427. qiskit/providers/fake_provider/backends/manila/conf_manila.json +1 -0
  428. qiskit/providers/fake_provider/backends/manila/defs_manila.json +1 -0
  429. qiskit/providers/fake_provider/backends/manila/fake_manila.py +38 -0
  430. qiskit/providers/fake_provider/backends/manila/props_manila.json +1 -0
  431. qiskit/providers/fake_provider/backends/melbourne/__init__.py +16 -0
  432. qiskit/providers/fake_provider/backends/melbourne/conf_melbourne.json +1 -0
  433. qiskit/providers/fake_provider/backends/melbourne/fake_melbourne.py +91 -0
  434. qiskit/providers/fake_provider/backends/melbourne/props_melbourne.json +1 -0
  435. qiskit/providers/fake_provider/backends/montreal/__init__.py +16 -0
  436. qiskit/providers/fake_provider/backends/montreal/conf_montreal.json +1 -0
  437. qiskit/providers/fake_provider/backends/montreal/defs_montreal.json +1 -0
  438. qiskit/providers/fake_provider/backends/montreal/fake_montreal.py +38 -0
  439. qiskit/providers/fake_provider/backends/montreal/props_montreal.json +1 -0
  440. qiskit/providers/fake_provider/backends/mumbai/__init__.py +16 -0
  441. qiskit/providers/fake_provider/backends/mumbai/conf_mumbai.json +1 -0
  442. qiskit/providers/fake_provider/backends/mumbai/defs_mumbai.json +1 -0
  443. qiskit/providers/fake_provider/backends/mumbai/fake_mumbai.py +38 -0
  444. qiskit/providers/fake_provider/backends/mumbai/props_mumbai.json +1 -0
  445. qiskit/providers/fake_provider/backends/nairobi/__init__.py +16 -0
  446. qiskit/providers/fake_provider/backends/nairobi/conf_nairobi.json +1 -0
  447. qiskit/providers/fake_provider/backends/nairobi/defs_nairobi.json +1 -0
  448. qiskit/providers/fake_provider/backends/nairobi/fake_nairobi.py +38 -0
  449. qiskit/providers/fake_provider/backends/nairobi/props_nairobi.json +1 -0
  450. qiskit/providers/fake_provider/backends/oslo/__init__.py +15 -0
  451. qiskit/providers/fake_provider/backends/oslo/conf_oslo.json +1 -0
  452. qiskit/providers/fake_provider/backends/oslo/defs_oslo.json +1 -0
  453. qiskit/providers/fake_provider/backends/oslo/fake_oslo.py +29 -0
  454. qiskit/providers/fake_provider/backends/oslo/props_oslo.json +1 -0
  455. qiskit/providers/fake_provider/backends/ourense/__init__.py +16 -0
  456. qiskit/providers/fake_provider/backends/ourense/conf_ourense.json +1 -0
  457. qiskit/providers/fake_provider/backends/ourense/fake_ourense.py +50 -0
  458. qiskit/providers/fake_provider/backends/ourense/props_ourense.json +1 -0
  459. qiskit/providers/fake_provider/backends/paris/__init__.py +16 -0
  460. qiskit/providers/fake_provider/backends/paris/conf_paris.json +1 -0
  461. qiskit/providers/fake_provider/backends/paris/defs_paris.json +1 -0
  462. qiskit/providers/fake_provider/backends/paris/fake_paris.py +64 -0
  463. qiskit/providers/fake_provider/backends/paris/props_paris.json +1 -0
  464. qiskit/providers/fake_provider/backends/perth/__init__.py +15 -0
  465. qiskit/providers/fake_provider/backends/perth/conf_perth.json +1 -0
  466. qiskit/providers/fake_provider/backends/perth/defs_perth.json +1 -0
  467. qiskit/providers/fake_provider/backends/perth/fake_perth.py +29 -0
  468. qiskit/providers/fake_provider/backends/perth/props_perth.json +1 -0
  469. qiskit/providers/fake_provider/backends/poughkeepsie/__init__.py +16 -0
  470. qiskit/providers/fake_provider/backends/poughkeepsie/conf_poughkeepsie.json +1 -0
  471. qiskit/providers/fake_provider/backends/poughkeepsie/defs_poughkeepsie.json +1 -0
  472. qiskit/providers/fake_provider/backends/poughkeepsie/fake_poughkeepsie.py +124 -0
  473. qiskit/providers/fake_provider/backends/poughkeepsie/props_poughkeepsie.json +1 -0
  474. qiskit/providers/fake_provider/backends/prague/__init__.py +15 -0
  475. qiskit/providers/fake_provider/backends/prague/conf_prague.json +1 -0
  476. qiskit/providers/fake_provider/backends/prague/fake_prague.py +28 -0
  477. qiskit/providers/fake_provider/backends/prague/props_prague.json +1 -0
  478. qiskit/providers/fake_provider/backends/quito/__init__.py +16 -0
  479. qiskit/providers/fake_provider/backends/quito/conf_quito.json +1 -0
  480. qiskit/providers/fake_provider/backends/quito/defs_quito.json +1 -0
  481. qiskit/providers/fake_provider/backends/quito/fake_quito.py +38 -0
  482. qiskit/providers/fake_provider/backends/quito/props_quito.json +1 -0
  483. qiskit/providers/fake_provider/backends/rochester/__init__.py +16 -0
  484. qiskit/providers/fake_provider/backends/rochester/conf_rochester.json +1 -0
  485. qiskit/providers/fake_provider/backends/rochester/fake_rochester.py +36 -0
  486. qiskit/providers/fake_provider/backends/rochester/props_rochester.json +1 -0
  487. qiskit/providers/fake_provider/backends/rome/__init__.py +16 -0
  488. qiskit/providers/fake_provider/backends/rome/conf_rome.json +1 -0
  489. qiskit/providers/fake_provider/backends/rome/defs_rome.json +1 -0
  490. qiskit/providers/fake_provider/backends/rome/fake_rome.py +38 -0
  491. qiskit/providers/fake_provider/backends/rome/props_rome.json +1 -0
  492. qiskit/providers/fake_provider/backends/rueschlikon/__init__.py +15 -0
  493. qiskit/providers/fake_provider/backends/rueschlikon/fake_rueschlikon.py +74 -0
  494. qiskit/providers/fake_provider/backends/santiago/__init__.py +16 -0
  495. qiskit/providers/fake_provider/backends/santiago/conf_santiago.json +1 -0
  496. qiskit/providers/fake_provider/backends/santiago/defs_santiago.json +1 -0
  497. qiskit/providers/fake_provider/backends/santiago/fake_santiago.py +38 -0
  498. qiskit/providers/fake_provider/backends/santiago/props_santiago.json +1 -0
  499. qiskit/providers/fake_provider/backends/sherbrooke/__init__.py +17 -0
  500. qiskit/providers/fake_provider/backends/sherbrooke/conf_sherbrooke.json +1 -0
  501. qiskit/providers/fake_provider/backends/sherbrooke/defs_sherbrooke.json +1 -0
  502. qiskit/providers/fake_provider/backends/sherbrooke/fake_sherbrooke.py +28 -0
  503. qiskit/providers/fake_provider/backends/sherbrooke/props_sherbrooke.json +1 -0
  504. qiskit/providers/fake_provider/backends/singapore/__init__.py +16 -0
  505. qiskit/providers/fake_provider/backends/singapore/conf_singapore.json +1 -0
  506. qiskit/providers/fake_provider/backends/singapore/fake_singapore.py +58 -0
  507. qiskit/providers/fake_provider/backends/singapore/props_singapore.json +1 -0
  508. qiskit/providers/fake_provider/backends/sydney/__init__.py +16 -0
  509. qiskit/providers/fake_provider/backends/sydney/conf_sydney.json +1 -0
  510. qiskit/providers/fake_provider/backends/sydney/defs_sydney.json +1 -0
  511. qiskit/providers/fake_provider/backends/sydney/fake_sydney.py +38 -0
  512. qiskit/providers/fake_provider/backends/sydney/props_sydney.json +1 -0
  513. qiskit/providers/fake_provider/backends/tenerife/__init__.py +15 -0
  514. qiskit/providers/fake_provider/backends/tenerife/fake_tenerife.py +64 -0
  515. qiskit/providers/fake_provider/backends/tenerife/props_tenerife.json +1 -0
  516. qiskit/providers/fake_provider/backends/tokyo/__init__.py +15 -0
  517. qiskit/providers/fake_provider/backends/tokyo/fake_tokyo.py +137 -0
  518. qiskit/providers/fake_provider/backends/tokyo/props_tokyo.json +1 -0
  519. qiskit/providers/fake_provider/backends/toronto/__init__.py +16 -0
  520. qiskit/providers/fake_provider/backends/toronto/conf_toronto.json +1 -0
  521. qiskit/providers/fake_provider/backends/toronto/defs_toronto.json +1 -0
  522. qiskit/providers/fake_provider/backends/toronto/fake_toronto.py +38 -0
  523. qiskit/providers/fake_provider/backends/toronto/props_toronto.json +1 -0
  524. qiskit/providers/fake_provider/backends/valencia/__init__.py +16 -0
  525. qiskit/providers/fake_provider/backends/valencia/conf_valencia.json +1 -0
  526. qiskit/providers/fake_provider/backends/valencia/defs_valencia.json +1 -0
  527. qiskit/providers/fake_provider/backends/valencia/fake_valencia.py +38 -0
  528. qiskit/providers/fake_provider/backends/valencia/props_valencia.json +1 -0
  529. qiskit/providers/fake_provider/backends/vigo/__init__.py +16 -0
  530. qiskit/providers/fake_provider/backends/vigo/conf_vigo.json +1 -0
  531. qiskit/providers/fake_provider/backends/vigo/fake_vigo.py +50 -0
  532. qiskit/providers/fake_provider/backends/vigo/props_vigo.json +1 -0
  533. qiskit/providers/fake_provider/backends/washington/__init__.py +18 -0
  534. qiskit/providers/fake_provider/backends/washington/conf_washington.json +1 -0
  535. qiskit/providers/fake_provider/backends/washington/defs_washington.json +1 -0
  536. qiskit/providers/fake_provider/backends/washington/fake_washington.py +38 -0
  537. qiskit/providers/fake_provider/backends/washington/props_washington.json +1 -0
  538. qiskit/providers/fake_provider/backends/yorktown/__init__.py +16 -0
  539. qiskit/providers/fake_provider/backends/yorktown/conf_yorktown.json +1 -0
  540. qiskit/providers/fake_provider/backends/yorktown/fake_yorktown.py +54 -0
  541. qiskit/providers/fake_provider/backends/yorktown/props_yorktown.json +1 -0
  542. qiskit/providers/fake_provider/fake_1q.py +91 -0
  543. qiskit/providers/fake_provider/fake_backend.py +572 -0
  544. qiskit/providers/fake_provider/fake_backend_v2.py +217 -0
  545. qiskit/providers/fake_provider/fake_job.py +81 -0
  546. qiskit/providers/fake_provider/fake_mumbai_v2.py +637 -0
  547. qiskit/providers/fake_provider/fake_openpulse_2q.py +342 -0
  548. qiskit/providers/fake_provider/fake_openpulse_3q.py +332 -0
  549. qiskit/providers/fake_provider/fake_provider.py +214 -0
  550. qiskit/providers/fake_provider/fake_pulse_backend.py +43 -0
  551. qiskit/providers/fake_provider/fake_qasm_backend.py +72 -0
  552. qiskit/providers/fake_provider/fake_qasm_simulator.py +48 -0
  553. qiskit/providers/fake_provider/fake_qobj.py +44 -0
  554. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  555. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  556. qiskit/providers/fake_provider/utils/configurable_backend.py +360 -0
  557. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  558. qiskit/providers/job.py +142 -0
  559. qiskit/providers/jobstatus.py +30 -0
  560. qiskit/providers/models/__init__.py +52 -0
  561. qiskit/providers/models/backendconfiguration.py +994 -0
  562. qiskit/providers/models/backendproperties.py +490 -0
  563. qiskit/providers/models/backendstatus.py +94 -0
  564. qiskit/providers/models/jobstatus.py +66 -0
  565. qiskit/providers/models/pulsedefaults.py +304 -0
  566. qiskit/providers/options.py +273 -0
  567. qiskit/providers/provider.py +79 -0
  568. qiskit/providers/providerutils.py +99 -0
  569. qiskit/pulse/__init__.py +170 -0
  570. qiskit/pulse/builder.py +2733 -0
  571. qiskit/pulse/calibration_entries.py +357 -0
  572. qiskit/pulse/channels.py +221 -0
  573. qiskit/pulse/configuration.py +244 -0
  574. qiskit/pulse/exceptions.py +43 -0
  575. qiskit/pulse/filters.py +302 -0
  576. qiskit/pulse/instruction_schedule_map.py +406 -0
  577. qiskit/pulse/instructions/__init__.py +69 -0
  578. qiskit/pulse/instructions/acquire.py +150 -0
  579. qiskit/pulse/instructions/call.py +176 -0
  580. qiskit/pulse/instructions/delay.py +69 -0
  581. qiskit/pulse/instructions/directives.py +145 -0
  582. qiskit/pulse/instructions/frequency.py +132 -0
  583. qiskit/pulse/instructions/instruction.py +266 -0
  584. qiskit/pulse/instructions/phase.py +149 -0
  585. qiskit/pulse/instructions/play.py +96 -0
  586. qiskit/pulse/instructions/reference.py +99 -0
  587. qiskit/pulse/instructions/snapshot.py +80 -0
  588. qiskit/pulse/library/__init__.py +99 -0
  589. qiskit/pulse/library/continuous.py +430 -0
  590. qiskit/pulse/library/parametric_pulses.py +629 -0
  591. qiskit/pulse/library/pulse.py +137 -0
  592. qiskit/pulse/library/samplers/__init__.py +15 -0
  593. qiskit/pulse/library/samplers/decorators.py +299 -0
  594. qiskit/pulse/library/samplers/strategies.py +71 -0
  595. qiskit/pulse/library/symbolic_pulses.py +1962 -0
  596. qiskit/pulse/library/waveform.py +134 -0
  597. qiskit/pulse/macros.py +256 -0
  598. qiskit/pulse/parameter_manager.py +432 -0
  599. qiskit/pulse/parser.py +314 -0
  600. qiskit/pulse/reference_manager.py +58 -0
  601. qiskit/pulse/schedule.py +2002 -0
  602. qiskit/pulse/transforms/__init__.py +106 -0
  603. qiskit/pulse/transforms/alignments.py +406 -0
  604. qiskit/pulse/transforms/base_transforms.py +71 -0
  605. qiskit/pulse/transforms/canonicalization.py +514 -0
  606. qiskit/pulse/transforms/dag.py +107 -0
  607. qiskit/pulse/utils.py +109 -0
  608. qiskit/qasm/libs/qelib1.inc +266 -0
  609. qiskit/qasm/libs/stdgates.inc +75 -0
  610. qiskit/qasm2/__init__.py +658 -0
  611. qiskit/qasm2/exceptions.py +27 -0
  612. qiskit/qasm2/export.py +374 -0
  613. qiskit/qasm2/parse.py +403 -0
  614. qiskit/qasm3/__init__.py +255 -0
  615. qiskit/qasm3/ast.py +606 -0
  616. qiskit/qasm3/exceptions.py +27 -0
  617. qiskit/qasm3/experimental.py +30 -0
  618. qiskit/qasm3/exporter.py +1079 -0
  619. qiskit/qasm3/printer.py +545 -0
  620. qiskit/qobj/__init__.py +75 -0
  621. qiskit/qobj/common.py +71 -0
  622. qiskit/qobj/converters/__init__.py +18 -0
  623. qiskit/qobj/converters/lo_config.py +168 -0
  624. qiskit/qobj/converters/pulse_instruction.py +1070 -0
  625. qiskit/qobj/pulse_qobj.py +655 -0
  626. qiskit/qobj/qasm_qobj.py +656 -0
  627. qiskit/qobj/utils.py +37 -0
  628. qiskit/qpy/__init__.py +1348 -0
  629. qiskit/qpy/binary_io/__init__.py +36 -0
  630. qiskit/qpy/binary_io/circuits.py +1212 -0
  631. qiskit/qpy/binary_io/schedules.py +619 -0
  632. qiskit/qpy/binary_io/value.py +549 -0
  633. qiskit/qpy/common.py +305 -0
  634. qiskit/qpy/exceptions.py +28 -0
  635. qiskit/qpy/formats.py +360 -0
  636. qiskit/qpy/interface.py +308 -0
  637. qiskit/qpy/type_keys.py +544 -0
  638. qiskit/quantum_info/__init__.py +173 -0
  639. qiskit/quantum_info/analysis/__init__.py +17 -0
  640. qiskit/quantum_info/analysis/average.py +47 -0
  641. qiskit/quantum_info/analysis/distance.py +101 -0
  642. qiskit/quantum_info/analysis/make_observable.py +43 -0
  643. qiskit/quantum_info/analysis/z2_symmetries.py +483 -0
  644. qiskit/quantum_info/operators/__init__.py +28 -0
  645. qiskit/quantum_info/operators/base_operator.py +145 -0
  646. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  647. qiskit/quantum_info/operators/channel/chi.py +190 -0
  648. qiskit/quantum_info/operators/channel/choi.py +217 -0
  649. qiskit/quantum_info/operators/channel/kraus.py +336 -0
  650. qiskit/quantum_info/operators/channel/ptm.py +203 -0
  651. qiskit/quantum_info/operators/channel/quantum_channel.py +350 -0
  652. qiskit/quantum_info/operators/channel/stinespring.py +295 -0
  653. qiskit/quantum_info/operators/channel/superop.py +376 -0
  654. qiskit/quantum_info/operators/channel/transformations.py +467 -0
  655. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  656. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  657. qiskit/quantum_info/operators/dihedral/dihedral.py +508 -0
  658. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +218 -0
  659. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  660. qiskit/quantum_info/operators/dihedral/random.py +61 -0
  661. qiskit/quantum_info/operators/linear_op.py +25 -0
  662. qiskit/quantum_info/operators/measures.py +423 -0
  663. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  664. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  665. qiskit/quantum_info/operators/mixins/group.py +171 -0
  666. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  667. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  668. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  669. qiskit/quantum_info/operators/op_shape.py +533 -0
  670. qiskit/quantum_info/operators/operator.py +778 -0
  671. qiskit/quantum_info/operators/predicates.py +170 -0
  672. qiskit/quantum_info/operators/random.py +154 -0
  673. qiskit/quantum_info/operators/scalar_op.py +253 -0
  674. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  675. qiskit/quantum_info/operators/symplectic/base_pauli.py +720 -0
  676. qiskit/quantum_info/operators/symplectic/clifford.py +1022 -0
  677. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  678. qiskit/quantum_info/operators/symplectic/pauli.py +699 -0
  679. qiskit/quantum_info/operators/symplectic/pauli_list.py +1209 -0
  680. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  681. qiskit/quantum_info/operators/symplectic/random.py +264 -0
  682. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1156 -0
  683. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  684. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  685. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  686. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  687. qiskit/quantum_info/random.py +26 -0
  688. qiskit/quantum_info/states/__init__.py +28 -0
  689. qiskit/quantum_info/states/densitymatrix.py +848 -0
  690. qiskit/quantum_info/states/measures.py +288 -0
  691. qiskit/quantum_info/states/quantum_state.py +503 -0
  692. qiskit/quantum_info/states/random.py +157 -0
  693. qiskit/quantum_info/states/stabilizerstate.py +638 -0
  694. qiskit/quantum_info/states/statevector.py +961 -0
  695. qiskit/quantum_info/states/utils.py +245 -0
  696. qiskit/quantum_info/synthesis/__init__.py +20 -0
  697. qiskit/quantum_info/synthesis/clifford_decompose.py +69 -0
  698. qiskit/quantum_info/synthesis/cnotdihedral_decompose.py +50 -0
  699. qiskit/quantum_info/synthesis/ion_decompose.py +55 -0
  700. qiskit/quantum_info/synthesis/local_invariance.py +93 -0
  701. qiskit/quantum_info/synthesis/one_qubit_decompose.py +284 -0
  702. qiskit/quantum_info/synthesis/qsd.py +269 -0
  703. qiskit/quantum_info/synthesis/quaternion.py +156 -0
  704. qiskit/quantum_info/synthesis/two_qubit_decompose.py +1567 -0
  705. qiskit/quantum_info/synthesis/weyl.py +98 -0
  706. qiskit/quantum_info/synthesis/xx_decompose/__init__.py +19 -0
  707. qiskit/quantum_info/synthesis/xx_decompose/circuits.py +299 -0
  708. qiskit/quantum_info/synthesis/xx_decompose/decomposer.py +314 -0
  709. qiskit/quantum_info/synthesis/xx_decompose/embodiments.py +163 -0
  710. qiskit/quantum_info/synthesis/xx_decompose/paths.py +412 -0
  711. qiskit/quantum_info/synthesis/xx_decompose/polytopes.py +264 -0
  712. qiskit/quantum_info/synthesis/xx_decompose/utilities.py +40 -0
  713. qiskit/quantum_info/synthesis/xx_decompose/weyl.py +133 -0
  714. qiskit/result/__init__.py +67 -0
  715. qiskit/result/counts.py +189 -0
  716. qiskit/result/distributions/__init__.py +17 -0
  717. qiskit/result/distributions/probability.py +100 -0
  718. qiskit/result/distributions/quasi.py +154 -0
  719. qiskit/result/exceptions.py +40 -0
  720. qiskit/result/mitigation/__init__.py +13 -0
  721. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  722. qiskit/result/mitigation/correlated_readout_mitigator.py +268 -0
  723. qiskit/result/mitigation/local_readout_mitigator.py +319 -0
  724. qiskit/result/mitigation/utils.py +161 -0
  725. qiskit/result/models.py +233 -0
  726. qiskit/result/postprocess.py +239 -0
  727. qiskit/result/result.py +397 -0
  728. qiskit/result/sampled_expval.py +75 -0
  729. qiskit/result/utils.py +295 -0
  730. qiskit/scheduler/__init__.py +31 -0
  731. qiskit/scheduler/config.py +35 -0
  732. qiskit/scheduler/lowering.py +187 -0
  733. qiskit/scheduler/methods/__init__.py +22 -0
  734. qiskit/scheduler/methods/basic.py +137 -0
  735. qiskit/scheduler/schedule_circuit.py +67 -0
  736. qiskit/scheduler/sequence.py +102 -0
  737. qiskit/synthesis/__init__.py +122 -0
  738. qiskit/synthesis/clifford/__init__.py +19 -0
  739. qiskit/synthesis/clifford/clifford_decompose_ag.py +176 -0
  740. qiskit/synthesis/clifford/clifford_decompose_bm.py +276 -0
  741. qiskit/synthesis/clifford/clifford_decompose_full.py +61 -0
  742. qiskit/synthesis/clifford/clifford_decompose_greedy.py +347 -0
  743. qiskit/synthesis/clifford/clifford_decompose_layers.py +443 -0
  744. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  745. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +46 -0
  746. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +140 -0
  747. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +264 -0
  748. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  749. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  750. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  751. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  752. qiskit/synthesis/discrete_basis/solovay_kitaev.py +207 -0
  753. qiskit/synthesis/evolution/__init__.py +20 -0
  754. qiskit/synthesis/evolution/evolution_synthesis.py +46 -0
  755. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  756. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  757. qiskit/synthesis/evolution/product_formula.py +328 -0
  758. qiskit/synthesis/evolution/qdrift.py +102 -0
  759. qiskit/synthesis/evolution/suzuki_trotter.py +145 -0
  760. qiskit/synthesis/linear/__init__.py +25 -0
  761. qiskit/synthesis/linear/cnot_synth.py +141 -0
  762. qiskit/synthesis/linear/linear_circuits_utils.py +127 -0
  763. qiskit/synthesis/linear/linear_depth_lnn.py +275 -0
  764. qiskit/synthesis/linear/linear_matrix_utils.py +175 -0
  765. qiskit/synthesis/linear_phase/__init__.py +17 -0
  766. qiskit/synthesis/linear_phase/cnot_phase_synth.py +203 -0
  767. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  768. qiskit/synthesis/linear_phase/cz_depth_lnn.py +206 -0
  769. qiskit/synthesis/permutation/__init__.py +17 -0
  770. qiskit/synthesis/permutation/permutation_full.py +90 -0
  771. qiskit/synthesis/permutation/permutation_lnn.py +68 -0
  772. qiskit/synthesis/permutation/permutation_utils.py +73 -0
  773. qiskit/synthesis/stabilizer/__init__.py +15 -0
  774. qiskit/synthesis/stabilizer/stabilizer_decompose.py +188 -0
  775. qiskit/test/__init__.py +18 -0
  776. qiskit/test/_canonical.py +125 -0
  777. qiskit/test/base.py +331 -0
  778. qiskit/test/decorators.py +308 -0
  779. qiskit/test/ibmq_mock.py +45 -0
  780. qiskit/test/mock/__init__.py +40 -0
  781. qiskit/test/mock/backends/__init__.py +32 -0
  782. qiskit/test/mock/backends/almaden/__init__.py +32 -0
  783. qiskit/test/mock/backends/armonk/__init__.py +32 -0
  784. qiskit/test/mock/backends/athens/__init__.py +32 -0
  785. qiskit/test/mock/backends/belem/__init__.py +32 -0
  786. qiskit/test/mock/backends/boeblingen/__init__.py +32 -0
  787. qiskit/test/mock/backends/bogota/__init__.py +32 -0
  788. qiskit/test/mock/backends/brooklyn/__init__.py +32 -0
  789. qiskit/test/mock/backends/burlington/__init__.py +32 -0
  790. qiskit/test/mock/backends/cairo/__init__.py +32 -0
  791. qiskit/test/mock/backends/cambridge/__init__.py +32 -0
  792. qiskit/test/mock/backends/casablanca/__init__.py +32 -0
  793. qiskit/test/mock/backends/essex/__init__.py +32 -0
  794. qiskit/test/mock/backends/guadalupe/__init__.py +32 -0
  795. qiskit/test/mock/backends/hanoi/__init__.py +32 -0
  796. qiskit/test/mock/backends/jakarta/__init__.py +32 -0
  797. qiskit/test/mock/backends/johannesburg/__init__.py +32 -0
  798. qiskit/test/mock/backends/kolkata/__init__.py +32 -0
  799. qiskit/test/mock/backends/lagos/__init__.py +32 -0
  800. qiskit/test/mock/backends/lima/__init__.py +32 -0
  801. qiskit/test/mock/backends/london/__init__.py +32 -0
  802. qiskit/test/mock/backends/manhattan/__init__.py +32 -0
  803. qiskit/test/mock/backends/manila/__init__.py +32 -0
  804. qiskit/test/mock/backends/melbourne/__init__.py +32 -0
  805. qiskit/test/mock/backends/montreal/__init__.py +32 -0
  806. qiskit/test/mock/backends/mumbai/__init__.py +32 -0
  807. qiskit/test/mock/backends/nairobi/__init__.py +32 -0
  808. qiskit/test/mock/backends/ourense/__init__.py +32 -0
  809. qiskit/test/mock/backends/paris/__init__.py +32 -0
  810. qiskit/test/mock/backends/poughkeepsie/__init__.py +32 -0
  811. qiskit/test/mock/backends/quito/__init__.py +32 -0
  812. qiskit/test/mock/backends/rochester/__init__.py +32 -0
  813. qiskit/test/mock/backends/rome/__init__.py +32 -0
  814. qiskit/test/mock/backends/rueschlikon/__init__.py +32 -0
  815. qiskit/test/mock/backends/santiago/__init__.py +32 -0
  816. qiskit/test/mock/backends/singapore/__init__.py +32 -0
  817. qiskit/test/mock/backends/sydney/__init__.py +32 -0
  818. qiskit/test/mock/backends/tenerife/__init__.py +32 -0
  819. qiskit/test/mock/backends/tokyo/__init__.py +32 -0
  820. qiskit/test/mock/backends/toronto/__init__.py +32 -0
  821. qiskit/test/mock/backends/valencia/__init__.py +32 -0
  822. qiskit/test/mock/backends/vigo/__init__.py +32 -0
  823. qiskit/test/mock/backends/washington/__init__.py +32 -0
  824. qiskit/test/mock/backends/yorktown/__init__.py +32 -0
  825. qiskit/test/providers/__init__.py +16 -0
  826. qiskit/test/providers/backend.py +75 -0
  827. qiskit/test/providers/provider.py +59 -0
  828. qiskit/test/reference_circuits.py +41 -0
  829. qiskit/test/testing_options.py +93 -0
  830. qiskit/test/utils.py +87 -0
  831. qiskit/tools/__init__.py +44 -0
  832. qiskit/tools/events/__init__.py +25 -0
  833. qiskit/tools/events/progressbar.py +195 -0
  834. qiskit/tools/events/pubsub.py +158 -0
  835. qiskit/tools/jupyter/__init__.py +138 -0
  836. qiskit/tools/jupyter/backend_monitor.py +588 -0
  837. qiskit/tools/jupyter/backend_overview.py +322 -0
  838. qiskit/tools/jupyter/copyright.py +42 -0
  839. qiskit/tools/jupyter/job_watcher.py +167 -0
  840. qiskit/tools/jupyter/job_widgets.py +160 -0
  841. qiskit/tools/jupyter/jupyter_magics.py +190 -0
  842. qiskit/tools/jupyter/library.py +189 -0
  843. qiskit/tools/jupyter/monospace.py +29 -0
  844. qiskit/tools/jupyter/progressbar.py +122 -0
  845. qiskit/tools/jupyter/version_table.py +67 -0
  846. qiskit/tools/jupyter/watcher_monitor.py +74 -0
  847. qiskit/tools/monitor/__init__.py +16 -0
  848. qiskit/tools/monitor/job_monitor.py +107 -0
  849. qiskit/tools/monitor/overview.py +247 -0
  850. qiskit/tools/parallel.py +198 -0
  851. qiskit/tools/visualization.py +16 -0
  852. qiskit/transpiler/__init__.py +1287 -0
  853. qiskit/transpiler/basepasses.py +221 -0
  854. qiskit/transpiler/coupling.py +500 -0
  855. qiskit/transpiler/exceptions.py +55 -0
  856. qiskit/transpiler/fencedobjs.py +78 -0
  857. qiskit/transpiler/instruction_durations.py +278 -0
  858. qiskit/transpiler/layout.py +658 -0
  859. qiskit/transpiler/passes/__init__.py +296 -0
  860. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  861. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  862. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  863. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  864. qiskit/transpiler/passes/analysis/depth.py +33 -0
  865. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  866. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  867. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  868. qiskit/transpiler/passes/analysis/size.py +36 -0
  869. qiskit/transpiler/passes/analysis/width.py +27 -0
  870. qiskit/transpiler/passes/basis/__init__.py +20 -0
  871. qiskit/transpiler/passes/basis/basis_translator.py +697 -0
  872. qiskit/transpiler/passes/basis/decompose.py +98 -0
  873. qiskit/transpiler/passes/basis/translate_parameterized.py +177 -0
  874. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +86 -0
  875. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +107 -0
  876. qiskit/transpiler/passes/basis/unroller.py +145 -0
  877. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  878. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  879. qiskit/transpiler/passes/calibration/builders.py +20 -0
  880. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  881. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  882. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  883. qiskit/transpiler/passes/calibration/rzx_builder.py +394 -0
  884. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  885. qiskit/transpiler/passes/layout/__init__.py +27 -0
  886. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  887. qiskit/transpiler/passes/layout/apply_layout.py +108 -0
  888. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  889. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  890. qiskit/transpiler/passes/layout/disjoint_utils.py +205 -0
  891. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  892. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  893. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  894. qiskit/transpiler/passes/layout/noise_adaptive_layout.py +311 -0
  895. qiskit/transpiler/passes/layout/sabre_layout.py +468 -0
  896. qiskit/transpiler/passes/layout/sabre_pre_layout.py +217 -0
  897. qiskit/transpiler/passes/layout/set_layout.py +64 -0
  898. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  899. qiskit/transpiler/passes/layout/vf2_layout.py +257 -0
  900. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  901. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  902. qiskit/transpiler/passes/optimization/__init__.py +38 -0
  903. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  904. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  905. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  906. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  907. qiskit/transpiler/passes/optimization/collect_cliffords.py +97 -0
  908. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  909. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  910. qiskit/transpiler/passes/optimization/commutation_analysis.py +93 -0
  911. qiskit/transpiler/passes/optimization/commutative_cancellation.py +207 -0
  912. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +97 -0
  913. qiskit/transpiler/passes/optimization/consolidate_blocks.py +219 -0
  914. qiskit/transpiler/passes/optimization/crosstalk_adaptive_schedule.py +732 -0
  915. qiskit/transpiler/passes/optimization/cx_cancellation.py +55 -0
  916. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  917. qiskit/transpiler/passes/optimization/hoare_opt.py +416 -0
  918. qiskit/transpiler/passes/optimization/inverse_cancellation.py +177 -0
  919. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  920. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  921. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +263 -0
  922. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  923. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  924. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  925. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +69 -0
  926. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  927. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  928. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  929. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  930. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +454 -0
  931. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  932. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  933. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +629 -0
  934. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  935. qiskit/transpiler/passes/routing/__init__.py +21 -0
  936. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  937. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  938. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  939. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  940. qiskit/transpiler/passes/routing/basic_swap.py +155 -0
  941. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  942. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  943. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +387 -0
  944. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +141 -0
  945. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  946. qiskit/transpiler/passes/routing/layout_transformation.py +118 -0
  947. qiskit/transpiler/passes/routing/lookahead_swap.py +384 -0
  948. qiskit/transpiler/passes/routing/sabre_swap.py +430 -0
  949. qiskit/transpiler/passes/routing/stochastic_swap.py +512 -0
  950. qiskit/transpiler/passes/routing/utils.py +35 -0
  951. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  952. qiskit/transpiler/passes/scheduling/alap.py +155 -0
  953. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  954. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +256 -0
  955. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +75 -0
  956. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +97 -0
  957. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +241 -0
  958. qiskit/transpiler/passes/scheduling/asap.py +177 -0
  959. qiskit/transpiler/passes/scheduling/base_scheduler.py +289 -0
  960. qiskit/transpiler/passes/scheduling/calibration_creators.py +27 -0
  961. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +285 -0
  962. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  963. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  964. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +408 -0
  965. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  966. qiskit/transpiler/passes/scheduling/rzx_templates.py +28 -0
  967. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  968. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  969. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  970. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +89 -0
  971. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  972. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +135 -0
  973. qiskit/transpiler/passes/synthesis/__init__.py +19 -0
  974. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +637 -0
  975. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +63 -0
  976. qiskit/transpiler/passes/synthesis/plugin.py +597 -0
  977. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +289 -0
  978. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +895 -0
  979. qiskit/transpiler/passes/utils/__init__.py +34 -0
  980. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  981. qiskit/transpiler/passes/utils/block_to_matrix.py +47 -0
  982. qiskit/transpiler/passes/utils/check_gate_direction.py +87 -0
  983. qiskit/transpiler/passes/utils/check_map.py +94 -0
  984. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  985. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  986. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +89 -0
  987. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  988. qiskit/transpiler/passes/utils/error.py +69 -0
  989. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  990. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  991. qiskit/transpiler/passes/utils/gate_direction.py +347 -0
  992. qiskit/transpiler/passes/utils/gates_basis.py +75 -0
  993. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  994. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  995. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  996. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  997. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  998. qiskit/transpiler/passmanager.py +617 -0
  999. qiskit/transpiler/passmanager_config.py +193 -0
  1000. qiskit/transpiler/preset_passmanagers/__init__.py +280 -0
  1001. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +971 -0
  1002. qiskit/transpiler/preset_passmanagers/common.py +651 -0
  1003. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  1004. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  1005. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  1006. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  1007. qiskit/transpiler/preset_passmanagers/plugin.py +345 -0
  1008. qiskit/transpiler/propertyset.py +19 -0
  1009. qiskit/transpiler/runningpassmanager.py +174 -0
  1010. qiskit/transpiler/synthesis/__init__.py +16 -0
  1011. qiskit/transpiler/synthesis/aqc/__init__.py +178 -0
  1012. qiskit/transpiler/synthesis/aqc/approximate.py +116 -0
  1013. qiskit/transpiler/synthesis/aqc/aqc.py +170 -0
  1014. qiskit/transpiler/synthesis/aqc/aqc_plugin.py +146 -0
  1015. qiskit/transpiler/synthesis/aqc/cnot_structures.py +299 -0
  1016. qiskit/transpiler/synthesis/aqc/cnot_unit_circuit.py +103 -0
  1017. qiskit/transpiler/synthesis/aqc/cnot_unit_objective.py +299 -0
  1018. qiskit/transpiler/synthesis/aqc/elementary_operations.py +108 -0
  1019. qiskit/transpiler/synthesis/aqc/fast_gradient/__init__.py +164 -0
  1020. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_grad_utils.py +237 -0
  1021. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_gradient.py +225 -0
  1022. qiskit/transpiler/synthesis/aqc/fast_gradient/layer.py +370 -0
  1023. qiskit/transpiler/synthesis/aqc/fast_gradient/pmatrix.py +312 -0
  1024. qiskit/transpiler/synthesis/graysynth.py +114 -0
  1025. qiskit/transpiler/target.py +1540 -0
  1026. qiskit/transpiler/timing_constraints.py +59 -0
  1027. qiskit/user_config.py +239 -0
  1028. qiskit/utils/__init__.py +66 -0
  1029. qiskit/utils/classtools.py +146 -0
  1030. qiskit/utils/deprecation.py +489 -0
  1031. qiskit/utils/lazy_tester.py +334 -0
  1032. qiskit/utils/multiprocessing.py +48 -0
  1033. qiskit/utils/optionals.py +320 -0
  1034. qiskit/utils/units.py +143 -0
  1035. qiskit/version.py +84 -0
  1036. qiskit/visualization/__init__.py +289 -0
  1037. qiskit/visualization/array.py +204 -0
  1038. qiskit/visualization/bloch.py +741 -0
  1039. qiskit/visualization/circuit/__init__.py +15 -0
  1040. qiskit/visualization/circuit/_utils.py +633 -0
  1041. qiskit/visualization/circuit/circuit_visualization.py +717 -0
  1042. qiskit/visualization/circuit/latex.py +659 -0
  1043. qiskit/visualization/circuit/matplotlib.py +1975 -0
  1044. qiskit/visualization/circuit/qcstyle.py +420 -0
  1045. qiskit/visualization/circuit/styles/bw.json +202 -0
  1046. qiskit/visualization/circuit/styles/clifford.json +202 -0
  1047. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  1048. qiskit/visualization/circuit/styles/iqp.json +214 -0
  1049. qiskit/visualization/circuit/styles/textbook.json +202 -0
  1050. qiskit/visualization/circuit/text.py +1802 -0
  1051. qiskit/visualization/circuit_visualization.py +19 -0
  1052. qiskit/visualization/counts_visualization.py +496 -0
  1053. qiskit/visualization/dag_visualization.py +224 -0
  1054. qiskit/visualization/exceptions.py +21 -0
  1055. qiskit/visualization/gate_map.py +1461 -0
  1056. qiskit/visualization/pass_manager_visualization.py +281 -0
  1057. qiskit/visualization/pulse_v2/__init__.py +21 -0
  1058. qiskit/visualization/pulse_v2/core.py +905 -0
  1059. qiskit/visualization/pulse_v2/device_info.py +146 -0
  1060. qiskit/visualization/pulse_v2/drawings.py +253 -0
  1061. qiskit/visualization/pulse_v2/events.py +254 -0
  1062. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  1063. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  1064. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  1065. qiskit/visualization/pulse_v2/generators/frame.py +437 -0
  1066. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  1067. qiskit/visualization/pulse_v2/generators/waveform.py +649 -0
  1068. qiskit/visualization/pulse_v2/interface.py +452 -0
  1069. qiskit/visualization/pulse_v2/layouts.py +395 -0
  1070. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  1071. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  1072. qiskit/visualization/pulse_v2/plotters/matplotlib.py +202 -0
  1073. qiskit/visualization/pulse_v2/stylesheet.py +322 -0
  1074. qiskit/visualization/pulse_v2/types.py +242 -0
  1075. qiskit/visualization/qcstyle.py +17 -0
  1076. qiskit/visualization/state_visualization.py +1518 -0
  1077. qiskit/visualization/timeline/__init__.py +21 -0
  1078. qiskit/visualization/timeline/core.py +457 -0
  1079. qiskit/visualization/timeline/drawings.py +260 -0
  1080. qiskit/visualization/timeline/generators.py +506 -0
  1081. qiskit/visualization/timeline/interface.py +414 -0
  1082. qiskit/visualization/timeline/layouts.py +115 -0
  1083. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  1084. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  1085. qiskit/visualization/timeline/plotters/matplotlib.py +193 -0
  1086. qiskit/visualization/timeline/stylesheet.py +311 -0
  1087. qiskit/visualization/timeline/types.py +148 -0
  1088. qiskit/visualization/transition_visualization.py +364 -0
  1089. qiskit/visualization/utils.py +49 -0
  1090. qiskit-1.0.0b1.dist-info/LICENSE.txt +203 -0
  1091. qiskit-1.0.0b1.dist-info/METADATA +430 -0
  1092. qiskit-1.0.0b1.dist-info/RECORD +1095 -0
  1093. qiskit-1.0.0b1.dist-info/WHEEL +6 -0
  1094. qiskit-1.0.0b1.dist-info/entry_points.txt +49 -0
  1095. qiskit-1.0.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1022 @@
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
+ Clifford operator class.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import functools
18
+ import itertools
19
+ import re
20
+ from typing import Literal
21
+
22
+ import numpy as np
23
+
24
+ from qiskit.circuit import Instruction, QuantumCircuit
25
+ from qiskit.circuit.library.standard_gates import HGate, IGate, SGate, XGate, YGate, ZGate
26
+ from qiskit.circuit.operation import Operation
27
+ from qiskit.exceptions import QiskitError
28
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
29
+ from qiskit.quantum_info.operators.mixins import AdjointMixin, generate_apidocs
30
+ from qiskit.quantum_info.operators.operator import Operator
31
+ from qiskit.quantum_info.operators.scalar_op import ScalarOp
32
+ from qiskit.quantum_info.operators.symplectic.base_pauli import _count_y
33
+ from qiskit.utils.deprecation import deprecate_func
34
+ from qiskit.synthesis.linear import calc_inverse_matrix
35
+
36
+ from .base_pauli import BasePauli
37
+ from .clifford_circuits import _append_circuit, _append_operation
38
+
39
+
40
+ class Clifford(BaseOperator, AdjointMixin, Operation):
41
+ """An N-qubit unitary operator from the Clifford group.
42
+
43
+ **Representation**
44
+
45
+ An *N*-qubit Clifford operator is stored as a length *2N × (2N+1)*
46
+ boolean tableau using the convention from reference [1].
47
+
48
+ * Rows 0 to *N-1* are the *destabilizer* group generators
49
+ * Rows *N* to *2N-1* are the *stabilizer* group generators.
50
+
51
+ The internal boolean tableau for the Clifford
52
+ can be accessed using the :attr:`tableau` attribute. The destabilizer or
53
+ stabilizer rows can each be accessed as a length-N Stabilizer table using
54
+ :attr:`destab` and :attr:`stab` attributes.
55
+
56
+ A more easily human readable representation of the Clifford operator can
57
+ be obtained by calling the :meth:`to_dict` method. This representation is
58
+ also used if a Clifford object is printed as in the following example
59
+
60
+ .. code-block::
61
+
62
+ from qiskit import QuantumCircuit
63
+ from qiskit.quantum_info import Clifford
64
+
65
+ # Bell state generation circuit
66
+ qc = QuantumCircuit(2)
67
+ qc.h(0)
68
+ qc.cx(0, 1)
69
+ cliff = Clifford(qc)
70
+
71
+ # Print the Clifford
72
+ print(cliff)
73
+
74
+ # Print the Clifford destabilizer rows
75
+ print(cliff.to_labels(mode="D"))
76
+
77
+ # Print the Clifford stabilizer rows
78
+ print(cliff.to_labels(mode="S"))
79
+
80
+ .. parsed-literal::
81
+
82
+ Clifford: Stabilizer = ['+XX', '+ZZ'], Destabilizer = ['+IZ', '+XI']
83
+ ['+IZ', '+XI']
84
+ ['+XX', '+ZZ']
85
+
86
+ **Circuit Conversion**
87
+
88
+ Clifford operators can be initialized from circuits containing *only* the
89
+ following Clifford gates: :class:`~qiskit.circuit.library.IGate`,
90
+ :class:`~qiskit.circuit.library.XGate`, :class:`~qiskit.circuit.library.YGate`,
91
+ :class:`~qiskit.circuit.library.ZGate`, :class:`~qiskit.circuit.library.HGate`,
92
+ :class:`~qiskit.circuit.library.SGate`, :class:`~qiskit.circuit.library.SdgGate`,
93
+ :class:`~qiskit.circuit.library.SXGate`, :class:`~qiskit.circuit.library.SXdgGate`,
94
+ :class:`~qiskit.circuit.library.CXGate`, :class:`~qiskit.circuit.library.CZGate`,
95
+ :class:`~qiskit.circuit.library.CYGate`, :class:`~qiskit.circuit.library.DXGate`,
96
+ :class:`~qiskit.circuit.library.SwapGate`, :class:`~qiskit.circuit.library.iSwapGate`,
97
+ :class:`~qiskit.circuit.library.ECRGate`, :class:`~qiskit.circuit.library.LinearFunction`,
98
+ :class:`~qiskit.circuit.library.PermutationGate`.
99
+ They can be converted back into a :class:`~qiskit.circuit.QuantumCircuit`,
100
+ or :class:`~qiskit.circuit.Gate` object using the :meth:`~Clifford.to_circuit`
101
+ or :meth:`~Clifford.to_instruction` methods respectively. Note that this
102
+ decomposition is not necessarily optimal in terms of number of gates.
103
+
104
+ .. note::
105
+
106
+ A minimally generating set of gates for Clifford circuits is
107
+ the :class:`~qiskit.circuit.library.HGate` and
108
+ :class:`~qiskit.circuit.library.SGate` gate and *either* the
109
+ :class:`~qiskit.circuit.library.CXGate` or
110
+ :class:`~qiskit.circuit.library.CZGate` two-qubit gate.
111
+
112
+ Clifford operators can also be converted to
113
+ :class:`~qiskit.quantum_info.Operator` objects using the
114
+ :meth:`to_operator` method. This is done via decomposing to a circuit, and then
115
+ simulating the circuit as a unitary operator.
116
+
117
+ References:
118
+ 1. S. Aaronson, D. Gottesman, *Improved Simulation of Stabilizer Circuits*,
119
+ Phys. Rev. A 70, 052328 (2004).
120
+ `arXiv:quant-ph/0406196 <https://arxiv.org/abs/quant-ph/0406196>`_
121
+ """
122
+
123
+ _COMPOSE_PHASE_LOOKUP = None
124
+ _COMPOSE_1Q_LOOKUP = None
125
+
126
+ def __array__(self, dtype=None):
127
+ if dtype:
128
+ return np.asarray(self.to_matrix(), dtype=dtype)
129
+ return self.to_matrix()
130
+
131
+ def __init__(self, data, validate=True, copy=True):
132
+ """Initialize an operator object."""
133
+
134
+ # pylint: disable=cyclic-import
135
+ from qiskit.circuit.library import LinearFunction, PermutationGate
136
+
137
+ # Initialize from another Clifford
138
+ if isinstance(data, Clifford):
139
+ num_qubits = data.num_qubits
140
+ self.tableau = data.tableau.copy() if copy else data.tableau
141
+
142
+ # Initialize from ScalarOp as N-qubit identity discarding any global phase
143
+ elif isinstance(data, ScalarOp):
144
+ if not data.num_qubits or not data.is_unitary():
145
+ raise QiskitError("Can only initialize from N-qubit identity ScalarOp.")
146
+ num_qubits = data.num_qubits
147
+ self.tableau = np.fromfunction(
148
+ lambda i, j: i == j, (2 * num_qubits, 2 * num_qubits + 1)
149
+ ).astype(bool)
150
+
151
+ # Initialize from LinearFunction
152
+ elif isinstance(data, LinearFunction):
153
+ num_qubits = len(data.linear)
154
+ self.tableau = self.from_linear_function(data)
155
+
156
+ # Initialize from PermutationGate
157
+ elif isinstance(data, PermutationGate):
158
+ num_qubits = len(data.pattern)
159
+ self.tableau = self.from_permutation(data)
160
+
161
+ # Initialize from a QuantumCircuit or Instruction object
162
+ elif isinstance(data, (QuantumCircuit, Instruction)):
163
+ num_qubits = data.num_qubits
164
+ self.tableau = Clifford.from_circuit(data).tableau
165
+
166
+ # Initialize StabilizerTable directly from the data
167
+ else:
168
+ if isinstance(data, (list, np.ndarray)) and np.asarray(data, dtype=bool).ndim == 2:
169
+ data = np.array(data, dtype=bool, copy=copy)
170
+ if data.shape[0] == data.shape[1]:
171
+ self.tableau = self._stack_table_phase(
172
+ data, np.zeros(data.shape[0], dtype=bool)
173
+ )
174
+ num_qubits = data.shape[0] // 2
175
+ elif data.shape[0] + 1 == data.shape[1]:
176
+ self.tableau = data
177
+ num_qubits = data.shape[0] // 2
178
+ else:
179
+ raise QiskitError("")
180
+ else:
181
+ n_paulis = len(data)
182
+ symp = self._from_label(data[0])
183
+ num_qubits = len(symp) // 2
184
+ tableau = np.zeros((n_paulis, len(symp)), dtype=bool)
185
+ tableau[0] = symp
186
+ for i in range(1, n_paulis):
187
+ tableau[i] = self._from_label(data[i])
188
+ self.tableau = tableau
189
+
190
+ # Validate table is a symplectic matrix
191
+ if validate and not Clifford._is_symplectic(self.symplectic_matrix):
192
+ raise QiskitError(
193
+ "Invalid Clifford. Input StabilizerTable is not a valid symplectic matrix."
194
+ )
195
+
196
+ # Initialize BaseOperator
197
+ super().__init__(num_qubits=num_qubits)
198
+
199
+ @property
200
+ def name(self):
201
+ """Unique string identifier for operation type."""
202
+ return "clifford"
203
+
204
+ @property
205
+ def num_clbits(self):
206
+ """Number of classical bits."""
207
+ return 0
208
+
209
+ def __repr__(self):
210
+ return f"Clifford({repr(self.tableau)})"
211
+
212
+ def __str__(self):
213
+ return (
214
+ f'Clifford: Stabilizer = {self.to_labels(mode="S")}, '
215
+ f'Destabilizer = {self.to_labels(mode="D")}'
216
+ )
217
+
218
+ def __eq__(self, other):
219
+ """Check if two Clifford tables are equal"""
220
+ return super().__eq__(other) and (self.tableau == other.tableau).all()
221
+
222
+ def copy(self):
223
+ return type(self)(self, validate=False, copy=True)
224
+
225
+ # ---------------------------------------------------------------------
226
+ # Attributes
227
+ # ---------------------------------------------------------------------
228
+
229
+ # pylint: disable=bad-docstring-quotes
230
+
231
+ @deprecate_func(
232
+ since="0.24.0",
233
+ package_name="qiskit-terra",
234
+ additional_msg="Instead, index or iterate through the Clifford.tableau attribute.",
235
+ )
236
+ def __getitem__(self, key):
237
+ """Return a stabilizer Pauli row"""
238
+ return self.table.__getitem__(key)
239
+
240
+ @deprecate_func(
241
+ since="0.24.0",
242
+ package_name="qiskit-terra",
243
+ additional_msg="Use Clifford.tableau property instead.",
244
+ )
245
+ def __setitem__(self, key, value):
246
+ """Set a stabilizer Pauli row"""
247
+ self.tableau.__setitem__(key, self._stack_table_phase(value.array, value.phase))
248
+
249
+ @property
250
+ def symplectic_matrix(self):
251
+ """Return boolean symplectic matrix."""
252
+ return self.tableau[:, :-1]
253
+
254
+ @symplectic_matrix.setter
255
+ def symplectic_matrix(self, value):
256
+ self.tableau[:, :-1] = value
257
+
258
+ @property
259
+ def phase(self):
260
+ """Return phase with boolean representation."""
261
+ return self.tableau[:, -1]
262
+
263
+ @phase.setter
264
+ def phase(self, value):
265
+ self.tableau[:, -1] = value
266
+
267
+ @property
268
+ def x(self):
269
+ """The x array for the symplectic representation."""
270
+ return self.tableau[:, 0 : self.num_qubits]
271
+
272
+ @x.setter
273
+ def x(self, value):
274
+ self.tableau[:, 0 : self.num_qubits] = value
275
+
276
+ @property
277
+ def z(self):
278
+ """The z array for the symplectic representation."""
279
+ return self.tableau[:, self.num_qubits : 2 * self.num_qubits]
280
+
281
+ @z.setter
282
+ def z(self, value):
283
+ self.tableau[:, self.num_qubits : 2 * self.num_qubits] = value
284
+
285
+ @property
286
+ def destab(self):
287
+ """The destabilizer array for the symplectic representation."""
288
+ return self.tableau[: self.num_qubits, :]
289
+
290
+ @destab.setter
291
+ def destab(self, value):
292
+ self.tableau[: self.num_qubits, :] = value
293
+
294
+ @property
295
+ def destab_x(self):
296
+ """The destabilizer x array for the symplectic representation."""
297
+ return self.tableau[: self.num_qubits, : self.num_qubits]
298
+
299
+ @destab_x.setter
300
+ def destab_x(self, value):
301
+ self.tableau[: self.num_qubits, : self.num_qubits] = value
302
+
303
+ @property
304
+ def destab_z(self):
305
+ """The destabilizer z array for the symplectic representation."""
306
+ return self.tableau[: self.num_qubits, self.num_qubits : 2 * self.num_qubits]
307
+
308
+ @destab_z.setter
309
+ def destab_z(self, value):
310
+ self.tableau[: self.num_qubits, self.num_qubits : 2 * self.num_qubits] = value
311
+
312
+ @property
313
+ def destab_phase(self):
314
+ """Return phase of destabilizer with boolean representation."""
315
+ return self.tableau[: self.num_qubits, -1]
316
+
317
+ @destab_phase.setter
318
+ def destab_phase(self, value):
319
+ self.tableau[: self.num_qubits, -1] = value
320
+
321
+ @property
322
+ def stab(self):
323
+ """The stabilizer array for the symplectic representation."""
324
+ return self.tableau[self.num_qubits :, :]
325
+
326
+ @stab.setter
327
+ def stab(self, value):
328
+ self.tableau[self.num_qubits :, :] = value
329
+
330
+ @property
331
+ def stab_x(self):
332
+ """The stabilizer x array for the symplectic representation."""
333
+ return self.tableau[self.num_qubits :, : self.num_qubits]
334
+
335
+ @stab_x.setter
336
+ def stab_x(self, value):
337
+ self.tableau[self.num_qubits :, : self.num_qubits] = value
338
+
339
+ @property
340
+ def stab_z(self):
341
+ """The stabilizer array for the symplectic representation."""
342
+ return self.tableau[self.num_qubits :, self.num_qubits : 2 * self.num_qubits]
343
+
344
+ @stab_z.setter
345
+ def stab_z(self, value):
346
+ self.tableau[self.num_qubits :, self.num_qubits : 2 * self.num_qubits] = value
347
+
348
+ @property
349
+ def stab_phase(self):
350
+ """Return phase of stabilizer with boolean representation."""
351
+ return self.tableau[self.num_qubits :, -1]
352
+
353
+ @stab_phase.setter
354
+ def stab_phase(self, value):
355
+ self.tableau[self.num_qubits :, -1] = value
356
+
357
+ # ---------------------------------------------------------------------
358
+ # Utility Operator methods
359
+ # ---------------------------------------------------------------------
360
+
361
+ def is_unitary(self):
362
+ """Return True if the Clifford table is valid."""
363
+ # A valid Clifford is always unitary, so this function is really
364
+ # checking that the underlying Stabilizer table array is a valid
365
+ # Clifford array.
366
+ return Clifford._is_symplectic(self.symplectic_matrix)
367
+
368
+ # ---------------------------------------------------------------------
369
+ # BaseOperator Abstract Methods
370
+ # ---------------------------------------------------------------------
371
+
372
+ def conjugate(self):
373
+ return Clifford._conjugate_transpose(self, "C")
374
+
375
+ def adjoint(self):
376
+ return Clifford._conjugate_transpose(self, "A")
377
+
378
+ def transpose(self):
379
+ return Clifford._conjugate_transpose(self, "T")
380
+
381
+ def tensor(self, other: Clifford) -> Clifford:
382
+ if not isinstance(other, Clifford):
383
+ other = Clifford(other)
384
+ return self._tensor(self, other)
385
+
386
+ def expand(self, other: Clifford) -> Clifford:
387
+ if not isinstance(other, Clifford):
388
+ other = Clifford(other)
389
+ return self._tensor(other, self)
390
+
391
+ @classmethod
392
+ def _tensor(cls, a, b):
393
+ n = a.num_qubits + b.num_qubits
394
+ tableau = np.zeros((2 * n, 2 * n + 1), dtype=bool)
395
+ clifford = cls(tableau, validate=False)
396
+ clifford.destab_x[: b.num_qubits, : b.num_qubits] = b.destab_x
397
+ clifford.destab_x[b.num_qubits :, b.num_qubits :] = a.destab_x
398
+ clifford.destab_z[: b.num_qubits, : b.num_qubits] = b.destab_z
399
+ clifford.destab_z[b.num_qubits :, b.num_qubits :] = a.destab_z
400
+ clifford.stab_x[: b.num_qubits, : b.num_qubits] = b.stab_x
401
+ clifford.stab_x[b.num_qubits :, b.num_qubits :] = a.stab_x
402
+ clifford.stab_z[: b.num_qubits, : b.num_qubits] = b.stab_z
403
+ clifford.stab_z[b.num_qubits :, b.num_qubits :] = a.stab_z
404
+ clifford.phase[: b.num_qubits] = b.destab_phase
405
+ clifford.phase[b.num_qubits : n] = a.destab_phase
406
+ clifford.phase[n : n + b.num_qubits] = b.stab_phase
407
+ clifford.phase[n + b.num_qubits :] = a.stab_phase
408
+ return clifford
409
+
410
+ def compose(
411
+ self,
412
+ other: Clifford | QuantumCircuit | Instruction,
413
+ qargs: list | None = None,
414
+ front: bool = False,
415
+ ) -> Clifford:
416
+ if qargs is None:
417
+ qargs = getattr(other, "qargs", None)
418
+ # If other is a QuantumCircuit we can more efficiently compose
419
+ # using the _append_circuit method to update each gate recursively
420
+ # to the current Clifford, rather than converting to a Clifford first
421
+ # and then doing the composition of tables.
422
+ if not front:
423
+ if isinstance(other, QuantumCircuit):
424
+ return _append_circuit(self.copy(), other, qargs=qargs)
425
+ if isinstance(other, Instruction):
426
+ return _append_operation(self.copy(), other, qargs=qargs)
427
+
428
+ if not isinstance(other, Clifford):
429
+ # Not copying is safe since we're going to drop our only reference to `other` at the end
430
+ # of the function.
431
+ other = Clifford(other, copy=False)
432
+
433
+ # Validate compose dimensions
434
+ self._op_shape.compose(other._op_shape, qargs, front)
435
+
436
+ # Pad other with identities if composing on subsystem
437
+ other = self._pad_with_identity(other, qargs)
438
+
439
+ left, right = (self, other) if front else (other, self)
440
+
441
+ if self.num_qubits == 1:
442
+ return self._compose_1q(left, right)
443
+ return self._compose_general(left, right)
444
+
445
+ @classmethod
446
+ def _compose_general(cls, first, second):
447
+ # Correcting for phase due to Pauli multiplication. Start with factors of -i from XZ = -iY
448
+ # on individual qubits, and then handle multiplication between each qubitwise pair.
449
+ ifacts = np.sum(second.x & second.z, axis=1, dtype=int)
450
+
451
+ x1, z1 = first.x.astype(np.uint8), first.z.astype(np.uint8)
452
+ lookup = cls._compose_lookup()
453
+
454
+ # The loop is over 2*n_qubits entries, and the entire loop is cubic in the number of qubits.
455
+ for k, row2 in enumerate(second.symplectic_matrix):
456
+ x1_select = x1[row2]
457
+ z1_select = z1[row2]
458
+ x1_accum = np.logical_xor.accumulate(x1_select, axis=0).astype(np.uint8)
459
+ z1_accum = np.logical_xor.accumulate(z1_select, axis=0).astype(np.uint8)
460
+ indexer = (x1_select[1:], z1_select[1:], x1_accum[:-1], z1_accum[:-1])
461
+ ifacts[k] += np.sum(lookup[indexer])
462
+ p = np.mod(ifacts, 4) // 2
463
+
464
+ phase = (
465
+ (np.matmul(second.symplectic_matrix, first.phase, dtype=int) + second.phase + p) % 2
466
+ ).astype(bool)
467
+ data = cls._stack_table_phase(
468
+ (np.matmul(second.symplectic_matrix, first.symplectic_matrix, dtype=int) % 2).astype(
469
+ bool
470
+ ),
471
+ phase,
472
+ )
473
+ return Clifford(data, validate=False, copy=False)
474
+
475
+ @classmethod
476
+ def _compose_1q(cls, first, second):
477
+ # 1-qubit composition can be done with a simple lookup table; there are 24 elements in the
478
+ # 1q Clifford group, so 576 possible combinations, which is small enough to look up.
479
+ if cls._COMPOSE_1Q_LOOKUP is None:
480
+ # The valid tables for 1q Cliffords.
481
+ tables_1q = np.array(
482
+ [
483
+ [[False, True], [True, False]],
484
+ [[False, True], [True, True]],
485
+ [[True, False], [False, True]],
486
+ [[True, False], [True, True]],
487
+ [[True, True], [False, True]],
488
+ [[True, True], [True, False]],
489
+ ]
490
+ )
491
+ phases_1q = np.array([[False, False], [False, True], [True, False], [True, True]])
492
+ # Build the lookup table.
493
+ cliffords = [
494
+ cls(cls._stack_table_phase(table, phase), validate=False, copy=False)
495
+ for table, phase in itertools.product(tables_1q, phases_1q)
496
+ ]
497
+ cls._COMPOSE_1Q_LOOKUP = {
498
+ (cls._hash(left), cls._hash(right)): cls._compose_general(left, right)
499
+ for left, right in itertools.product(cliffords, repeat=2)
500
+ }
501
+ return cls._COMPOSE_1Q_LOOKUP[cls._hash(first), cls._hash(second)].copy()
502
+
503
+ @classmethod
504
+ def _compose_lookup(
505
+ cls,
506
+ ):
507
+ if cls._COMPOSE_PHASE_LOOKUP is None:
508
+ # A lookup table for calculating phases. The indices are
509
+ # current_x, current_z, running_x_count, running_z_count
510
+ # where all counts taken modulo 2.
511
+ lookup = np.zeros((2, 2, 2, 2), dtype=int)
512
+ lookup[0, 1, 1, 0] = lookup[1, 0, 1, 1] = lookup[1, 1, 0, 1] = -1
513
+ lookup[0, 1, 1, 1] = lookup[1, 0, 0, 1] = lookup[1, 1, 1, 0] = 1
514
+ lookup.setflags(write=False)
515
+ cls._COMPOSE_PHASE_LOOKUP = lookup
516
+ return cls._COMPOSE_PHASE_LOOKUP
517
+
518
+ # ---------------------------------------------------------------------
519
+ # Representation conversions
520
+ # ---------------------------------------------------------------------
521
+
522
+ def to_dict(self):
523
+ """Return dictionary representation of Clifford object."""
524
+ return {
525
+ "stabilizer": self.to_labels(mode="S"),
526
+ "destabilizer": self.to_labels(mode="D"),
527
+ }
528
+
529
+ @classmethod
530
+ def from_dict(cls, obj):
531
+ """Load a Clifford from a dictionary"""
532
+ labels = obj.get("destabilizer") + obj.get("stabilizer")
533
+ n_paulis = len(labels)
534
+ symp = cls._from_label(labels[0])
535
+ tableau = np.zeros((n_paulis, len(symp)), dtype=bool)
536
+ tableau[0] = symp
537
+ for i in range(1, n_paulis):
538
+ tableau[i] = cls._from_label(labels[i])
539
+ return cls(tableau)
540
+
541
+ def to_matrix(self):
542
+ """Convert operator to Numpy matrix."""
543
+ return self.to_operator().data
544
+
545
+ @classmethod
546
+ def from_matrix(cls, matrix: np.ndarray) -> Clifford:
547
+ """Create a Clifford from a unitary matrix.
548
+
549
+ Note that this function takes exponentially long time w.r.t. the number of qubits.
550
+
551
+ Args:
552
+ matrix (np.array): A unitary matrix representing a Clifford to be converted.
553
+
554
+ Returns:
555
+ Clifford: the Clifford object for the unitary matrix.
556
+
557
+ Raises:
558
+ QiskitError: if the input is not a Clifford matrix.
559
+ """
560
+ tableau = cls._unitary_matrix_to_tableau(matrix)
561
+ if tableau is None:
562
+ raise QiskitError("Non-Clifford matrix is not convertible")
563
+ return cls(tableau)
564
+
565
+ @classmethod
566
+ def from_linear_function(cls, linear_function):
567
+ """Create a Clifford from a Linear Function.
568
+
569
+ If the linear function is represented by a nxn binary invertible matrix A,
570
+ then the corresponding Clifford has symplectic matrix [[A^t, 0], [0, A^{-1}]].
571
+
572
+ Args:
573
+ linear_function (LinearFunction): A linear function to be converted.
574
+
575
+ Returns:
576
+ Clifford: the Clifford object for this linear function.
577
+ """
578
+
579
+ mat = linear_function.linear
580
+ mat_t = np.transpose(mat)
581
+ mat_i = calc_inverse_matrix(mat)
582
+
583
+ dim = len(mat)
584
+ zero = np.zeros((dim, dim), dtype=int)
585
+ symplectic_mat = np.block([[mat_t, zero], [zero, mat_i]])
586
+ phase = np.zeros(2 * dim, dtype=int)
587
+ tableau = cls._stack_table_phase(symplectic_mat, phase)
588
+ return tableau
589
+
590
+ @classmethod
591
+ def from_permutation(cls, permutation_gate):
592
+ """Create a Clifford from a PermutationGate.
593
+
594
+ Args:
595
+ permutation_gate (PermutationGate): A permutation to be converted.
596
+
597
+ Returns:
598
+ Clifford: the Clifford object for this permutation.
599
+ """
600
+
601
+ pat = permutation_gate.pattern
602
+ dim = len(pat)
603
+ symplectic_mat = np.zeros((2 * dim, 2 * dim), dtype=int)
604
+ for i, j in enumerate(pat):
605
+ symplectic_mat[j, i] = True
606
+ symplectic_mat[j + dim, i + dim] = True
607
+ phase = np.zeros(2 * dim, dtype=bool)
608
+ tableau = cls._stack_table_phase(symplectic_mat, phase)
609
+ return tableau
610
+
611
+ def to_operator(self) -> Operator:
612
+ """Convert to an Operator object."""
613
+ return Operator(self.to_instruction())
614
+
615
+ @classmethod
616
+ def from_operator(cls, operator: Operator) -> Clifford:
617
+ """Create a Clifford from a operator.
618
+
619
+ Note that this function takes exponentially long time w.r.t. the number of qubits.
620
+
621
+ Args:
622
+ operator (Operator): An operator representing a Clifford to be converted.
623
+
624
+ Returns:
625
+ Clifford: the Clifford object for the operator.
626
+
627
+ Raises:
628
+ QiskitError: if the input is not a Clifford operator.
629
+ """
630
+ tableau = cls._unitary_matrix_to_tableau(operator.to_matrix())
631
+ if tableau is None:
632
+ raise QiskitError("Non-Clifford operator is not convertible")
633
+ return cls(tableau)
634
+
635
+ def to_circuit(self):
636
+ """Return a QuantumCircuit implementing the Clifford.
637
+
638
+ For N <= 3 qubits this is based on optimal CX cost decomposition
639
+ from reference [1]. For N > 3 qubits this is done using the general
640
+ non-optimal compilation routine from reference [2].
641
+
642
+ Return:
643
+ QuantumCircuit: a circuit implementation of the Clifford.
644
+
645
+ References:
646
+ 1. S. Bravyi, D. Maslov, *Hadamard-free circuits expose the
647
+ structure of the Clifford group*,
648
+ `arXiv:2003.09412 [quant-ph] <https://arxiv.org/abs/2003.09412>`_
649
+
650
+ 2. S. Aaronson, D. Gottesman, *Improved Simulation of Stabilizer Circuits*,
651
+ Phys. Rev. A 70, 052328 (2004).
652
+ `arXiv:quant-ph/0406196 <https://arxiv.org/abs/quant-ph/0406196>`_
653
+ """
654
+ from qiskit.synthesis.clifford import synth_clifford_full
655
+
656
+ return synth_clifford_full(self)
657
+
658
+ def to_instruction(self):
659
+ """Return a Gate instruction implementing the Clifford."""
660
+ return self.to_circuit().to_gate()
661
+
662
+ @staticmethod
663
+ def from_circuit(circuit: QuantumCircuit | Instruction) -> Clifford:
664
+ """Initialize from a QuantumCircuit or Instruction.
665
+
666
+ Args:
667
+ circuit (QuantumCircuit or ~qiskit.circuit.Instruction):
668
+ instruction to initialize.
669
+
670
+ Returns:
671
+ Clifford: the Clifford object for the instruction.
672
+
673
+ Raises:
674
+ QiskitError: if the input instruction is non-Clifford or contains
675
+ classical register instruction.
676
+ """
677
+ if not isinstance(circuit, (QuantumCircuit, Instruction)):
678
+ raise QiskitError("Input must be a QuantumCircuit or Instruction")
679
+
680
+ # Initialize an identity Clifford
681
+ clifford = Clifford(np.eye(2 * circuit.num_qubits), validate=False)
682
+ if isinstance(circuit, QuantumCircuit):
683
+ clifford = _append_circuit(clifford, circuit)
684
+ else:
685
+ clifford = _append_operation(clifford, circuit)
686
+ return clifford
687
+
688
+ @staticmethod
689
+ def from_label(label: str) -> Clifford:
690
+ """Return a tensor product of single-qubit Clifford gates.
691
+
692
+ Args:
693
+ label (string): single-qubit operator string.
694
+
695
+ Returns:
696
+ Clifford: The N-qubit Clifford operator.
697
+
698
+ Raises:
699
+ QiskitError: if the label contains invalid characters.
700
+
701
+ Additional Information:
702
+ The labels correspond to the single-qubit Cliffords are
703
+
704
+ * - Label
705
+ - Stabilizer
706
+ - Destabilizer
707
+ * - ``"I"``
708
+ - +Z
709
+ - +X
710
+ * - ``"X"``
711
+ - -Z
712
+ - +X
713
+ * - ``"Y"``
714
+ - -Z
715
+ - -X
716
+ * - ``"Z"``
717
+ - +Z
718
+ - -X
719
+ * - ``"H"``
720
+ - +X
721
+ - +Z
722
+ * - ``"S"``
723
+ - +Z
724
+ - +Y
725
+ """
726
+ # Check label is valid
727
+ label_gates = {
728
+ "I": IGate(),
729
+ "X": XGate(),
730
+ "Y": YGate(),
731
+ "Z": ZGate(),
732
+ "H": HGate(),
733
+ "S": SGate(),
734
+ }
735
+ if re.match(r"^[IXYZHS\-+]+$", label) is None:
736
+ raise QiskitError("Label contains invalid characters.")
737
+ # Initialize an identity matrix and apply each gate
738
+ num_qubits = len(label)
739
+ op = Clifford(np.eye(2 * num_qubits, dtype=bool))
740
+ for qubit, char in enumerate(reversed(label)):
741
+ op = _append_operation(op, label_gates[char], qargs=[qubit])
742
+ return op
743
+
744
+ def to_labels(self, array: bool = False, mode: Literal["S", "D", "B"] = "B"):
745
+ r"""Convert a Clifford to a list Pauli (de)stabilizer string labels.
746
+
747
+ For large Clifford converting using the ``array=True``
748
+ kwarg will be more efficient since it allocates memory for
749
+ the full Numpy array of labels in advance.
750
+
751
+ .. list-table:: Stabilizer Representations
752
+ :header-rows: 1
753
+
754
+ * - Label
755
+ - Phase
756
+ - Symplectic
757
+ - Matrix
758
+ - Pauli
759
+ * - ``"+I"``
760
+ - 0
761
+ - :math:`[0, 0]`
762
+ - :math:`\begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}`
763
+ - :math:`I`
764
+ * - ``"-I"``
765
+ - 1
766
+ - :math:`[0, 0]`
767
+ - :math:`\begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix}`
768
+ - :math:`-I`
769
+ * - ``"X"``
770
+ - 0
771
+ - :math:`[1, 0]`
772
+ - :math:`\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}`
773
+ - :math:`X`
774
+ * - ``"-X"``
775
+ - 1
776
+ - :math:`[1, 0]`
777
+ - :math:`\begin{bmatrix} 0 & -1 \\ -1 & 0 \end{bmatrix}`
778
+ - :math:`-X`
779
+ * - ``"Y"``
780
+ - 0
781
+ - :math:`[1, 1]`
782
+ - :math:`\begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix}`
783
+ - :math:`iY`
784
+ * - ``"-Y"``
785
+ - 1
786
+ - :math:`[1, 1]`
787
+ - :math:`\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix}`
788
+ - :math:`-iY`
789
+ * - ``"Z"``
790
+ - 0
791
+ - :math:`[0, 1]`
792
+ - :math:`\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}`
793
+ - :math:`Z`
794
+ * - ``"-Z"``
795
+ - 1
796
+ - :math:`[0, 1]`
797
+ - :math:`\begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix}`
798
+ - :math:`-Z`
799
+
800
+ Args:
801
+ array (bool): return a Numpy array if True, otherwise
802
+ return a list (Default: False).
803
+ mode (Literal["S", "D", "B"]): return both stabilizer and destabilizer if "B",
804
+ return only stabilizer if "S" and return only destabilizer if "D".
805
+
806
+ Returns:
807
+ list or array: The rows of the StabilizerTable in label form.
808
+ Raises:
809
+ QiskitError: if stabilizer and destabilizer are both False.
810
+ """
811
+ if mode not in ("S", "B", "D"):
812
+ raise QiskitError("mode must be B, S, or D.")
813
+ size = 2 * self.num_qubits if mode == "B" else self.num_qubits
814
+ offset = self.num_qubits if mode == "S" else 0
815
+ ret = np.zeros(size, dtype=f"<U{1 + self.num_qubits}")
816
+ for i in range(size):
817
+ z = self.tableau[i + offset, self.num_qubits : 2 * self.num_qubits]
818
+ x = self.tableau[i + offset, 0 : self.num_qubits]
819
+ phase = int(self.tableau[i + offset, -1]) * 2
820
+ label = BasePauli._to_label(z, x, phase, group_phase=True)
821
+ if label[0] != "-":
822
+ label = "+" + label
823
+ ret[i] = label
824
+ if array:
825
+ return ret
826
+ return ret.tolist()
827
+
828
+ # ---------------------------------------------------------------------
829
+ # Internal helper functions
830
+ # ---------------------------------------------------------------------
831
+
832
+ def _hash(self):
833
+ """Produce a hashable value that is unique for each different Clifford. This should only be
834
+ used internally when the classes being hashed are under our control, because classes of this
835
+ type are mutable."""
836
+ return np.packbits(self.tableau).tobytes()
837
+
838
+ @staticmethod
839
+ def _is_symplectic(mat):
840
+ """Return True if input is symplectic matrix."""
841
+ # Condition is
842
+ # table.T * [[0, 1], [1, 0]] * table = [[0, 1], [1, 0]]
843
+ # where we are block matrix multiplying using symplectic product
844
+
845
+ dim = len(mat) // 2
846
+ if mat.shape != (2 * dim, 2 * dim):
847
+ return False
848
+
849
+ one = np.eye(dim, dtype=int)
850
+ zero = np.zeros((dim, dim), dtype=int)
851
+ seye = np.block([[zero, one], [one, zero]])
852
+ arr = mat.astype(int)
853
+ return np.array_equal(np.mod(arr.T.dot(seye).dot(arr), 2), seye)
854
+
855
+ @staticmethod
856
+ def _conjugate_transpose(clifford, method):
857
+ """Return the adjoint, conjugate, or transpose of the Clifford.
858
+
859
+ Args:
860
+ clifford (Clifford): a clifford object.
861
+ method (str): what function to apply 'A', 'C', or 'T'.
862
+
863
+ Returns:
864
+ Clifford: the modified clifford.
865
+ """
866
+ ret = clifford.copy()
867
+ if method in ["A", "T"]:
868
+ # Apply inverse
869
+ # Update table
870
+ tmp = ret.destab_x.copy()
871
+ ret.destab_x = ret.stab_z.T
872
+ ret.destab_z = ret.destab_z.T
873
+ ret.stab_x = ret.stab_x.T
874
+ ret.stab_z = tmp.T
875
+ # Update phase
876
+ ret.phase ^= clifford.dot(ret).phase
877
+ if method in ["C", "T"]:
878
+ # Apply conjugate
879
+ ret.phase ^= np.mod(_count_y(ret.x, ret.z), 2).astype(bool)
880
+ return ret
881
+
882
+ def _pad_with_identity(self, clifford, qargs):
883
+ """Pad Clifford with identities on other subsystems."""
884
+ if qargs is None:
885
+ return clifford
886
+
887
+ padded = Clifford(np.eye(2 * self.num_qubits, dtype=bool), validate=False, copy=False)
888
+ inds = list(qargs) + [self.num_qubits + i for i in qargs]
889
+
890
+ # Pad Pauli array
891
+ for i, pos in enumerate(qargs):
892
+ padded.tableau[inds, pos] = clifford.tableau[:, i]
893
+ padded.tableau[inds, self.num_qubits + pos] = clifford.tableau[
894
+ :, clifford.num_qubits + i
895
+ ]
896
+
897
+ # Pad phase
898
+ padded.phase[inds] = clifford.phase
899
+
900
+ return padded
901
+
902
+ @staticmethod
903
+ def _stack_table_phase(table, phase):
904
+ return np.hstack((table, phase.reshape(len(phase), 1)))
905
+
906
+ @staticmethod
907
+ def _from_label(label):
908
+ phase = False
909
+ if label[0] in ("-", "+"):
910
+ phase = label[0] == "-"
911
+ label = label[1:]
912
+ num_qubits = len(label)
913
+ symp = np.zeros(2 * num_qubits + 1, dtype=bool)
914
+ xs = symp[0:num_qubits]
915
+ zs = symp[num_qubits : 2 * num_qubits]
916
+ for i, char in enumerate(label):
917
+ if char not in ["I", "X", "Y", "Z"]:
918
+ raise QiskitError(
919
+ f"Pauli string contains invalid character: {char} not in ['I', 'X', 'Y', 'Z']."
920
+ )
921
+ if char in ("X", "Y"):
922
+ xs[num_qubits - 1 - i] = True
923
+ if char in ("Z", "Y"):
924
+ zs[num_qubits - 1 - i] = True
925
+ symp[-1] = phase
926
+ return symp
927
+
928
+ @staticmethod
929
+ def _pauli_matrix_to_row(mat, num_qubits):
930
+ """Generate a binary vector (a row of tableau representation) from a Pauli matrix.
931
+ Return None if the non-Pauli matrix is supplied."""
932
+ # pylint: disable=too-many-return-statements
933
+ decimals = 6
934
+
935
+ def find_one_index(x):
936
+ indices = np.where(np.round(np.abs(x), decimals=decimals) == 1)
937
+ return indices[0][0] if len(indices[0]) == 1 else None
938
+
939
+ def bitvector(n, num_bits):
940
+ return np.array([int(digit) for digit in format(n, f"0{num_bits}b")], dtype=bool)[::-1]
941
+
942
+ # compute x-bits
943
+ xint = find_one_index(mat[0, :])
944
+ if xint is None:
945
+ return None
946
+ xbits = bitvector(xint, num_qubits)
947
+
948
+ # extract non-zero elements from matrix (each must be 1, -1, 1j or -1j for Pauli matrix)
949
+ entries = np.empty(len(mat), dtype=complex)
950
+ for i, row in enumerate(mat):
951
+ index = find_one_index(row)
952
+ if index is None:
953
+ return None
954
+ expected = xint ^ i
955
+ if index != expected:
956
+ return None
957
+ entries[i] = np.round(mat[i, index], decimals=decimals)
958
+ if entries[i] not in {1, -1, 1j, -1j}:
959
+ return None
960
+
961
+ # compute z-bits
962
+ zbits = np.empty(num_qubits, dtype=bool)
963
+ for k in range(num_qubits):
964
+ sign = np.round(entries[2**k] / entries[0])
965
+ if sign == 1:
966
+ zbits[k] = False
967
+ elif sign == -1:
968
+ zbits[k] = True
969
+ else:
970
+ return None
971
+
972
+ # compute phase
973
+ phase = None
974
+ num_y = sum(xbits & zbits)
975
+ positive_phase = (-1j) ** num_y
976
+ if entries[0] == positive_phase:
977
+ phase = False
978
+ elif entries[0] == -1 * positive_phase:
979
+ phase = True
980
+ if phase is None:
981
+ return None
982
+
983
+ # validate all non-zero elements
984
+ coef = ((-1) ** phase) * positive_phase
985
+ ivec, zvec = np.ones(2), np.array([1, -1])
986
+ expected = coef * functools.reduce(np.kron, [zvec if z else ivec for z in zbits[::-1]])
987
+ if not np.allclose(entries, expected):
988
+ return None
989
+
990
+ return np.hstack([xbits, zbits, phase])
991
+
992
+ @staticmethod
993
+ def _unitary_matrix_to_tableau(matrix):
994
+ # pylint: disable=invalid-name
995
+ num_qubits = int(np.log2(len(matrix)))
996
+
997
+ stab = np.empty((num_qubits, 2 * num_qubits + 1), dtype=bool)
998
+ for i in range(num_qubits):
999
+ label = "I" * (num_qubits - i - 1) + "X" + "I" * i
1000
+ Xi = Operator.from_label(label).to_matrix()
1001
+ target = matrix @ Xi @ np.conj(matrix).T
1002
+ row = Clifford._pauli_matrix_to_row(target, num_qubits)
1003
+ if row is None:
1004
+ return None
1005
+ stab[i] = row
1006
+
1007
+ destab = np.empty((num_qubits, 2 * num_qubits + 1), dtype=bool)
1008
+ for i in range(num_qubits):
1009
+ label = "I" * (num_qubits - i - 1) + "Z" + "I" * i
1010
+ Zi = Operator.from_label(label).to_matrix()
1011
+ target = matrix @ Zi @ np.conj(matrix).T
1012
+ row = Clifford._pauli_matrix_to_row(target, num_qubits)
1013
+ if row is None:
1014
+ return None
1015
+ destab[i] = row
1016
+
1017
+ tableau = np.vstack([stab, destab])
1018
+ return tableau
1019
+
1020
+
1021
+ # Update docstrings for API docs
1022
+ generate_apidocs(Clifford)