qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.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 (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +367 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1313 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +50 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +511 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +171 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +123 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +94 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +263 -0
  54. qiskit/circuit/instruction.py +697 -0
  55. qiskit/circuit/instructionset.py +179 -0
  56. qiskit/circuit/library/__init__.py +668 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +34 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +313 -0
  80. qiskit/circuit/library/blueprintcircuit.py +280 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  87. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  88. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  89. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  90. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  91. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  92. qiskit/circuit/library/fourier_checking.py +158 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +174 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +194 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +169 -0
  111. qiskit/circuit/library/grover_operator.py +579 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +161 -0
  114. qiskit/circuit/library/iqp.py +175 -0
  115. qiskit/circuit/library/n_local/__init__.py +45 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +277 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
  119. qiskit/circuit/library/n_local/n_local.py +1472 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
  123. qiskit/circuit/library/n_local/two_local.py +289 -0
  124. qiskit/circuit/library/overlap.py +182 -0
  125. qiskit/circuit/library/pauli_evolution.py +186 -0
  126. qiskit/circuit/library/phase_estimation.py +175 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +167 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +142 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +78 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +258 -0
  135. qiskit/circuit/library/standard_gates/i.py +76 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +441 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +303 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +298 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +319 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +315 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +403 -0
  152. qiskit/circuit/library/standard_gates/u1.py +501 -0
  153. qiskit/circuit/library/standard_gates/u2.py +149 -0
  154. qiskit/circuit/library/standard_gates/u3.py +436 -0
  155. qiskit/circuit/library/standard_gates/x.py +1529 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +262 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +178 -0
  238. qiskit/circuit/parameterexpression.py +692 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6829 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +606 -0
  249. qiskit/circuit/store.py +97 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/circuit/twirling.py +145 -0
  253. qiskit/compiler/__init__.py +33 -0
  254. qiskit/compiler/assembler.py +681 -0
  255. qiskit/compiler/scheduler.py +109 -0
  256. qiskit/compiler/sequencer.py +71 -0
  257. qiskit/compiler/transpiler.py +533 -0
  258. qiskit/converters/__init__.py +74 -0
  259. qiskit/converters/circuit_to_dag.py +78 -0
  260. qiskit/converters/circuit_to_dagdependency.py +51 -0
  261. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  262. qiskit/converters/circuit_to_gate.py +107 -0
  263. qiskit/converters/circuit_to_instruction.py +155 -0
  264. qiskit/converters/dag_to_circuit.py +79 -0
  265. qiskit/converters/dag_to_dagdependency.py +55 -0
  266. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  267. qiskit/converters/dagdependency_to_circuit.py +46 -0
  268. qiskit/converters/dagdependency_to_dag.py +54 -0
  269. qiskit/dagcircuit/__init__.py +44 -0
  270. qiskit/dagcircuit/collect_blocks.py +391 -0
  271. qiskit/dagcircuit/dagcircuit.py +24 -0
  272. qiskit/dagcircuit/dagdependency.py +646 -0
  273. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  274. qiskit/dagcircuit/dagdepnode.py +160 -0
  275. qiskit/dagcircuit/dagnode.py +176 -0
  276. qiskit/dagcircuit/exceptions.py +42 -0
  277. qiskit/exceptions.py +153 -0
  278. qiskit/passmanager/__init__.py +240 -0
  279. qiskit/passmanager/base_tasks.py +230 -0
  280. qiskit/passmanager/compilation_status.py +74 -0
  281. qiskit/passmanager/exceptions.py +19 -0
  282. qiskit/passmanager/flow_controllers.py +116 -0
  283. qiskit/passmanager/passmanager.py +333 -0
  284. qiskit/primitives/__init__.py +481 -0
  285. qiskit/primitives/backend_estimator.py +486 -0
  286. qiskit/primitives/backend_estimator_v2.py +434 -0
  287. qiskit/primitives/backend_sampler.py +222 -0
  288. qiskit/primitives/backend_sampler_v2.py +339 -0
  289. qiskit/primitives/base/__init__.py +20 -0
  290. qiskit/primitives/base/base_estimator.py +252 -0
  291. qiskit/primitives/base/base_primitive.py +45 -0
  292. qiskit/primitives/base/base_primitive_job.py +78 -0
  293. qiskit/primitives/base/base_result.py +65 -0
  294. qiskit/primitives/base/base_sampler.py +204 -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/containers/__init__.py +26 -0
  299. qiskit/primitives/containers/bindings_array.py +389 -0
  300. qiskit/primitives/containers/bit_array.py +741 -0
  301. qiskit/primitives/containers/data_bin.py +173 -0
  302. qiskit/primitives/containers/estimator_pub.py +222 -0
  303. qiskit/primitives/containers/object_array.py +94 -0
  304. qiskit/primitives/containers/observables_array.py +279 -0
  305. qiskit/primitives/containers/primitive_result.py +53 -0
  306. qiskit/primitives/containers/pub_result.py +51 -0
  307. qiskit/primitives/containers/sampler_pub.py +193 -0
  308. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  309. qiskit/primitives/containers/shape.py +129 -0
  310. qiskit/primitives/estimator.py +172 -0
  311. qiskit/primitives/primitive_job.py +81 -0
  312. qiskit/primitives/sampler.py +162 -0
  313. qiskit/primitives/statevector_estimator.py +174 -0
  314. qiskit/primitives/statevector_sampler.py +292 -0
  315. qiskit/primitives/utils.py +247 -0
  316. qiskit/providers/__init__.py +803 -0
  317. qiskit/providers/backend.py +667 -0
  318. qiskit/providers/backend_compat.py +472 -0
  319. qiskit/providers/basic_provider/__init__.py +45 -0
  320. qiskit/providers/basic_provider/basic_provider.py +101 -0
  321. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  322. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  323. qiskit/providers/basic_provider/basic_simulator.py +821 -0
  324. qiskit/providers/basic_provider/exceptions.py +30 -0
  325. qiskit/providers/exceptions.py +45 -0
  326. qiskit/providers/fake_provider/__init__.py +105 -0
  327. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  351. qiskit/providers/fake_provider/fake_1q.py +91 -0
  352. qiskit/providers/fake_provider/fake_backend.py +165 -0
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  357. qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
  358. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  359. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  360. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  361. qiskit/providers/job.py +147 -0
  362. qiskit/providers/jobstatus.py +30 -0
  363. qiskit/providers/models/__init__.py +89 -0
  364. qiskit/providers/models/backendconfiguration.py +1040 -0
  365. qiskit/providers/models/backendproperties.py +517 -0
  366. qiskit/providers/models/backendstatus.py +94 -0
  367. qiskit/providers/models/jobstatus.py +66 -0
  368. qiskit/providers/models/pulsedefaults.py +305 -0
  369. qiskit/providers/options.py +273 -0
  370. qiskit/providers/provider.py +95 -0
  371. qiskit/providers/providerutils.py +110 -0
  372. qiskit/pulse/__init__.py +158 -0
  373. qiskit/pulse/builder.py +2254 -0
  374. qiskit/pulse/calibration_entries.py +381 -0
  375. qiskit/pulse/channels.py +227 -0
  376. qiskit/pulse/configuration.py +245 -0
  377. qiskit/pulse/exceptions.py +45 -0
  378. qiskit/pulse/filters.py +309 -0
  379. qiskit/pulse/instruction_schedule_map.py +424 -0
  380. qiskit/pulse/instructions/__init__.py +67 -0
  381. qiskit/pulse/instructions/acquire.py +150 -0
  382. qiskit/pulse/instructions/delay.py +71 -0
  383. qiskit/pulse/instructions/directives.py +154 -0
  384. qiskit/pulse/instructions/frequency.py +135 -0
  385. qiskit/pulse/instructions/instruction.py +270 -0
  386. qiskit/pulse/instructions/phase.py +152 -0
  387. qiskit/pulse/instructions/play.py +99 -0
  388. qiskit/pulse/instructions/reference.py +100 -0
  389. qiskit/pulse/instructions/snapshot.py +82 -0
  390. qiskit/pulse/library/__init__.py +97 -0
  391. qiskit/pulse/library/continuous.py +430 -0
  392. qiskit/pulse/library/pulse.py +148 -0
  393. qiskit/pulse/library/samplers/__init__.py +15 -0
  394. qiskit/pulse/library/samplers/decorators.py +295 -0
  395. qiskit/pulse/library/samplers/strategies.py +71 -0
  396. qiskit/pulse/library/symbolic_pulses.py +1988 -0
  397. qiskit/pulse/library/waveform.py +136 -0
  398. qiskit/pulse/macros.py +262 -0
  399. qiskit/pulse/parameter_manager.py +445 -0
  400. qiskit/pulse/parser.py +314 -0
  401. qiskit/pulse/reference_manager.py +58 -0
  402. qiskit/pulse/schedule.py +1854 -0
  403. qiskit/pulse/transforms/__init__.py +106 -0
  404. qiskit/pulse/transforms/alignments.py +406 -0
  405. qiskit/pulse/transforms/base_transforms.py +71 -0
  406. qiskit/pulse/transforms/canonicalization.py +498 -0
  407. qiskit/pulse/transforms/dag.py +122 -0
  408. qiskit/pulse/utils.py +149 -0
  409. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  410. qiskit/qasm/libs/qelib1.inc +266 -0
  411. qiskit/qasm/libs/stdgates.inc +82 -0
  412. qiskit/qasm2/__init__.py +654 -0
  413. qiskit/qasm2/exceptions.py +27 -0
  414. qiskit/qasm2/export.py +372 -0
  415. qiskit/qasm2/parse.py +452 -0
  416. qiskit/qasm3/__init__.py +367 -0
  417. qiskit/qasm3/ast.py +738 -0
  418. qiskit/qasm3/exceptions.py +27 -0
  419. qiskit/qasm3/experimental.py +70 -0
  420. qiskit/qasm3/exporter.py +1299 -0
  421. qiskit/qasm3/printer.py +577 -0
  422. qiskit/qobj/__init__.py +75 -0
  423. qiskit/qobj/common.py +81 -0
  424. qiskit/qobj/converters/__init__.py +18 -0
  425. qiskit/qobj/converters/lo_config.py +177 -0
  426. qiskit/qobj/converters/pulse_instruction.py +897 -0
  427. qiskit/qobj/pulse_qobj.py +709 -0
  428. qiskit/qobj/qasm_qobj.py +708 -0
  429. qiskit/qobj/utils.py +46 -0
  430. qiskit/qpy/__init__.py +1822 -0
  431. qiskit/qpy/binary_io/__init__.py +36 -0
  432. qiskit/qpy/binary_io/circuits.py +1475 -0
  433. qiskit/qpy/binary_io/schedules.py +635 -0
  434. qiskit/qpy/binary_io/value.py +1025 -0
  435. qiskit/qpy/common.py +350 -0
  436. qiskit/qpy/exceptions.py +53 -0
  437. qiskit/qpy/formats.py +401 -0
  438. qiskit/qpy/interface.py +377 -0
  439. qiskit/qpy/type_keys.py +572 -0
  440. qiskit/quantum_info/__init__.py +162 -0
  441. qiskit/quantum_info/analysis/__init__.py +17 -0
  442. qiskit/quantum_info/analysis/average.py +47 -0
  443. qiskit/quantum_info/analysis/distance.py +102 -0
  444. qiskit/quantum_info/analysis/make_observable.py +44 -0
  445. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  446. qiskit/quantum_info/operators/__init__.py +28 -0
  447. qiskit/quantum_info/operators/base_operator.py +145 -0
  448. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  449. qiskit/quantum_info/operators/channel/chi.py +191 -0
  450. qiskit/quantum_info/operators/channel/choi.py +218 -0
  451. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  452. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  453. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  454. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  455. qiskit/quantum_info/operators/channel/superop.py +377 -0
  456. qiskit/quantum_info/operators/channel/transformations.py +475 -0
  457. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  458. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  460. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  461. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  462. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  463. qiskit/quantum_info/operators/linear_op.py +25 -0
  464. qiskit/quantum_info/operators/measures.py +418 -0
  465. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  466. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  467. qiskit/quantum_info/operators/mixins/group.py +171 -0
  468. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  469. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  470. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  471. qiskit/quantum_info/operators/op_shape.py +525 -0
  472. qiskit/quantum_info/operators/operator.py +865 -0
  473. qiskit/quantum_info/operators/operator_utils.py +76 -0
  474. qiskit/quantum_info/operators/predicates.py +183 -0
  475. qiskit/quantum_info/operators/random.py +154 -0
  476. qiskit/quantum_info/operators/scalar_op.py +254 -0
  477. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  478. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  479. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  480. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  481. qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  483. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  484. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  485. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
  486. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  487. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  489. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  490. qiskit/quantum_info/quaternion.py +156 -0
  491. qiskit/quantum_info/random.py +26 -0
  492. qiskit/quantum_info/states/__init__.py +28 -0
  493. qiskit/quantum_info/states/densitymatrix.py +845 -0
  494. qiskit/quantum_info/states/measures.py +288 -0
  495. qiskit/quantum_info/states/quantum_state.py +503 -0
  496. qiskit/quantum_info/states/random.py +157 -0
  497. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  498. qiskit/quantum_info/states/statevector.py +958 -0
  499. qiskit/quantum_info/states/utils.py +247 -0
  500. qiskit/result/__init__.py +73 -0
  501. qiskit/result/counts.py +189 -0
  502. qiskit/result/distributions/__init__.py +17 -0
  503. qiskit/result/distributions/probability.py +100 -0
  504. qiskit/result/distributions/quasi.py +154 -0
  505. qiskit/result/exceptions.py +40 -0
  506. qiskit/result/mitigation/__init__.py +13 -0
  507. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  508. qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
  509. qiskit/result/mitigation/local_readout_mitigator.py +328 -0
  510. qiskit/result/mitigation/utils.py +217 -0
  511. qiskit/result/models.py +234 -0
  512. qiskit/result/postprocess.py +239 -0
  513. qiskit/result/result.py +392 -0
  514. qiskit/result/sampled_expval.py +75 -0
  515. qiskit/result/utils.py +295 -0
  516. qiskit/scheduler/__init__.py +40 -0
  517. qiskit/scheduler/config.py +37 -0
  518. qiskit/scheduler/lowering.py +187 -0
  519. qiskit/scheduler/methods/__init__.py +15 -0
  520. qiskit/scheduler/methods/basic.py +140 -0
  521. qiskit/scheduler/schedule_circuit.py +69 -0
  522. qiskit/scheduler/sequence.py +104 -0
  523. qiskit/synthesis/__init__.py +220 -0
  524. qiskit/synthesis/arithmetic/__init__.py +16 -0
  525. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  526. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  527. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  528. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  529. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  530. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  531. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  532. qiskit/synthesis/clifford/__init__.py +19 -0
  533. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  534. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  535. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  536. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  537. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  538. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  539. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  540. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  541. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  542. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  543. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  544. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  545. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  546. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  547. qiskit/synthesis/evolution/__init__.py +21 -0
  548. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  549. qiskit/synthesis/evolution/lie_trotter.py +117 -0
  550. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  551. qiskit/synthesis/evolution/pauli_network.py +80 -0
  552. qiskit/synthesis/evolution/product_formula.py +311 -0
  553. qiskit/synthesis/evolution/qdrift.py +138 -0
  554. qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
  555. qiskit/synthesis/linear/__init__.py +26 -0
  556. qiskit/synthesis/linear/cnot_synth.py +69 -0
  557. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  558. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  559. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  560. qiskit/synthesis/linear_phase/__init__.py +17 -0
  561. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  562. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  563. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  564. qiskit/synthesis/multi_controlled/__init__.py +24 -0
  565. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  566. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  567. qiskit/synthesis/one_qubit/__init__.py +15 -0
  568. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  569. qiskit/synthesis/permutation/__init__.py +18 -0
  570. qiskit/synthesis/permutation/permutation_full.py +78 -0
  571. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  572. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  573. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  574. qiskit/synthesis/qft/__init__.py +16 -0
  575. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  576. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  577. qiskit/synthesis/stabilizer/__init__.py +16 -0
  578. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  579. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  580. qiskit/synthesis/two_qubit/__init__.py +19 -0
  581. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  582. qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
  583. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  584. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  585. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  586. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  587. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  588. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  589. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  590. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  591. qiskit/synthesis/unitary/__init__.py +13 -0
  592. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  593. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  594. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  595. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  596. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  597. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  598. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  599. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  600. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  601. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  602. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  603. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  604. qiskit/synthesis/unitary/qsd.py +288 -0
  605. qiskit/transpiler/__init__.py +1290 -0
  606. qiskit/transpiler/basepasses.py +221 -0
  607. qiskit/transpiler/coupling.py +500 -0
  608. qiskit/transpiler/exceptions.py +59 -0
  609. qiskit/transpiler/instruction_durations.py +281 -0
  610. qiskit/transpiler/layout.py +737 -0
  611. qiskit/transpiler/passes/__init__.py +312 -0
  612. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  613. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  614. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  615. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  616. qiskit/transpiler/passes/analysis/depth.py +33 -0
  617. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  618. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  619. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  620. qiskit/transpiler/passes/analysis/size.py +36 -0
  621. qiskit/transpiler/passes/analysis/width.py +27 -0
  622. qiskit/transpiler/passes/basis/__init__.py +19 -0
  623. qiskit/transpiler/passes/basis/basis_translator.py +137 -0
  624. qiskit/transpiler/passes/basis/decompose.py +131 -0
  625. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  626. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  627. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  628. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  629. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  630. qiskit/transpiler/passes/calibration/builders.py +20 -0
  631. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  632. qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
  633. qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
  634. qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
  635. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  636. qiskit/transpiler/passes/layout/__init__.py +26 -0
  637. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  638. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  639. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  640. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  641. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  642. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  643. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  644. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  645. qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
  646. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  647. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  648. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  649. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  650. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  651. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  652. qiskit/transpiler/passes/optimization/__init__.py +43 -0
  653. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  654. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  655. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  656. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  657. qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
  658. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  659. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  660. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  661. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  662. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  663. qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
  664. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  665. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
  666. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  667. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  668. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  669. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  670. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  671. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
  672. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  673. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  674. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  675. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  676. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  677. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  678. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  679. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  680. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  681. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  682. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  683. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  684. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  685. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  686. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  687. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  688. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  689. qiskit/transpiler/passes/routing/__init__.py +22 -0
  690. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  691. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  692. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  693. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  694. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  695. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  696. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  697. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  698. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  699. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  700. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  701. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  702. qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
  703. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  704. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  705. qiskit/transpiler/passes/routing/utils.py +35 -0
  706. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  707. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  708. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  709. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  710. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  711. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
  712. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  713. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  714. qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
  715. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
  716. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  717. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  718. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
  719. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
  720. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  721. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  722. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  723. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
  724. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  725. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
  726. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  727. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  728. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
  729. qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
  730. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  731. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  732. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  733. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
  734. qiskit/transpiler/passes/utils/__init__.py +33 -0
  735. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  736. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  737. qiskit/transpiler/passes/utils/check_map.py +78 -0
  738. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  739. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  740. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
  741. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  742. qiskit/transpiler/passes/utils/error.py +69 -0
  743. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  744. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  745. qiskit/transpiler/passes/utils/gate_direction.py +86 -0
  746. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  747. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  748. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  749. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  750. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  751. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  752. qiskit/transpiler/passmanager.py +490 -0
  753. qiskit/transpiler/passmanager_config.py +216 -0
  754. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  755. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
  756. qiskit/transpiler/preset_passmanagers/common.py +649 -0
  757. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
  758. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  759. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  760. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  761. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  762. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  763. qiskit/transpiler/target.py +1319 -0
  764. qiskit/transpiler/timing_constraints.py +59 -0
  765. qiskit/user_config.py +262 -0
  766. qiskit/utils/__init__.py +89 -0
  767. qiskit/utils/classtools.py +146 -0
  768. qiskit/utils/deprecate_pulse.py +119 -0
  769. qiskit/utils/deprecation.py +490 -0
  770. qiskit/utils/lazy_tester.py +363 -0
  771. qiskit/utils/multiprocessing.py +56 -0
  772. qiskit/utils/optionals.py +347 -0
  773. qiskit/utils/parallel.py +191 -0
  774. qiskit/utils/units.py +143 -0
  775. qiskit/version.py +84 -0
  776. qiskit/visualization/__init__.py +288 -0
  777. qiskit/visualization/array.py +204 -0
  778. qiskit/visualization/bloch.py +778 -0
  779. qiskit/visualization/circuit/__init__.py +15 -0
  780. qiskit/visualization/circuit/_utils.py +675 -0
  781. qiskit/visualization/circuit/circuit_visualization.py +727 -0
  782. qiskit/visualization/circuit/latex.py +661 -0
  783. qiskit/visualization/circuit/matplotlib.py +2029 -0
  784. qiskit/visualization/circuit/qcstyle.py +278 -0
  785. qiskit/visualization/circuit/styles/__init__.py +13 -0
  786. qiskit/visualization/circuit/styles/bw.json +202 -0
  787. qiskit/visualization/circuit/styles/clifford.json +202 -0
  788. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  789. qiskit/visualization/circuit/styles/iqp.json +214 -0
  790. qiskit/visualization/circuit/styles/textbook.json +202 -0
  791. qiskit/visualization/circuit/text.py +1844 -0
  792. qiskit/visualization/circuit_visualization.py +19 -0
  793. qiskit/visualization/counts_visualization.py +481 -0
  794. qiskit/visualization/dag_visualization.py +316 -0
  795. qiskit/visualization/exceptions.py +21 -0
  796. qiskit/visualization/gate_map.py +1485 -0
  797. qiskit/visualization/library.py +37 -0
  798. qiskit/visualization/pass_manager_visualization.py +308 -0
  799. qiskit/visualization/pulse_v2/__init__.py +21 -0
  800. qiskit/visualization/pulse_v2/core.py +901 -0
  801. qiskit/visualization/pulse_v2/device_info.py +173 -0
  802. qiskit/visualization/pulse_v2/drawings.py +253 -0
  803. qiskit/visualization/pulse_v2/events.py +254 -0
  804. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  805. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  806. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  807. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  808. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  809. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  810. qiskit/visualization/pulse_v2/interface.py +458 -0
  811. qiskit/visualization/pulse_v2/layouts.py +387 -0
  812. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  813. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  814. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  815. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  816. qiskit/visualization/pulse_v2/types.py +242 -0
  817. qiskit/visualization/state_visualization.py +1518 -0
  818. qiskit/visualization/timeline/__init__.py +21 -0
  819. qiskit/visualization/timeline/core.py +480 -0
  820. qiskit/visualization/timeline/drawings.py +260 -0
  821. qiskit/visualization/timeline/generators.py +506 -0
  822. qiskit/visualization/timeline/interface.py +436 -0
  823. qiskit/visualization/timeline/layouts.py +115 -0
  824. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  825. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  826. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  827. qiskit/visualization/timeline/stylesheet.py +301 -0
  828. qiskit/visualization/timeline/types.py +148 -0
  829. qiskit/visualization/transition_visualization.py +369 -0
  830. qiskit/visualization/utils.py +49 -0
  831. qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
  832. qiskit-1.3.0.dist-info/METADATA +222 -0
  833. qiskit-1.3.0.dist-info/RECORD +836 -0
  834. qiskit-1.3.0.dist-info/WHEEL +5 -0
  835. qiskit-1.3.0.dist-info/entry_points.txt +76 -0
  836. qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,821 @@
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
+ """Contains a (slow) Python simulator.
14
+
15
+ It simulates a quantum circuit (an experiment) that has been compiled
16
+ to run on the simulator. It is exponential in the number of qubits.
17
+
18
+ The simulator is run using
19
+
20
+ .. code-block:: python
21
+
22
+ BasicSimulator().run(run_input)
23
+
24
+ Where the input is a :class:`.QuantumCircuit` object and the output is a
25
+ :class:`.BasicProviderJob` object,
26
+ which can later be queried for the Result object. The result will contain a 'memory' data
27
+ field, which is a result of measurements for each shot.
28
+ """
29
+
30
+ from __future__ import annotations
31
+
32
+ import math
33
+ import uuid
34
+ import time
35
+ import logging
36
+ import warnings
37
+
38
+ from collections import Counter
39
+ import numpy as np
40
+
41
+ from qiskit.circuit import QuantumCircuit
42
+ from qiskit.circuit.library import UnitaryGate
43
+ from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping, GlobalPhaseGate
44
+ from qiskit.providers import Provider
45
+ from qiskit.providers.backend import BackendV2
46
+ from qiskit.providers.models.backendconfiguration import BackendConfiguration
47
+ from qiskit.providers.options import Options
48
+ from qiskit.qobj import QasmQobj, QasmQobjConfig, QasmQobjExperiment
49
+ from qiskit.result import Result
50
+ from qiskit.transpiler import Target
51
+ from qiskit.utils.deprecation import deprecate_func
52
+
53
+ from .basic_provider_job import BasicProviderJob
54
+ from .basic_provider_tools import single_gate_matrix
55
+ from .basic_provider_tools import (
56
+ SINGLE_QUBIT_GATES,
57
+ TWO_QUBIT_GATES,
58
+ TWO_QUBIT_GATES_WITH_PARAMETERS,
59
+ THREE_QUBIT_GATES,
60
+ )
61
+ from .basic_provider_tools import einsum_vecmul_index
62
+ from .exceptions import BasicProviderError
63
+
64
+ logger = logging.getLogger(__name__)
65
+
66
+
67
+ class BasicSimulator(BackendV2):
68
+ """Python implementation of a basic (non-efficient) quantum simulator."""
69
+
70
+ # Formerly calculated as `int(log2(local_hardware_info()["memory"]*(1024**3)/16))`.
71
+ # After the removal of `local_hardware_info()`, it's hardcoded to 24 qubits,
72
+ # which matches the ~268 MB of required memory.
73
+ MAX_QUBITS_MEMORY = 24
74
+
75
+ def __init__(
76
+ self,
77
+ provider: Provider | None = None,
78
+ target: Target | None = None,
79
+ **fields,
80
+ ) -> None:
81
+ """
82
+ Args:
83
+ provider: An optional backwards reference to the
84
+ :class:`~qiskit.providers.Provider` object that the backend
85
+ is from.
86
+ target: An optional target to configure the simulator.
87
+ fields: kwargs for the values to use to override the default
88
+ options.
89
+
90
+ Raises:
91
+ AttributeError: If a field is specified that's outside the backend's
92
+ options.
93
+ """
94
+
95
+ super().__init__(
96
+ provider=provider,
97
+ name="basic_simulator",
98
+ description="A python simulator for quantum experiments",
99
+ backend_version="0.1",
100
+ **fields,
101
+ )
102
+
103
+ self._target = target
104
+ self._configuration = None
105
+
106
+ # Internal simulator variables
107
+ self._local_random = None
108
+ self._classical_memory = 0
109
+ self._classical_register = 0
110
+ self._statevector = 0
111
+ self._number_of_cmembits = 0
112
+ self._number_of_qubits = 0
113
+ self._shots = 0
114
+ self._memory = False
115
+ self._initial_statevector = self.options.get("initial_statevector")
116
+ self._chop_threshold = self.options.get("chop_threashold")
117
+ self._qobj_config = None
118
+ self._sample_measure = False
119
+
120
+ @property
121
+ def max_circuits(self) -> None:
122
+ return None
123
+
124
+ @property
125
+ def target(self) -> Target:
126
+ if not self._target:
127
+ self._target = self._build_basic_target()
128
+ return self._target
129
+
130
+ def _build_basic_target(self) -> Target:
131
+ """Helper method that returns a minimal target with a basis gate set but
132
+ no coupling map, instruction properties or calibrations.
133
+
134
+ Returns:
135
+ The configured target.
136
+ """
137
+ # Set num_qubits to None to signal the transpiler not to
138
+ # resize the circuit to fit a specific (potentially too large)
139
+ # number of qubits. The number of qubits in the circuits given to the
140
+ # `run` method will determine the size of the simulated statevector.
141
+ target = Target(
142
+ description="Basic Target",
143
+ num_qubits=None,
144
+ )
145
+ basis_gates = [
146
+ "ccx",
147
+ "ccz",
148
+ "ch",
149
+ "cp",
150
+ "crx",
151
+ "cry",
152
+ "crz",
153
+ "cs",
154
+ "csdg",
155
+ "cswap",
156
+ "csx",
157
+ "cu",
158
+ "cu1",
159
+ "cu3",
160
+ "cx",
161
+ "cy",
162
+ "cz",
163
+ "dcx",
164
+ "delay",
165
+ "ecr",
166
+ "global_phase",
167
+ "h",
168
+ "id",
169
+ "iswap",
170
+ "measure",
171
+ "p",
172
+ "r",
173
+ "rccx",
174
+ "reset",
175
+ "rx",
176
+ "rxx",
177
+ "ry",
178
+ "ryy",
179
+ "rz",
180
+ "rzx",
181
+ "rzz",
182
+ "s",
183
+ "sdg",
184
+ "swap",
185
+ "sx",
186
+ "sxdg",
187
+ "t",
188
+ "tdg",
189
+ "u",
190
+ "u1",
191
+ "u2",
192
+ "u3",
193
+ "unitary",
194
+ "x",
195
+ "xx_minus_yy",
196
+ "xx_plus_yy",
197
+ "y",
198
+ "z",
199
+ ]
200
+ inst_mapping = get_standard_gate_name_mapping()
201
+ for name in basis_gates:
202
+ if name in inst_mapping:
203
+ instruction = inst_mapping[name]
204
+ target.add_instruction(instruction, properties=None, name=name)
205
+ elif name == "unitary":
206
+ # This is a placeholder for a UnitaryGate instance,
207
+ # to signal the transpiler not to decompose unitaries
208
+ # in the circuit.
209
+ target.add_instruction(UnitaryGate, name="unitary")
210
+ else:
211
+ raise BasicProviderError(
212
+ f"Gate is not a valid basis gate for this simulator: {name}"
213
+ )
214
+ return target
215
+
216
+ @deprecate_func(
217
+ since="1.3.0",
218
+ removal_timeline="in Qiskit 2.0.0",
219
+ additional_msg="The `BackendConfiguration` class is part of the deprecated `BackendV1` "
220
+ "workflow, and no longer necessary for `BackendV2`. The individual configuration elements "
221
+ "can be retrieved directly from the backend or from the contained `Target` instance "
222
+ "(`backend.target)`).",
223
+ )
224
+ def configuration(self) -> BackendConfiguration:
225
+ """Return the simulator backend configuration.
226
+
227
+ Returns:
228
+ The configuration for the backend.
229
+ """
230
+ # Note: this is a custom attribute of the BasicSimulator class and
231
+ # not part of the BackendV2 interface. It has only been added for
232
+ # compatibility with the `assemble` function (currently used in `run`),
233
+ # which still relies on legacy BackendV1 attributes. Once the internal
234
+ # use of `assemble` is resolved, this attribute will no longer be
235
+ # necessary.
236
+
237
+ if self._configuration:
238
+ return self._configuration
239
+
240
+ gates = [
241
+ {
242
+ "name": name,
243
+ "parameters": self.target.operation_from_name(name).params,
244
+ }
245
+ for name in self.target.operation_names
246
+ ]
247
+
248
+ with warnings.catch_warnings():
249
+ # TODO Provider models are deprecated
250
+ # https://github.com/Qiskit/qiskit/issues/12843
251
+ warnings.filterwarnings(
252
+ "ignore",
253
+ category=DeprecationWarning,
254
+ message=r".+qiskit\.providers\.models\.backendconfiguration\..+",
255
+ )
256
+ self._configuration = BackendConfiguration(
257
+ backend_name=self.name,
258
+ backend_version=self.backend_version,
259
+ n_qubits=self.num_qubits,
260
+ basis_gates=list(self.target.operation_names),
261
+ gates=gates,
262
+ local=True,
263
+ simulator=True,
264
+ conditional=True,
265
+ open_pulse=False,
266
+ memory=True,
267
+ # This max_shots is used by the assembler, setting it to 0
268
+ # to maintain the behavior from the previous implementation.
269
+ # Not related to the actual shots set in the backend options
270
+ max_shots=0,
271
+ coupling_map=None,
272
+ description="A python simulator for quantum experiments",
273
+ )
274
+ return self._configuration
275
+
276
+ @classmethod
277
+ def _default_options(cls) -> Options:
278
+ return Options(
279
+ shots=1024,
280
+ memory=False,
281
+ initial_statevector=None,
282
+ chop_threshold=1e-15,
283
+ allow_sample_measuring=True,
284
+ seed_simulator=None,
285
+ parameter_binds=None,
286
+ )
287
+
288
+ def _add_unitary(self, gate: np.ndarray, qubits: list[int]) -> None:
289
+ """Apply an N-qubit unitary matrix.
290
+
291
+ Args:
292
+ gate (matrix_like): an N-qubit unitary matrix
293
+ qubits (list): the list of N-qubits.
294
+ """
295
+ # Get the number of qubits
296
+ num_qubits = len(qubits)
297
+ # Compute einsum index string for 1-qubit matrix multiplication
298
+ indexes = einsum_vecmul_index(qubits, self._number_of_qubits)
299
+ # Convert to complex rank-2N tensor
300
+ gate_tensor = np.reshape(np.array(gate, dtype=complex), num_qubits * [2, 2])
301
+ # Apply matrix multiplication
302
+ self._statevector = np.einsum(
303
+ indexes, gate_tensor, self._statevector, dtype=complex, casting="no"
304
+ )
305
+
306
+ def _get_measure_outcome(self, qubit: int) -> tuple[str, int]:
307
+ """Simulate the outcome of measurement of a qubit.
308
+
309
+ Args:
310
+ qubit: the qubit to measure
311
+
312
+ Return:
313
+ pair (outcome, probability) where outcome is '0' or '1' and
314
+ probability is the probability of the returned outcome.
315
+ """
316
+ # Axis for numpy.sum to compute probabilities
317
+ axis = list(range(self._number_of_qubits))
318
+ axis.remove(self._number_of_qubits - 1 - qubit)
319
+ probabilities = np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis))
320
+ # Compute einsum index string for 1-qubit matrix multiplication
321
+ random_number = self._local_random.random()
322
+ if random_number < probabilities[0]:
323
+ return "0", probabilities[0]
324
+ # Else outcome was '1'
325
+ return "1", probabilities[1]
326
+
327
+ def _add_sample_measure(
328
+ self, measure_params: list[list[int, int]], num_samples: int
329
+ ) -> list[hex]:
330
+ """Generate memory samples from current statevector.
331
+
332
+ Args:
333
+ measure_params: List of (qubit, cmembit) values for
334
+ measure instructions to sample.
335
+ num_samples: The number of memory samples to generate.
336
+
337
+ Returns:
338
+ A list of memory values in hex format.
339
+ """
340
+ # Get unique qubits that are actually measured and sort in
341
+ # ascending order
342
+ measured_qubits = sorted({qubit for qubit, cmembit in measure_params})
343
+ num_measured = len(measured_qubits)
344
+ # We use the axis kwarg for numpy.sum to compute probabilities
345
+ # this sums over all non-measured qubits to return a vector
346
+ # of measure probabilities for the measured qubits
347
+ axis = list(range(self._number_of_qubits))
348
+ for qubit in reversed(measured_qubits):
349
+ # Remove from largest qubit to smallest so list position is correct
350
+ # with respect to position from end of the list
351
+ axis.remove(self._number_of_qubits - 1 - qubit)
352
+ probabilities = np.reshape(
353
+ np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis)), 2**num_measured
354
+ )
355
+ # Generate samples on measured qubits as ints with qubit
356
+ # position in the bit-string for each int given by the qubit
357
+ # position in the sorted measured_qubits list
358
+ samples = self._local_random.choice(range(2**num_measured), num_samples, p=probabilities)
359
+ # Convert the ints to bitstrings
360
+ memory = []
361
+ for sample in samples:
362
+ classical_memory = self._classical_memory
363
+ for qubit, cmembit in measure_params:
364
+ pos = measured_qubits.index(qubit)
365
+ qubit_outcome = int((sample & (1 << pos)) >> pos)
366
+ membit = 1 << cmembit
367
+ classical_memory = (classical_memory & (~membit)) | (qubit_outcome << cmembit)
368
+ value = bin(classical_memory)[2:]
369
+ memory.append(hex(int(value, 2)))
370
+ return memory
371
+
372
+ def _add_measure(self, qubit: int, cmembit: int, cregbit: int | None = None) -> None:
373
+ """Apply a measure instruction to a qubit.
374
+
375
+ Args:
376
+ qubit: qubit is the qubit measured.
377
+ cmembit: is the classical memory bit to store outcome in.
378
+ cregbit: is the classical register bit to store outcome in.
379
+ """
380
+ # get measure outcome
381
+ outcome, probability = self._get_measure_outcome(qubit)
382
+ # update classical state
383
+ membit = 1 << cmembit
384
+ self._classical_memory = (self._classical_memory & (~membit)) | (int(outcome) << cmembit)
385
+
386
+ if cregbit is not None:
387
+ regbit = 1 << cregbit
388
+ self._classical_register = (self._classical_register & (~regbit)) | (
389
+ int(outcome) << cregbit
390
+ )
391
+
392
+ # update quantum state
393
+ if outcome == "0":
394
+ update_diag = [[1 / math.sqrt(probability), 0], [0, 0]]
395
+ else:
396
+ update_diag = [[0, 0], [0, 1 / math.sqrt(probability)]]
397
+ # update classical state
398
+ self._add_unitary(update_diag, [qubit])
399
+
400
+ def _add_reset(self, qubit: int) -> None:
401
+ """Apply a reset instruction to a qubit.
402
+
403
+ Args:
404
+ qubit: the qubit being rest
405
+
406
+ This is done by doing a simulating a measurement
407
+ outcome and projecting onto the outcome state while
408
+ renormalizing.
409
+ """
410
+ # get measure outcome
411
+ outcome, probability = self._get_measure_outcome(qubit)
412
+ # update quantum state
413
+ if outcome == "0":
414
+ update = [[1 / math.sqrt(probability), 0], [0, 0]]
415
+ self._add_unitary(update, [qubit])
416
+ else:
417
+ update = [[0, 1 / math.sqrt(probability)], [0, 0]]
418
+ self._add_unitary(update, [qubit])
419
+
420
+ def _validate_initial_statevector(self) -> None:
421
+ """Validate an initial statevector"""
422
+ # If the initial statevector isn't set we don't need to validate
423
+ if self._initial_statevector is None:
424
+ return
425
+ # Check statevector is correct length for number of qubits
426
+ length = len(self._initial_statevector)
427
+ required_dim = 2**self._number_of_qubits
428
+ if length != required_dim:
429
+ raise BasicProviderError(
430
+ f"initial statevector is incorrect length: {length} != {required_dim}"
431
+ )
432
+
433
+ def _set_options(
434
+ self, qobj_config: QasmQobjConfig | None = None, backend_options: dict | None = None
435
+ ) -> None:
436
+ """Set the backend options for all experiments in a qobj"""
437
+ # Reset default options
438
+ self._initial_statevector = self.options.get("initial_statevector")
439
+ self._chop_threshold = self.options.get("chop_threshold")
440
+ if "backend_options" in backend_options and backend_options["backend_options"]:
441
+ backend_options = backend_options["backend_options"]
442
+
443
+ # Check for custom initial statevector in backend_options first,
444
+ # then config second
445
+ if (
446
+ "initial_statevector" in backend_options
447
+ and backend_options["initial_statevector"] is not None
448
+ ):
449
+ self._initial_statevector = np.array(
450
+ backend_options["initial_statevector"], dtype=complex
451
+ )
452
+ elif hasattr(qobj_config, "initial_statevector"):
453
+ self._initial_statevector = np.array(qobj_config.initial_statevector, dtype=complex)
454
+ if self._initial_statevector is not None:
455
+ # Check the initial statevector is normalized
456
+ norm = np.linalg.norm(self._initial_statevector)
457
+ if round(norm, 12) != 1:
458
+ raise BasicProviderError(f"initial statevector is not normalized: norm {norm} != 1")
459
+ # Check for custom chop threshold
460
+ # Replace with custom options
461
+ if "chop_threshold" in backend_options:
462
+ self._chop_threshold = backend_options["chop_threshold"]
463
+ elif hasattr(qobj_config, "chop_threshold"):
464
+ self._chop_threshold = qobj_config.chop_threshold
465
+
466
+ def _initialize_statevector(self) -> None:
467
+ """Set the initial statevector for simulation"""
468
+ if self._initial_statevector is None:
469
+ # Set to default state of all qubits in |0>
470
+ self._statevector = np.zeros(2**self._number_of_qubits, dtype=complex)
471
+ self._statevector[0] = 1
472
+ else:
473
+ self._statevector = self._initial_statevector.copy()
474
+ # Reshape to rank-N tensor
475
+ self._statevector = np.reshape(self._statevector, self._number_of_qubits * [2])
476
+
477
+ def _validate_measure_sampling(self, experiment: QasmQobjExperiment) -> None:
478
+ """Determine if measure sampling is allowed for an experiment
479
+
480
+ Args:
481
+ experiment: a qobj experiment.
482
+ """
483
+ # If shots=1 we should disable measure sampling.
484
+ # This is also required for statevector simulator to return the
485
+ # correct final statevector without silently dropping final measurements.
486
+ if self._shots <= 1:
487
+ self._sample_measure = False
488
+ return
489
+
490
+ # Check for config flag
491
+ if hasattr(experiment.config, "allows_measure_sampling"):
492
+ self._sample_measure = experiment.config.allows_measure_sampling
493
+ # If flag isn't found do a simple test to see if a circuit contains
494
+ # no reset instructions, and no gates instructions after
495
+ # the first measure.
496
+ else:
497
+ measure_flag = False
498
+ for instruction in experiment.instructions:
499
+ # If circuit contains reset operations we cannot sample
500
+ if instruction.name == "reset":
501
+ self._sample_measure = False
502
+ return
503
+ # If circuit contains a measure option then we can
504
+ # sample only if all following operations are measures
505
+ if measure_flag:
506
+ # If we find a non-measure instruction
507
+ # we cannot do measure sampling
508
+ if instruction.name not in ["measure", "barrier", "id", "u0"]:
509
+ self._sample_measure = False
510
+ return
511
+ elif instruction.name == "measure":
512
+ measure_flag = True
513
+ # If we made it to the end of the circuit without returning
514
+ # measure sampling is allowed
515
+ self._sample_measure = True
516
+
517
+ def run(
518
+ self, run_input: QuantumCircuit | list[QuantumCircuit], **backend_options
519
+ ) -> BasicProviderJob:
520
+ """Run on the backend.
521
+
522
+ Args:
523
+ run_input: payload of the experiment
524
+ backend_options: backend options
525
+
526
+ Returns:
527
+ BasicProviderJob: derived from BaseJob
528
+
529
+ Additional Information:
530
+ backend_options: Is a dict of options for the backend. It may contain
531
+ * "initial_statevector": vector_like
532
+
533
+ The "initial_statevector" option specifies a custom initial
534
+ initial statevector for the simulator to be used instead of the all
535
+ zero state. This size of this vector must be correct for the number
536
+ of qubits in ``run_input`` parameter.
537
+
538
+ Example::
539
+
540
+ backend_options = {
541
+ "initial_statevector": np.array([1, 0, 0, 1j]) / math.sqrt(2),
542
+ }
543
+ """
544
+ # TODO: replace assemble with new run flow. If this is not achieved before 2.0,
545
+ # see removal note on `def _assemble`, L192 of qiskit/compiler/assembler.py
546
+ from qiskit.compiler.assembler import _assemble
547
+
548
+ out_options = {}
549
+ for key, value in backend_options.items():
550
+ if not hasattr(self.options, key):
551
+ warnings.warn(
552
+ f"Option {key} is not used by this backend", UserWarning, stacklevel=2
553
+ )
554
+ else:
555
+ out_options[key] = value
556
+ qobj = _assemble(run_input, self, **out_options)
557
+ qobj_options = qobj.config
558
+ self._set_options(qobj_config=qobj_options, backend_options=backend_options)
559
+ job_id = str(uuid.uuid4())
560
+ job = BasicProviderJob(self, job_id, self._run_job(job_id, qobj))
561
+ return job
562
+
563
+ def _run_job(self, job_id: str, qobj: QasmQobj) -> Result:
564
+ """Run experiments in qobj
565
+
566
+ Args:
567
+ job_id: unique id for the job.
568
+ qobj: job description
569
+
570
+ Returns:
571
+ Result object
572
+ """
573
+ self._validate(qobj)
574
+ result_list = []
575
+ self._shots = qobj.config.shots
576
+ self._memory = getattr(qobj.config, "memory", False)
577
+ self._qobj_config = qobj.config
578
+ start = time.time()
579
+ for experiment in qobj.experiments:
580
+ result_list.append(self.run_experiment(experiment))
581
+ end = time.time()
582
+ result = {
583
+ "backend_name": self.name,
584
+ "backend_version": self.backend_version,
585
+ "qobj_id": qobj.qobj_id,
586
+ "job_id": job_id,
587
+ "results": result_list,
588
+ "status": "COMPLETED",
589
+ "success": True,
590
+ "time_taken": (end - start),
591
+ "header": qobj.header.to_dict(),
592
+ }
593
+
594
+ return Result.from_dict(result)
595
+
596
+ def run_experiment(self, experiment: QasmQobjExperiment) -> dict[str, ...]:
597
+ """Run an experiment (circuit) and return a single experiment result.
598
+
599
+ Args:
600
+ experiment: experiment from qobj experiments list
601
+
602
+ Returns:
603
+ A result dictionary which looks something like::
604
+
605
+ {
606
+ "name": name of this experiment (obtained from qobj.experiment header)
607
+ "seed": random seed used for simulation
608
+ "shots": number of shots used in the simulation
609
+ "data":
610
+ {
611
+ "counts": {'0x9: 5, ...},
612
+ "memory": ['0x9', '0xF', '0x1D', ..., '0x9']
613
+ },
614
+ "status": status string for the simulation
615
+ "success": boolean
616
+ "time_taken": simulation time of this single experiment
617
+ }
618
+ Raises:
619
+ BasicProviderError: if an error occurred.
620
+ """
621
+ start = time.time()
622
+ self._number_of_qubits = experiment.config.n_qubits
623
+ self._number_of_cmembits = experiment.config.memory_slots
624
+ self._statevector = 0
625
+ self._classical_memory = 0
626
+ self._classical_register = 0
627
+ self._sample_measure = False
628
+ global_phase = experiment.header.global_phase
629
+
630
+ # Validate the dimension of initial statevector if set
631
+ self._validate_initial_statevector()
632
+
633
+ # Get the seed looking in circuit, qobj, and then random.
634
+ if hasattr(experiment.config, "seed_simulator"):
635
+ seed_simulator = experiment.config.seed_simulator
636
+ elif hasattr(self._qobj_config, "seed_simulator"):
637
+ seed_simulator = self._qobj_config.seed_simulator
638
+ else:
639
+ # For compatibility on Windows force dyte to be int32
640
+ # and set the maximum value to be (2 ** 31) - 1
641
+ seed_simulator = np.random.randint(2147483647, dtype="int32")
642
+
643
+ self._local_random = np.random.default_rng(seed=seed_simulator)
644
+ # Check if measure sampling is supported for current circuit
645
+ self._validate_measure_sampling(experiment)
646
+
647
+ # List of final counts for all shots
648
+ memory = []
649
+ # Check if we can sample measurements, if so we only perform 1 shot
650
+ # and sample all outcomes from the final state vector
651
+ if self._sample_measure:
652
+ shots = 1
653
+ # Store (qubit, cmembit) pairs for all measure ops in circuit to
654
+ # be sampled
655
+ measure_sample_ops = []
656
+ else:
657
+ shots = self._shots
658
+ for _ in range(shots):
659
+ self._initialize_statevector()
660
+ # apply global_phase
661
+ self._statevector *= np.exp(1j * global_phase)
662
+ # Initialize classical memory to all 0
663
+ self._classical_memory = 0
664
+ self._classical_register = 0
665
+ for operation in experiment.instructions:
666
+ conditional = getattr(operation, "conditional", None)
667
+ if isinstance(conditional, int):
668
+ conditional_bit_set = (self._classical_register >> conditional) & 1
669
+ if not conditional_bit_set:
670
+ continue
671
+ elif conditional is not None:
672
+ mask = int(operation.conditional.mask, 16)
673
+ if mask > 0:
674
+ value = self._classical_memory & mask
675
+ while (mask & 0x1) == 0:
676
+ mask >>= 1
677
+ value >>= 1
678
+ if value != int(operation.conditional.val, 16):
679
+ continue
680
+ if operation.name == "unitary":
681
+ qubits = operation.qubits
682
+ gate = operation.params[0]
683
+ self._add_unitary(gate, qubits)
684
+ elif operation.name in ("id", "u0", "delay"):
685
+ pass
686
+ elif operation.name == "global_phase":
687
+ params = getattr(operation, "params", None)
688
+ gate = GlobalPhaseGate(*params).to_matrix()
689
+ self._add_unitary(gate, [])
690
+ # Check if single qubit gate
691
+ elif operation.name in SINGLE_QUBIT_GATES:
692
+ params = getattr(operation, "params", None)
693
+ qubit = operation.qubits[0]
694
+ gate = single_gate_matrix(operation.name, params)
695
+ self._add_unitary(gate, [qubit])
696
+ elif operation.name in TWO_QUBIT_GATES_WITH_PARAMETERS:
697
+ params = getattr(operation, "params", None)
698
+ qubit0 = operation.qubits[0]
699
+ qubit1 = operation.qubits[1]
700
+ gate = TWO_QUBIT_GATES_WITH_PARAMETERS[operation.name](*params).to_matrix()
701
+ self._add_unitary(gate, [qubit0, qubit1])
702
+ elif operation.name in ("id", "u0"):
703
+ pass
704
+ elif operation.name in TWO_QUBIT_GATES:
705
+ qubit0 = operation.qubits[0]
706
+ qubit1 = operation.qubits[1]
707
+ gate = TWO_QUBIT_GATES[operation.name]
708
+ self._add_unitary(gate, [qubit0, qubit1])
709
+ elif operation.name in THREE_QUBIT_GATES:
710
+ qubit0 = operation.qubits[0]
711
+ qubit1 = operation.qubits[1]
712
+ qubit2 = operation.qubits[2]
713
+ gate = THREE_QUBIT_GATES[operation.name]
714
+ self._add_unitary(gate, [qubit0, qubit1, qubit2])
715
+ # Check if reset
716
+ elif operation.name == "reset":
717
+ qubit = operation.qubits[0]
718
+ self._add_reset(qubit)
719
+ # Check if barrier
720
+ elif operation.name == "barrier":
721
+ pass
722
+ # Check if measure
723
+ elif operation.name == "measure":
724
+ qubit = operation.qubits[0]
725
+ cmembit = operation.memory[0]
726
+ cregbit = operation.register[0] if hasattr(operation, "register") else None
727
+
728
+ if self._sample_measure:
729
+ # If sampling measurements record the qubit and cmembit
730
+ # for this measurement for later sampling
731
+ measure_sample_ops.append((qubit, cmembit))
732
+ else:
733
+ # If not sampling perform measurement as normal
734
+ self._add_measure(qubit, cmembit, cregbit)
735
+ elif operation.name == "bfunc":
736
+ mask = int(operation.mask, 16)
737
+ relation = operation.relation
738
+ val = int(operation.val, 16)
739
+
740
+ cregbit = operation.register
741
+ cmembit = operation.memory if hasattr(operation, "memory") else None
742
+
743
+ compared = (self._classical_register & mask) - val
744
+
745
+ if relation == "==":
746
+ outcome = compared == 0
747
+ elif relation == "!=":
748
+ outcome = compared != 0
749
+ elif relation == "<":
750
+ outcome = compared < 0
751
+ elif relation == "<=":
752
+ outcome = compared <= 0
753
+ elif relation == ">":
754
+ outcome = compared > 0
755
+ elif relation == ">=":
756
+ outcome = compared >= 0
757
+ else:
758
+ raise BasicProviderError("Invalid boolean function relation.")
759
+
760
+ # Store outcome in register and optionally memory slot
761
+ regbit = 1 << cregbit
762
+ self._classical_register = (self._classical_register & (~regbit)) | (
763
+ int(outcome) << cregbit
764
+ )
765
+ if cmembit is not None:
766
+ membit = 1 << cmembit
767
+ self._classical_memory = (self._classical_memory & (~membit)) | (
768
+ int(outcome) << cmembit
769
+ )
770
+ else:
771
+ backend = self.name
772
+ err_msg = '{0} encountered unrecognized operation "{1}"'
773
+ raise BasicProviderError(err_msg.format(backend, operation.name))
774
+
775
+ # Add final creg data to memory list
776
+ if self._number_of_cmembits > 0:
777
+ if self._sample_measure:
778
+ # If sampling we generate all shot samples from the final statevector
779
+ memory = self._add_sample_measure(measure_sample_ops, self._shots)
780
+ else:
781
+ # Turn classical_memory (int) into bit string and pad zero for unused cmembits
782
+ outcome = bin(self._classical_memory)[2:]
783
+ memory.append(hex(int(outcome, 2)))
784
+
785
+ # Add data
786
+ data = {"counts": dict(Counter(memory))}
787
+ # Optionally add memory list
788
+ if self._memory:
789
+ data["memory"] = memory
790
+ end = time.time()
791
+ return {
792
+ "name": experiment.header.name,
793
+ "seed_simulator": seed_simulator,
794
+ "shots": self._shots,
795
+ "data": data,
796
+ "status": "DONE",
797
+ "success": True,
798
+ "time_taken": (end - start),
799
+ "header": experiment.header.to_dict(),
800
+ }
801
+
802
+ def _validate(self, qobj: QasmQobj) -> None:
803
+ """Semantic validations of the qobj which cannot be done via schemas."""
804
+ n_qubits = qobj.config.n_qubits
805
+ max_qubits = self.MAX_QUBITS_MEMORY
806
+ if n_qubits > max_qubits:
807
+ raise BasicProviderError(
808
+ f"Number of qubits {n_qubits} is greater than maximum ({max_qubits}) "
809
+ f'for "{self.name}".'
810
+ )
811
+ for experiment in qobj.experiments:
812
+ name = experiment.header.name
813
+ if experiment.config.memory_slots == 0:
814
+ logger.warning(
815
+ 'No classical registers in circuit "%s", counts will be empty.', name
816
+ )
817
+ elif "measure" not in [op.name for op in experiment.instructions]:
818
+ logger.warning(
819
+ 'No measurements in circuit "%s", classical register will remain all zeros.',
820
+ name,
821
+ )