qiskit 1.3.0b1__cp39-abi3-macosx_10_9_x86_64.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 (825) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +127 -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 +365 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1270 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3264 -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 +48 -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 +503 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +163 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +106 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +295 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +261 -0
  54. qiskit/circuit/instruction.py +676 -0
  55. qiskit/circuit/instructionset.py +177 -0
  56. qiskit/circuit/library/__init__.py +572 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -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 +16 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -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 +331 -0
  80. qiskit/circuit/library/blueprintcircuit.py +216 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +54 -0
  87. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  88. qiskit/circuit/library/data_preparation/pauli_feature_map.py +343 -0
  89. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  90. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  91. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  92. qiskit/circuit/library/fourier_checking.py +97 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +165 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +121 -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 +312 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +256 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +192 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +97 -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 +86 -0
  111. qiskit/circuit/library/grover_operator.py +311 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +98 -0
  114. qiskit/circuit/library/iqp.py +96 -0
  115. qiskit/circuit/library/n_local/__init__.py +33 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +164 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +256 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +173 -0
  119. qiskit/circuit/library/n_local/n_local.py +1071 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +141 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +287 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +186 -0
  123. qiskit/circuit/library/n_local/two_local.py +282 -0
  124. qiskit/circuit/library/overlap.py +117 -0
  125. qiskit/circuit/library/pauli_evolution.py +184 -0
  126. qiskit/circuit/library/phase_estimation.py +99 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +115 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +123 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +77 -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 +257 -0
  135. qiskit/circuit/library/standard_gates/i.py +75 -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 +433 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +302 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +297 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +318 -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 +314 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +395 -0
  152. qiskit/circuit/library/standard_gates/u1.py +451 -0
  153. qiskit/circuit/library/standard_gates/u2.py +146 -0
  154. qiskit/circuit/library/standard_gates/u3.py +408 -0
  155. qiskit/circuit/library/standard_gates/x.py +1527 -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 +261 -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 +33 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +174 -0
  238. qiskit/circuit/parameterexpression.py +559 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6793 -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 +604 -0
  249. qiskit/circuit/store.py +95 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/compiler/__init__.py +33 -0
  253. qiskit/compiler/assembler.py +668 -0
  254. qiskit/compiler/scheduler.py +107 -0
  255. qiskit/compiler/sequencer.py +69 -0
  256. qiskit/compiler/transpiler.py +478 -0
  257. qiskit/converters/__init__.py +74 -0
  258. qiskit/converters/circuit_to_dag.py +78 -0
  259. qiskit/converters/circuit_to_dagdependency.py +51 -0
  260. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  261. qiskit/converters/circuit_to_gate.py +107 -0
  262. qiskit/converters/circuit_to_instruction.py +155 -0
  263. qiskit/converters/dag_to_circuit.py +77 -0
  264. qiskit/converters/dag_to_dagdependency.py +55 -0
  265. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  266. qiskit/converters/dagdependency_to_circuit.py +42 -0
  267. qiskit/converters/dagdependency_to_dag.py +49 -0
  268. qiskit/dagcircuit/__init__.py +44 -0
  269. qiskit/dagcircuit/collect_blocks.py +391 -0
  270. qiskit/dagcircuit/dagcircuit.py +24 -0
  271. qiskit/dagcircuit/dagdependency.py +633 -0
  272. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  273. qiskit/dagcircuit/dagdepnode.py +160 -0
  274. qiskit/dagcircuit/dagnode.py +176 -0
  275. qiskit/dagcircuit/exceptions.py +42 -0
  276. qiskit/exceptions.py +153 -0
  277. qiskit/passmanager/__init__.py +240 -0
  278. qiskit/passmanager/base_tasks.py +230 -0
  279. qiskit/passmanager/compilation_status.py +74 -0
  280. qiskit/passmanager/exceptions.py +19 -0
  281. qiskit/passmanager/flow_controllers.py +116 -0
  282. qiskit/passmanager/passmanager.py +333 -0
  283. qiskit/primitives/__init__.py +481 -0
  284. qiskit/primitives/backend_estimator.py +483 -0
  285. qiskit/primitives/backend_estimator_v2.py +434 -0
  286. qiskit/primitives/backend_sampler.py +222 -0
  287. qiskit/primitives/backend_sampler_v2.py +296 -0
  288. qiskit/primitives/base/__init__.py +20 -0
  289. qiskit/primitives/base/base_estimator.py +252 -0
  290. qiskit/primitives/base/base_primitive.py +45 -0
  291. qiskit/primitives/base/base_primitive_job.py +78 -0
  292. qiskit/primitives/base/base_result.py +65 -0
  293. qiskit/primitives/base/base_sampler.py +204 -0
  294. qiskit/primitives/base/estimator_result.py +46 -0
  295. qiskit/primitives/base/sampler_result.py +45 -0
  296. qiskit/primitives/base/validation.py +231 -0
  297. qiskit/primitives/containers/__init__.py +26 -0
  298. qiskit/primitives/containers/bindings_array.py +389 -0
  299. qiskit/primitives/containers/bit_array.py +741 -0
  300. qiskit/primitives/containers/data_bin.py +165 -0
  301. qiskit/primitives/containers/estimator_pub.py +222 -0
  302. qiskit/primitives/containers/object_array.py +94 -0
  303. qiskit/primitives/containers/observables_array.py +279 -0
  304. qiskit/primitives/containers/primitive_result.py +53 -0
  305. qiskit/primitives/containers/pub_result.py +51 -0
  306. qiskit/primitives/containers/sampler_pub.py +193 -0
  307. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  308. qiskit/primitives/containers/shape.py +129 -0
  309. qiskit/primitives/estimator.py +172 -0
  310. qiskit/primitives/primitive_job.py +81 -0
  311. qiskit/primitives/sampler.py +162 -0
  312. qiskit/primitives/statevector_estimator.py +174 -0
  313. qiskit/primitives/statevector_sampler.py +292 -0
  314. qiskit/primitives/utils.py +247 -0
  315. qiskit/providers/__init__.py +803 -0
  316. qiskit/providers/backend.py +656 -0
  317. qiskit/providers/backend_compat.py +452 -0
  318. qiskit/providers/basic_provider/__init__.py +45 -0
  319. qiskit/providers/basic_provider/basic_provider.py +101 -0
  320. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  321. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  322. qiskit/providers/basic_provider/basic_simulator.py +811 -0
  323. qiskit/providers/basic_provider/exceptions.py +30 -0
  324. qiskit/providers/exceptions.py +45 -0
  325. qiskit/providers/fake_provider/__init__.py +105 -0
  326. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  350. qiskit/providers/fake_provider/fake_1q.py +91 -0
  351. qiskit/providers/fake_provider/fake_backend.py +165 -0
  352. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  353. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  354. qiskit/providers/fake_provider/fake_pulse_backend.py +44 -0
  355. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  356. qiskit/providers/fake_provider/generic_backend_v2.py +1019 -0
  357. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  358. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  359. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  360. qiskit/providers/job.py +147 -0
  361. qiskit/providers/jobstatus.py +30 -0
  362. qiskit/providers/models/__init__.py +89 -0
  363. qiskit/providers/models/backendconfiguration.py +1040 -0
  364. qiskit/providers/models/backendproperties.py +517 -0
  365. qiskit/providers/models/backendstatus.py +94 -0
  366. qiskit/providers/models/jobstatus.py +66 -0
  367. qiskit/providers/models/pulsedefaults.py +303 -0
  368. qiskit/providers/options.py +273 -0
  369. qiskit/providers/provider.py +95 -0
  370. qiskit/providers/providerutils.py +110 -0
  371. qiskit/pulse/__init__.py +158 -0
  372. qiskit/pulse/builder.py +2213 -0
  373. qiskit/pulse/calibration_entries.py +378 -0
  374. qiskit/pulse/channels.py +225 -0
  375. qiskit/pulse/configuration.py +245 -0
  376. qiskit/pulse/exceptions.py +43 -0
  377. qiskit/pulse/filters.py +309 -0
  378. qiskit/pulse/instruction_schedule_map.py +409 -0
  379. qiskit/pulse/instructions/__init__.py +67 -0
  380. qiskit/pulse/instructions/acquire.py +148 -0
  381. qiskit/pulse/instructions/delay.py +69 -0
  382. qiskit/pulse/instructions/directives.py +146 -0
  383. qiskit/pulse/instructions/frequency.py +132 -0
  384. qiskit/pulse/instructions/instruction.py +268 -0
  385. qiskit/pulse/instructions/phase.py +149 -0
  386. qiskit/pulse/instructions/play.py +97 -0
  387. qiskit/pulse/instructions/reference.py +98 -0
  388. qiskit/pulse/instructions/snapshot.py +80 -0
  389. qiskit/pulse/library/__init__.py +97 -0
  390. qiskit/pulse/library/continuous.py +430 -0
  391. qiskit/pulse/library/pulse.py +146 -0
  392. qiskit/pulse/library/samplers/__init__.py +15 -0
  393. qiskit/pulse/library/samplers/decorators.py +295 -0
  394. qiskit/pulse/library/samplers/strategies.py +71 -0
  395. qiskit/pulse/library/symbolic_pulses.py +1960 -0
  396. qiskit/pulse/library/waveform.py +134 -0
  397. qiskit/pulse/macros.py +262 -0
  398. qiskit/pulse/parameter_manager.py +445 -0
  399. qiskit/pulse/parser.py +314 -0
  400. qiskit/pulse/reference_manager.py +58 -0
  401. qiskit/pulse/schedule.py +1855 -0
  402. qiskit/pulse/transforms/__init__.py +106 -0
  403. qiskit/pulse/transforms/alignments.py +404 -0
  404. qiskit/pulse/transforms/base_transforms.py +71 -0
  405. qiskit/pulse/transforms/canonicalization.py +498 -0
  406. qiskit/pulse/transforms/dag.py +115 -0
  407. qiskit/pulse/utils.py +149 -0
  408. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  409. qiskit/qasm/libs/qelib1.inc +266 -0
  410. qiskit/qasm/libs/stdgates.inc +82 -0
  411. qiskit/qasm2/__init__.py +654 -0
  412. qiskit/qasm2/exceptions.py +27 -0
  413. qiskit/qasm2/export.py +370 -0
  414. qiskit/qasm2/parse.py +408 -0
  415. qiskit/qasm3/__init__.py +366 -0
  416. qiskit/qasm3/ast.py +630 -0
  417. qiskit/qasm3/exceptions.py +27 -0
  418. qiskit/qasm3/experimental.py +70 -0
  419. qiskit/qasm3/exporter.py +1273 -0
  420. qiskit/qasm3/printer.py +577 -0
  421. qiskit/qobj/__init__.py +75 -0
  422. qiskit/qobj/common.py +81 -0
  423. qiskit/qobj/converters/__init__.py +18 -0
  424. qiskit/qobj/converters/lo_config.py +177 -0
  425. qiskit/qobj/converters/pulse_instruction.py +895 -0
  426. qiskit/qobj/pulse_qobj.py +709 -0
  427. qiskit/qobj/qasm_qobj.py +708 -0
  428. qiskit/qobj/utils.py +46 -0
  429. qiskit/qpy/__init__.py +1641 -0
  430. qiskit/qpy/binary_io/__init__.py +36 -0
  431. qiskit/qpy/binary_io/circuits.py +1460 -0
  432. qiskit/qpy/binary_io/schedules.py +636 -0
  433. qiskit/qpy/binary_io/value.py +728 -0
  434. qiskit/qpy/common.py +306 -0
  435. qiskit/qpy/exceptions.py +53 -0
  436. qiskit/qpy/formats.py +394 -0
  437. qiskit/qpy/interface.py +341 -0
  438. qiskit/qpy/type_keys.py +572 -0
  439. qiskit/quantum_info/__init__.py +158 -0
  440. qiskit/quantum_info/analysis/__init__.py +17 -0
  441. qiskit/quantum_info/analysis/average.py +47 -0
  442. qiskit/quantum_info/analysis/distance.py +102 -0
  443. qiskit/quantum_info/analysis/make_observable.py +44 -0
  444. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  445. qiskit/quantum_info/operators/__init__.py +28 -0
  446. qiskit/quantum_info/operators/base_operator.py +145 -0
  447. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  448. qiskit/quantum_info/operators/channel/chi.py +191 -0
  449. qiskit/quantum_info/operators/channel/choi.py +218 -0
  450. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  451. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  452. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  453. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  454. qiskit/quantum_info/operators/channel/superop.py +377 -0
  455. qiskit/quantum_info/operators/channel/transformations.py +468 -0
  456. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  457. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  458. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  460. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  461. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  462. qiskit/quantum_info/operators/linear_op.py +25 -0
  463. qiskit/quantum_info/operators/measures.py +418 -0
  464. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  465. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  466. qiskit/quantum_info/operators/mixins/group.py +171 -0
  467. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  468. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  469. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  470. qiskit/quantum_info/operators/op_shape.py +525 -0
  471. qiskit/quantum_info/operators/operator.py +819 -0
  472. qiskit/quantum_info/operators/operator_utils.py +76 -0
  473. qiskit/quantum_info/operators/predicates.py +183 -0
  474. qiskit/quantum_info/operators/random.py +154 -0
  475. qiskit/quantum_info/operators/scalar_op.py +254 -0
  476. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  477. qiskit/quantum_info/operators/symplectic/base_pauli.py +727 -0
  478. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  479. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  480. qiskit/quantum_info/operators/symplectic/pauli.py +751 -0
  481. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  483. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  484. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1175 -0
  485. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  486. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  487. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  489. qiskit/quantum_info/quaternion.py +156 -0
  490. qiskit/quantum_info/random.py +26 -0
  491. qiskit/quantum_info/states/__init__.py +28 -0
  492. qiskit/quantum_info/states/densitymatrix.py +845 -0
  493. qiskit/quantum_info/states/measures.py +288 -0
  494. qiskit/quantum_info/states/quantum_state.py +503 -0
  495. qiskit/quantum_info/states/random.py +157 -0
  496. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  497. qiskit/quantum_info/states/statevector.py +958 -0
  498. qiskit/quantum_info/states/utils.py +247 -0
  499. qiskit/result/__init__.py +73 -0
  500. qiskit/result/counts.py +189 -0
  501. qiskit/result/distributions/__init__.py +17 -0
  502. qiskit/result/distributions/probability.py +100 -0
  503. qiskit/result/distributions/quasi.py +154 -0
  504. qiskit/result/exceptions.py +40 -0
  505. qiskit/result/mitigation/__init__.py +13 -0
  506. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  507. qiskit/result/mitigation/correlated_readout_mitigator.py +269 -0
  508. qiskit/result/mitigation/local_readout_mitigator.py +320 -0
  509. qiskit/result/mitigation/utils.py +160 -0
  510. qiskit/result/models.py +234 -0
  511. qiskit/result/postprocess.py +239 -0
  512. qiskit/result/result.py +392 -0
  513. qiskit/result/sampled_expval.py +75 -0
  514. qiskit/result/utils.py +295 -0
  515. qiskit/scheduler/__init__.py +40 -0
  516. qiskit/scheduler/config.py +35 -0
  517. qiskit/scheduler/lowering.py +187 -0
  518. qiskit/scheduler/methods/__init__.py +15 -0
  519. qiskit/scheduler/methods/basic.py +137 -0
  520. qiskit/scheduler/schedule_circuit.py +67 -0
  521. qiskit/scheduler/sequence.py +102 -0
  522. qiskit/synthesis/__init__.py +195 -0
  523. qiskit/synthesis/clifford/__init__.py +19 -0
  524. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  525. qiskit/synthesis/clifford/clifford_decompose_bm.py +47 -0
  526. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  527. qiskit/synthesis/clifford/clifford_decompose_greedy.py +57 -0
  528. qiskit/synthesis/clifford/clifford_decompose_layers.py +446 -0
  529. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  530. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  531. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  532. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  533. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  534. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  535. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  536. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  537. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  538. qiskit/synthesis/evolution/__init__.py +20 -0
  539. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  540. qiskit/synthesis/evolution/lie_trotter.py +143 -0
  541. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  542. qiskit/synthesis/evolution/product_formula.py +384 -0
  543. qiskit/synthesis/evolution/qdrift.py +131 -0
  544. qiskit/synthesis/evolution/suzuki_trotter.py +155 -0
  545. qiskit/synthesis/linear/__init__.py +26 -0
  546. qiskit/synthesis/linear/cnot_synth.py +69 -0
  547. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  548. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  549. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  550. qiskit/synthesis/linear_phase/__init__.py +17 -0
  551. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  552. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  553. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  554. qiskit/synthesis/multi_controlled/__init__.py +23 -0
  555. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  556. qiskit/synthesis/one_qubit/__init__.py +15 -0
  557. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  558. qiskit/synthesis/permutation/__init__.py +18 -0
  559. qiskit/synthesis/permutation/permutation_full.py +78 -0
  560. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  561. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  562. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  563. qiskit/synthesis/qft/__init__.py +16 -0
  564. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  565. qiskit/synthesis/qft/qft_decompose_lnn.py +78 -0
  566. qiskit/synthesis/stabilizer/__init__.py +16 -0
  567. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  568. qiskit/synthesis/stabilizer/stabilizer_decompose.py +193 -0
  569. qiskit/synthesis/two_qubit/__init__.py +19 -0
  570. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  571. qiskit/synthesis/two_qubit/two_qubit_decompose.py +759 -0
  572. qiskit/synthesis/two_qubit/weyl.py +97 -0
  573. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  574. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  575. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  576. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  577. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  578. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  579. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  580. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  581. qiskit/synthesis/unitary/__init__.py +13 -0
  582. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  583. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  584. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  585. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  586. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  587. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  588. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  589. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  590. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  591. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  592. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  593. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  594. qiskit/synthesis/unitary/qsd.py +288 -0
  595. qiskit/transpiler/__init__.py +1283 -0
  596. qiskit/transpiler/basepasses.py +221 -0
  597. qiskit/transpiler/coupling.py +500 -0
  598. qiskit/transpiler/exceptions.py +59 -0
  599. qiskit/transpiler/instruction_durations.py +281 -0
  600. qiskit/transpiler/layout.py +737 -0
  601. qiskit/transpiler/passes/__init__.py +310 -0
  602. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  603. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  604. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  605. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  606. qiskit/transpiler/passes/analysis/depth.py +33 -0
  607. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  608. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  609. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  610. qiskit/transpiler/passes/analysis/size.py +36 -0
  611. qiskit/transpiler/passes/analysis/width.py +27 -0
  612. qiskit/transpiler/passes/basis/__init__.py +19 -0
  613. qiskit/transpiler/passes/basis/basis_translator.py +693 -0
  614. qiskit/transpiler/passes/basis/decompose.py +98 -0
  615. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  616. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  617. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  618. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  619. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  620. qiskit/transpiler/passes/calibration/builders.py +20 -0
  621. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  622. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  623. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  624. qiskit/transpiler/passes/calibration/rzx_builder.py +395 -0
  625. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  626. qiskit/transpiler/passes/layout/__init__.py +26 -0
  627. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  628. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  629. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  630. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  631. qiskit/transpiler/passes/layout/disjoint_utils.py +217 -0
  632. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  633. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  634. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  635. qiskit/transpiler/passes/layout/sabre_layout.py +482 -0
  636. qiskit/transpiler/passes/layout/sabre_pre_layout.py +220 -0
  637. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  638. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  639. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  640. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  641. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  642. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  643. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  644. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  645. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  646. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  647. qiskit/transpiler/passes/optimization/collect_cliffords.py +88 -0
  648. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  649. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  650. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  651. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  652. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  653. qiskit/transpiler/passes/optimization/consolidate_blocks.py +232 -0
  654. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  655. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  656. qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
  657. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  658. qiskit/transpiler/passes/optimization/inverse_cancellation.py +93 -0
  659. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  660. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  661. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +260 -0
  662. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  663. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  664. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  665. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  666. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  667. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  668. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  669. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  670. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  671. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  672. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  673. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  674. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  675. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  676. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  677. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  678. qiskit/transpiler/passes/routing/__init__.py +22 -0
  679. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  680. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  681. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  682. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  683. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  684. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  685. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  686. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  687. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  688. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  689. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  690. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  691. qiskit/transpiler/passes/routing/sabre_swap.py +443 -0
  692. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  693. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  694. qiskit/transpiler/passes/routing/utils.py +35 -0
  695. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  696. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  697. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  698. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  699. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  700. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +105 -0
  701. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  702. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  703. qiskit/transpiler/passes/scheduling/base_scheduler.py +308 -0
  704. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +307 -0
  705. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  706. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  707. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +441 -0
  708. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  709. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  710. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  711. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  712. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +90 -0
  713. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  714. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +160 -0
  715. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  716. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  717. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +691 -0
  718. qiskit/transpiler/passes/synthesis/hls_plugins.py +928 -0
  719. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  720. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  721. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  722. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  723. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1055 -0
  724. qiskit/transpiler/passes/utils/__init__.py +33 -0
  725. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  726. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  727. qiskit/transpiler/passes/utils/check_map.py +78 -0
  728. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  729. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  730. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +88 -0
  731. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  732. qiskit/transpiler/passes/utils/error.py +69 -0
  733. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  734. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  735. qiskit/transpiler/passes/utils/gate_direction.py +349 -0
  736. qiskit/transpiler/passes/utils/gates_basis.py +74 -0
  737. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  738. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  739. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  740. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  741. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  742. qiskit/transpiler/passmanager.py +490 -0
  743. qiskit/transpiler/passmanager_config.py +198 -0
  744. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  745. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1019 -0
  746. qiskit/transpiler/preset_passmanagers/common.py +647 -0
  747. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +543 -0
  748. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  749. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  750. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  751. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  752. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  753. qiskit/transpiler/target.py +1261 -0
  754. qiskit/transpiler/timing_constraints.py +59 -0
  755. qiskit/user_config.py +262 -0
  756. qiskit/utils/__init__.py +89 -0
  757. qiskit/utils/classtools.py +146 -0
  758. qiskit/utils/deprecation.py +490 -0
  759. qiskit/utils/lazy_tester.py +363 -0
  760. qiskit/utils/multiprocessing.py +56 -0
  761. qiskit/utils/optionals.py +347 -0
  762. qiskit/utils/parallel.py +191 -0
  763. qiskit/utils/units.py +143 -0
  764. qiskit/version.py +84 -0
  765. qiskit/visualization/__init__.py +288 -0
  766. qiskit/visualization/array.py +204 -0
  767. qiskit/visualization/bloch.py +778 -0
  768. qiskit/visualization/circuit/__init__.py +15 -0
  769. qiskit/visualization/circuit/_utils.py +675 -0
  770. qiskit/visualization/circuit/circuit_visualization.py +726 -0
  771. qiskit/visualization/circuit/latex.py +661 -0
  772. qiskit/visualization/circuit/matplotlib.py +2029 -0
  773. qiskit/visualization/circuit/qcstyle.py +278 -0
  774. qiskit/visualization/circuit/styles/__init__.py +13 -0
  775. qiskit/visualization/circuit/styles/bw.json +202 -0
  776. qiskit/visualization/circuit/styles/clifford.json +202 -0
  777. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  778. qiskit/visualization/circuit/styles/iqp.json +214 -0
  779. qiskit/visualization/circuit/styles/textbook.json +202 -0
  780. qiskit/visualization/circuit/text.py +1844 -0
  781. qiskit/visualization/circuit_visualization.py +19 -0
  782. qiskit/visualization/counts_visualization.py +481 -0
  783. qiskit/visualization/dag_visualization.py +316 -0
  784. qiskit/visualization/exceptions.py +21 -0
  785. qiskit/visualization/gate_map.py +1485 -0
  786. qiskit/visualization/library.py +37 -0
  787. qiskit/visualization/pass_manager_visualization.py +319 -0
  788. qiskit/visualization/pulse_v2/__init__.py +21 -0
  789. qiskit/visualization/pulse_v2/core.py +901 -0
  790. qiskit/visualization/pulse_v2/device_info.py +173 -0
  791. qiskit/visualization/pulse_v2/drawings.py +253 -0
  792. qiskit/visualization/pulse_v2/events.py +254 -0
  793. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  794. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  795. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  796. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  797. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  798. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  799. qiskit/visualization/pulse_v2/interface.py +456 -0
  800. qiskit/visualization/pulse_v2/layouts.py +387 -0
  801. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  802. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  803. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  804. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  805. qiskit/visualization/pulse_v2/types.py +242 -0
  806. qiskit/visualization/state_visualization.py +1518 -0
  807. qiskit/visualization/timeline/__init__.py +21 -0
  808. qiskit/visualization/timeline/core.py +457 -0
  809. qiskit/visualization/timeline/drawings.py +260 -0
  810. qiskit/visualization/timeline/generators.py +506 -0
  811. qiskit/visualization/timeline/interface.py +424 -0
  812. qiskit/visualization/timeline/layouts.py +115 -0
  813. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  814. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  815. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  816. qiskit/visualization/timeline/stylesheet.py +301 -0
  817. qiskit/visualization/timeline/types.py +148 -0
  818. qiskit/visualization/transition_visualization.py +369 -0
  819. qiskit/visualization/utils.py +49 -0
  820. qiskit-1.3.0b1.dist-info/LICENSE.txt +203 -0
  821. qiskit-1.3.0b1.dist-info/METADATA +221 -0
  822. qiskit-1.3.0b1.dist-info/RECORD +825 -0
  823. qiskit-1.3.0b1.dist-info/WHEEL +5 -0
  824. qiskit-1.3.0b1.dist-info/entry_points.txt +57 -0
  825. qiskit-1.3.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1019 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Generic BackendV2 class that with a simulated ``run``."""
14
+
15
+ from __future__ import annotations
16
+ import warnings
17
+
18
+ from collections.abc import Iterable
19
+ from typing import List, Dict, Any, Union
20
+ import numpy as np
21
+
22
+ from qiskit import pulse
23
+ from qiskit.pulse.instruction_schedule_map import InstructionScheduleMap
24
+ from qiskit.circuit import QuantumCircuit, Instruction
25
+ from qiskit.circuit.controlflow import (
26
+ IfElseOp,
27
+ WhileLoopOp,
28
+ ForLoopOp,
29
+ SwitchCaseOp,
30
+ BreakLoopOp,
31
+ ContinueLoopOp,
32
+ )
33
+ from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping
34
+ from qiskit.exceptions import QiskitError
35
+ from qiskit.transpiler import CouplingMap, Target, InstructionProperties, QubitProperties
36
+ from qiskit.providers import Options
37
+ from qiskit.providers.basic_provider import BasicSimulator
38
+ from qiskit.providers.backend import BackendV2
39
+ from qiskit.utils import optionals as _optionals
40
+ from qiskit.providers.models.pulsedefaults import Command
41
+ from qiskit.qobj.converters.pulse_instruction import QobjToInstructionConverter
42
+ from qiskit.pulse.calibration_entries import PulseQobjDef
43
+ from qiskit.providers.models.pulsedefaults import MeasurementKernel, Discriminator
44
+ from qiskit.qobj.pulse_qobj import QobjMeasurementOption
45
+
46
+ # Noise default values/ranges for duration and error of supported
47
+ # instructions. There are two possible formats:
48
+ # - (min_duration, max_duration, min_error, max_error),
49
+ # if the defaults are ranges.
50
+ # - (duration, error), if the defaults are fixed values.
51
+ _NOISE_DEFAULTS = {
52
+ "cx": (7.992e-08, 8.99988e-07, 1e-5, 5e-3),
53
+ "ecr": (7.992e-08, 8.99988e-07, 1e-5, 5e-3),
54
+ "cz": (7.992e-08, 8.99988e-07, 1e-5, 5e-3),
55
+ "id": (2.997e-08, 5.994e-08, 9e-5, 1e-4),
56
+ "rz": (0.0, 0.0),
57
+ "sx": (2.997e-08, 5.994e-08, 9e-5, 1e-4),
58
+ "x": (2.997e-08, 5.994e-08, 9e-5, 1e-4),
59
+ "measure": (6.99966e-07, 1.500054e-06, 1e-5, 5e-3),
60
+ "delay": (None, None),
61
+ "reset": (None, None),
62
+ }
63
+
64
+ # Fallback values for gates with unknown noise default ranges.
65
+ _NOISE_DEFAULTS_FALLBACK = {
66
+ "1-q": (2.997e-08, 5.994e-08, 9e-5, 1e-4),
67
+ "multi-q": (7.992e-08, 8.99988e-07, 5e-3),
68
+ }
69
+
70
+ # Ranges to sample qubit properties from.
71
+ _QUBIT_PROPERTIES = {
72
+ "dt": 0.222e-9,
73
+ "t1": (100e-6, 200e-6),
74
+ "t2": (100e-6, 200e-6),
75
+ "frequency": (5e9, 5.5e9),
76
+ }
77
+
78
+
79
+ class PulseDefaults:
80
+ """Internal - Description of default settings for Pulse systems. These are instructions
81
+ or settings that
82
+ may be good starting points for the Pulse user. The user may modify these defaults for custom
83
+ scheduling.
84
+ """
85
+
86
+ # Copy from the deprecated from qiskit.providers.models.pulsedefaults.PulseDefaults
87
+
88
+ _data = {}
89
+
90
+ def __init__(
91
+ self,
92
+ qubit_freq_est: List[float],
93
+ meas_freq_est: List[float],
94
+ buffer: int,
95
+ pulse_library: List[PulseLibraryItem],
96
+ cmd_def: List[Command],
97
+ meas_kernel: MeasurementKernel = None,
98
+ discriminator: Discriminator = None,
99
+ **kwargs: Dict[str, Any],
100
+ ):
101
+ """
102
+ Validate and reformat transport layer inputs to initialize.
103
+ Args:
104
+ qubit_freq_est: Estimated qubit frequencies in GHz.
105
+ meas_freq_est: Estimated measurement cavity frequencies in GHz.
106
+ buffer: Default buffer time (in units of dt) between pulses.
107
+ pulse_library: Pulse name and sample definitions.
108
+ cmd_def: Operation name and definition in terms of Commands.
109
+ meas_kernel: The measurement kernels
110
+ discriminator: The discriminators
111
+ **kwargs: Other attributes for the super class.
112
+ """
113
+ self._data = {}
114
+ self.buffer = buffer
115
+ self.qubit_freq_est = [freq * 1e9 for freq in qubit_freq_est]
116
+ """Qubit frequencies in Hertz."""
117
+ self.meas_freq_est = [freq * 1e9 for freq in meas_freq_est]
118
+ """Measurement frequencies in Hertz."""
119
+ self.pulse_library = pulse_library
120
+ self.cmd_def = cmd_def
121
+ self.instruction_schedule_map = InstructionScheduleMap()
122
+ self.converter = QobjToInstructionConverter(pulse_library)
123
+
124
+ for inst in cmd_def:
125
+ entry = PulseQobjDef(converter=self.converter, name=inst.name)
126
+ entry.define(inst.sequence, user_provided=False)
127
+ self.instruction_schedule_map._add(
128
+ instruction_name=inst.name,
129
+ qubits=tuple(inst.qubits),
130
+ entry=entry,
131
+ )
132
+
133
+ if meas_kernel is not None:
134
+ self.meas_kernel = meas_kernel
135
+ if discriminator is not None:
136
+ self.discriminator = discriminator
137
+
138
+ self._data.update(kwargs)
139
+
140
+ def __getattr__(self, name):
141
+ try:
142
+ return self._data[name]
143
+ except KeyError as ex:
144
+ raise AttributeError(f"Attribute {name} is not defined") from ex
145
+
146
+ def to_dict(self):
147
+ """Return a dictionary format representation of the PulseDefaults.
148
+ Returns:
149
+ dict: The dictionary form of the PulseDefaults.
150
+ """
151
+ out_dict = {
152
+ "qubit_freq_est": self.qubit_freq_est,
153
+ "meas_freq_est": self.qubit_freq_est,
154
+ "buffer": self.buffer,
155
+ "pulse_library": [x.to_dict() for x in self.pulse_library],
156
+ "cmd_def": [x.to_dict() for x in self.cmd_def],
157
+ }
158
+ if hasattr(self, "meas_kernel"):
159
+ out_dict["meas_kernel"] = self.meas_kernel.to_dict()
160
+ if hasattr(self, "discriminator"):
161
+ out_dict["discriminator"] = self.discriminator.to_dict()
162
+ for key, value in self.__dict__.items():
163
+ if key not in [
164
+ "qubit_freq_est",
165
+ "meas_freq_est",
166
+ "buffer",
167
+ "pulse_library",
168
+ "cmd_def",
169
+ "meas_kernel",
170
+ "discriminator",
171
+ "converter",
172
+ "instruction_schedule_map",
173
+ ]:
174
+ out_dict[key] = value
175
+ out_dict.update(self._data)
176
+
177
+ out_dict["qubit_freq_est"] = [freq * 1e-9 for freq in self.qubit_freq_est]
178
+ out_dict["meas_freq_est"] = [freq * 1e-9 for freq in self.meas_freq_est]
179
+ return out_dict
180
+
181
+ @classmethod
182
+ def from_dict(cls, data):
183
+ """Create a new PulseDefaults object from a dictionary.
184
+
185
+ Args:
186
+ data (dict): A dictionary representing the PulseDefaults
187
+ to create. It will be in the same format as output by
188
+ :meth:`to_dict`.
189
+ Returns:
190
+ PulseDefaults: The PulseDefaults from the input dictionary.
191
+ """
192
+ schema = {
193
+ "pulse_library": PulseLibraryItem, # The class PulseLibraryItem is deprecated
194
+ "cmd_def": Command,
195
+ "meas_kernel": MeasurementKernel,
196
+ "discriminator": Discriminator,
197
+ }
198
+
199
+ # Pulse defaults data is nested dictionary.
200
+ # To avoid deepcopy and avoid mutating the source object, create new dict here.
201
+ in_data = {}
202
+ for key, value in data.items():
203
+ if key in schema:
204
+ with warnings.catch_warnings():
205
+ # The class PulseLibraryItem is deprecated
206
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
207
+ if isinstance(value, list):
208
+ in_data[key] = list(map(schema[key].from_dict, value))
209
+ else:
210
+ in_data[key] = schema[key].from_dict(value)
211
+ else:
212
+ in_data[key] = value
213
+
214
+ return cls(**in_data)
215
+
216
+ def __str__(self):
217
+ qubit_freqs = [freq / 1e9 for freq in self.qubit_freq_est]
218
+ meas_freqs = [freq / 1e9 for freq in self.meas_freq_est]
219
+ qfreq = f"Qubit Frequencies [GHz]\n{qubit_freqs}"
220
+ mfreq = f"Measurement Frequencies [GHz]\n{meas_freqs} "
221
+ return f"<{self.__class__.__name__}({str(self.instruction_schedule_map)}{qfreq}\n{mfreq})>"
222
+
223
+
224
+ def _to_complex(value: Union[List[float], complex]) -> complex:
225
+ """Convert the input value to type ``complex``.
226
+ Args:
227
+ value: Value to be converted.
228
+ Returns:
229
+ Input value in ``complex``.
230
+ Raises:
231
+ TypeError: If the input value is not in the expected format.
232
+ """
233
+ if isinstance(value, list) and len(value) == 2:
234
+ return complex(value[0], value[1])
235
+ elif isinstance(value, complex):
236
+ return value
237
+
238
+ raise TypeError(f"{value} is not in a valid complex number format.")
239
+
240
+
241
+ class PulseLibraryItem:
242
+ """INTERNAL - An item in a pulse library."""
243
+
244
+ # Copy from the deprecated from qiskit.qobj.PulseLibraryItem
245
+ def __init__(self, name, samples):
246
+ """Instantiate a pulse library item.
247
+
248
+ Args:
249
+ name (str): A name for the pulse.
250
+ samples (list[complex]): A list of complex values defining pulse
251
+ shape.
252
+ """
253
+ self.name = name
254
+ if isinstance(samples[0], list):
255
+ self.samples = np.array([complex(sample[0], sample[1]) for sample in samples])
256
+ else:
257
+ self.samples = samples
258
+
259
+ def to_dict(self):
260
+ """Return a dictionary format representation of the pulse library item.
261
+
262
+ Returns:
263
+ dict: The dictionary form of the PulseLibraryItem.
264
+ """
265
+ return {"name": self.name, "samples": self.samples}
266
+
267
+ @classmethod
268
+ def from_dict(cls, data):
269
+ """Create a new PulseLibraryItem object from a dictionary.
270
+
271
+ Args:
272
+ data (dict): A dictionary for the experiment config
273
+
274
+ Returns:
275
+ PulseLibraryItem: The object from the input dictionary.
276
+ """
277
+ return cls(**data)
278
+
279
+ def __repr__(self):
280
+ return f"PulseLibraryItem({self.name}, {repr(self.samples)})"
281
+
282
+ def __str__(self):
283
+ return f"Pulse Library Item:\n\tname: {self.name}\n\tsamples: {self.samples}"
284
+
285
+ def __eq__(self, other):
286
+ if isinstance(other, PulseLibraryItem):
287
+ if self.to_dict() == other.to_dict():
288
+ return True
289
+ return False
290
+
291
+
292
+ class PulseQobjInstruction:
293
+ """Internal - A class representing a single instruction in a PulseQobj Experiment."""
294
+
295
+ # Copy from the deprecated from qiskit.qobj.PulseQobjInstruction
296
+
297
+ _COMMON_ATTRS = [
298
+ "ch",
299
+ "conditional",
300
+ "val",
301
+ "phase",
302
+ "frequency",
303
+ "duration",
304
+ "qubits",
305
+ "memory_slot",
306
+ "register_slot",
307
+ "label",
308
+ "type",
309
+ "pulse_shape",
310
+ "parameters",
311
+ ]
312
+
313
+ def __init__(
314
+ self,
315
+ name,
316
+ t0,
317
+ ch=None,
318
+ conditional=None,
319
+ val=None,
320
+ phase=None,
321
+ duration=None,
322
+ qubits=None,
323
+ memory_slot=None,
324
+ register_slot=None,
325
+ kernels=None,
326
+ discriminators=None,
327
+ label=None,
328
+ type=None, # pylint: disable=invalid-name,redefined-builtin
329
+ pulse_shape=None,
330
+ parameters=None,
331
+ frequency=None,
332
+ ):
333
+ """Instantiate a new PulseQobjInstruction object.
334
+
335
+ Args:
336
+ name (str): The name of the instruction
337
+ t0 (int): Pulse start time in integer **dt** units.
338
+ ch (str): The channel to apply the pulse instruction.
339
+ conditional (int): The register to use for a conditional for this
340
+ instruction
341
+ val (complex): Complex value to apply, bounded by an absolute value
342
+ of 1.
343
+ phase (float): if a ``fc`` instruction, the frame change phase in
344
+ radians.
345
+ frequency (float): if a ``sf`` instruction, the frequency in Hz.
346
+ duration (int): The duration of the pulse in **dt** units.
347
+ qubits (list): A list of ``int`` representing the qubits the
348
+ instruction operates on
349
+ memory_slot (list): If a ``measure`` instruction this is a list
350
+ of ``int`` containing the list of memory slots to store the
351
+ measurement results in (must be the same length as qubits).
352
+ If a ``bfunc`` instruction this is a single ``int`` of the
353
+ memory slot to store the boolean function result in.
354
+ register_slot (list): If a ``measure`` instruction this is a list
355
+ of ``int`` containing the list of register slots in which to
356
+ store the measurement results (must be the same length as
357
+ qubits). If a ``bfunc`` instruction this is a single ``int``
358
+ of the register slot in which to store the result.
359
+ kernels (list): List of :class:`QobjMeasurementOption` objects
360
+ defining the measurement kernels and set of parameters if the
361
+ measurement level is 1 or 2. Only used for ``acquire``
362
+ instructions.
363
+ discriminators (list): A list of :class:`QobjMeasurementOption`
364
+ used to set the discriminators to be used if the measurement
365
+ level is 2. Only used for ``acquire`` instructions.
366
+ label (str): Label of instruction
367
+ type (str): Type of instruction
368
+ pulse_shape (str): The shape of the parametric pulse
369
+ parameters (dict): The parameters for a parametric pulse
370
+ """
371
+ self.name = name
372
+ self.t0 = t0
373
+ if ch is not None:
374
+ self.ch = ch
375
+ if conditional is not None:
376
+ self.conditional = conditional
377
+ if val is not None:
378
+ self.val = val
379
+ if phase is not None:
380
+ self.phase = phase
381
+ if frequency is not None:
382
+ self.frequency = frequency
383
+ if duration is not None:
384
+ self.duration = duration
385
+ if qubits is not None:
386
+ self.qubits = qubits
387
+ if memory_slot is not None:
388
+ self.memory_slot = memory_slot
389
+ if register_slot is not None:
390
+ self.register_slot = register_slot
391
+ if kernels is not None:
392
+ self.kernels = kernels
393
+ if discriminators is not None:
394
+ self.discriminators = discriminators
395
+ if label is not None:
396
+ self.label = label
397
+ if type is not None:
398
+ self.type = type
399
+ if pulse_shape is not None:
400
+ self.pulse_shape = pulse_shape
401
+ if parameters is not None:
402
+ self.parameters = parameters
403
+
404
+ def to_dict(self):
405
+ """Return a dictionary format representation of the Instruction.
406
+
407
+ Returns:
408
+ dict: The dictionary form of the PulseQobjInstruction.
409
+ """
410
+ out_dict = {"name": self.name, "t0": self.t0}
411
+ for attr in self._COMMON_ATTRS:
412
+ if hasattr(self, attr):
413
+ out_dict[attr] = getattr(self, attr)
414
+ if hasattr(self, "kernels"):
415
+ out_dict["kernels"] = [x.to_dict() for x in self.kernels]
416
+ if hasattr(self, "discriminators"):
417
+ out_dict["discriminators"] = [x.to_dict() for x in self.discriminators]
418
+ return out_dict
419
+
420
+ def __repr__(self):
421
+ out = f'PulseQobjInstruction(name="{self.name}", t0={self.t0}'
422
+ for attr in self._COMMON_ATTRS:
423
+ attr_val = getattr(self, attr, None)
424
+ if attr_val is not None:
425
+ if isinstance(attr_val, str):
426
+ out += f', {attr}="{attr_val}"'
427
+ else:
428
+ out += f", {attr}={attr_val}"
429
+ out += ")"
430
+ return out
431
+
432
+ def __str__(self):
433
+ out = f"Instruction: {self.name}\n"
434
+ out += f"\t\tt0: {self.t0}\n"
435
+ for attr in self._COMMON_ATTRS:
436
+ if hasattr(self, attr):
437
+ out += f"\t\t{attr}: {getattr(self, attr)}\n"
438
+ return out
439
+
440
+ @classmethod
441
+ def from_dict(cls, data):
442
+ """Create a new PulseQobjExperimentConfig object from a dictionary.
443
+
444
+ Args:
445
+ data (dict): A dictionary for the experiment config
446
+
447
+ Returns:
448
+ PulseQobjInstruction: The object from the input dictionary.
449
+ """
450
+ schema = {
451
+ "discriminators": QobjMeasurementOption,
452
+ "kernels": QobjMeasurementOption,
453
+ }
454
+ skip = ["t0", "name"]
455
+
456
+ # Pulse instruction data is nested dictionary.
457
+ # To avoid deepcopy and avoid mutating the source object, create new dict here.
458
+ in_data = {}
459
+ for key, value in data.items():
460
+ if key in skip:
461
+ continue
462
+ if key == "parameters":
463
+ # This is flat dictionary of parametric pulse parameters
464
+ formatted_value = value.copy()
465
+ if "amp" in formatted_value:
466
+ formatted_value["amp"] = _to_complex(formatted_value["amp"])
467
+ in_data[key] = formatted_value
468
+ continue
469
+ if key in schema:
470
+ if isinstance(value, list):
471
+ in_data[key] = list(map(schema[key].from_dict, value))
472
+ else:
473
+ in_data[key] = schema[key].from_dict(value)
474
+ else:
475
+ in_data[key] = value
476
+
477
+ return cls(data["name"], data["t0"], **in_data)
478
+
479
+ def __eq__(self, other):
480
+ if isinstance(other, PulseQobjInstruction):
481
+ if self.to_dict() == other.to_dict():
482
+ return True
483
+ return False
484
+
485
+
486
+ def _pulse_library():
487
+ # The number of samples determines the pulse durations of the corresponding
488
+ # instructions. This default defines pulses with durations in multiples of
489
+ # 16 dt for consistency with the pulse granularity of real IBM devices, but
490
+ # keeps the number smaller than what would be realistic for
491
+ # manageability. If needed, more realistic durations could be added in the
492
+ # future (order of 160dt for 1q gates, 1760dt for 2q gates and measure).
493
+ return [
494
+ PulseLibraryItem(
495
+ name="pulse_1", samples=np.linspace(0, 1.0, 16, dtype=np.complex128)
496
+ ), # 16dt
497
+ PulseLibraryItem(
498
+ name="pulse_2", samples=np.linspace(0, 1.0, 32, dtype=np.complex128)
499
+ ), # 32dt
500
+ PulseLibraryItem(
501
+ name="pulse_3", samples=np.linspace(0, 1.0, 64, dtype=np.complex128)
502
+ ), # 64dt
503
+ ]
504
+
505
+
506
+ class GenericBackendV2(BackendV2):
507
+ """Generic :class:`~.BackendV2` implementation with a configurable constructor. This class will
508
+ return a :class:`~.BackendV2` instance that runs on a local simulator (in the spirit of fake
509
+ backends) and contains all the necessary information to test backend-interfacing components, such
510
+ as the transpiler. A :class:`.GenericBackendV2` instance can be constructed from as little as a
511
+ specified ``num_qubits``, but users can additionally configure the basis gates, coupling map,
512
+ ability to run dynamic circuits (control flow instructions), instruction calibrations and dtm.
513
+ The remainder of the backend properties are generated by randomly sampling
514
+ from default ranges extracted from historical IBM backend data. The seed for this random
515
+ generation can be fixed to ensure the reproducibility of the backend output.
516
+ This backend only supports gates in the standard library, if you need a more flexible backend,
517
+ there is always the option to directly instantiate a :class:`.Target` object to use for
518
+ transpilation.
519
+ """
520
+
521
+ def __init__(
522
+ self,
523
+ num_qubits: int,
524
+ basis_gates: list[str] | None = None,
525
+ *,
526
+ coupling_map: list[list[int]] | CouplingMap | None = None,
527
+ control_flow: bool = False,
528
+ calibrate_instructions: bool | InstructionScheduleMap | None = None,
529
+ dtm: float | None = None,
530
+ seed: int | None = None,
531
+ pulse_channels: bool = True,
532
+ noise_info: bool = True,
533
+ ):
534
+ """
535
+ Args:
536
+ num_qubits: Number of qubits that will be used to construct the backend's target.
537
+ Note that, while there is no limit in the size of the target that can be
538
+ constructed, this backend runs on local noisy simulators, and these might
539
+ present limitations in the number of qubits that can be simulated.
540
+
541
+ basis_gates: List of basis gate names to be supported by
542
+ the target. These must be part of the standard qiskit circuit library.
543
+ The default set of basis gates is ``["id", "rz", "sx", "x", "cx"]``
544
+ The ``"reset"``, ``"delay"``, and ``"measure"`` instructions are
545
+ always supported by default, even if not specified via ``basis_gates``.
546
+
547
+ coupling_map: Optional coupling map
548
+ for the backend. Multiple formats are supported:
549
+
550
+ #. :class:`~.CouplingMap` instance
551
+ #. List, must be given as an edge list representing the two qubit interactions
552
+ supported by the backend, for example:
553
+ ``[[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3]]``
554
+
555
+ If ``coupling_map`` is specified, it must match the number of qubits
556
+ specified in ``num_qubits``. If ``coupling_map`` is not specified,
557
+ a fully connected coupling map will be generated with ``num_qubits``
558
+ qubits.
559
+
560
+ control_flow: Flag to enable control flow directives on the target
561
+ (defaults to False).
562
+
563
+ calibrate_instructions: Instruction calibration settings, this argument
564
+ supports both boolean and :class:`.InstructionScheduleMap` as
565
+ input types, and is ``None`` by default:
566
+
567
+ #. If ``calibrate_instructions==None``, no calibrations will be added to the target.
568
+ #. If ``calibrate_instructions==True``, all gates will be calibrated for all
569
+ qubits using the default pulse schedules generated internally.
570
+ #. If ``calibrate_instructions==False``, all gates will be "calibrated" for
571
+ all qubits with an empty pulse schedule.
572
+ #. If an :class:`.InstructionScheduleMap` instance is given, the calibrations
573
+ in this instruction schedule map will be appended to the target
574
+ instead of the default pulse schedules (this allows for custom calibrations).
575
+
576
+ dtm: System time resolution of output signals in nanoseconds.
577
+ None by default.
578
+
579
+ seed: Optional seed for generation of default values.
580
+
581
+ pulse_channels: If true, sets default pulse channel information on the backend.
582
+
583
+ noise_info: If true, associates gates and qubits with default noise information.
584
+ """
585
+
586
+ super().__init__(
587
+ provider=None,
588
+ name=f"generic_backend_{num_qubits}q",
589
+ description=f"This is a device with {num_qubits} qubits and generic settings.",
590
+ backend_version="",
591
+ )
592
+
593
+ self._sim = None
594
+ self._rng = np.random.default_rng(seed=seed)
595
+ self._dtm = dtm
596
+ self._num_qubits = num_qubits
597
+ self._control_flow = control_flow
598
+ self._calibrate_instructions = calibrate_instructions
599
+ self._supported_gates = get_standard_gate_name_mapping()
600
+ self._noise_info = noise_info
601
+
602
+ if calibrate_instructions and not noise_info:
603
+ raise QiskitError("Must set parameter noise_info when calibrating instructions.")
604
+
605
+ if coupling_map is None:
606
+ self._coupling_map = CouplingMap().from_full(num_qubits)
607
+ else:
608
+ if isinstance(coupling_map, CouplingMap):
609
+ self._coupling_map = coupling_map
610
+ else:
611
+ self._coupling_map = CouplingMap(coupling_map)
612
+
613
+ if num_qubits != self._coupling_map.size():
614
+ raise QiskitError(
615
+ f"The number of qubits (got {num_qubits}) must match "
616
+ f"the size of the provided coupling map (got {self._coupling_map.size()})."
617
+ )
618
+
619
+ self._basis_gates = (
620
+ basis_gates if basis_gates is not None else ["cx", "id", "rz", "sx", "x"]
621
+ )
622
+ for name in ["reset", "delay", "measure"]:
623
+ if name not in self._basis_gates:
624
+ self._basis_gates.append(name)
625
+
626
+ self._build_generic_target()
627
+ if pulse_channels:
628
+ self._build_default_channels()
629
+ else:
630
+ self.channels_map = {}
631
+
632
+ @property
633
+ def target(self):
634
+ return self._target
635
+
636
+ @property
637
+ def max_circuits(self):
638
+ return None
639
+
640
+ @property
641
+ def dtm(self) -> float:
642
+ """Return the system time resolution of output signals"""
643
+ # converting `dtm` from nanoseconds to seconds
644
+ return self._dtm * 1e-9 if self._dtm is not None else None
645
+
646
+ @property
647
+ def meas_map(self) -> list[list[int]]:
648
+ return self._target.concurrent_measurements
649
+
650
+ def _build_default_channels(self) -> None:
651
+ channels_map = {
652
+ "acquire": {(i,): [pulse.AcquireChannel(i)] for i in range(self.num_qubits)},
653
+ "drive": {(i,): [pulse.DriveChannel(i)] for i in range(self.num_qubits)},
654
+ "measure": {(i,): [pulse.MeasureChannel(i)] for i in range(self.num_qubits)},
655
+ "control": {
656
+ (edge): [pulse.ControlChannel(i)] for i, edge in enumerate(self._coupling_map)
657
+ },
658
+ }
659
+ setattr(self, "channels_map", channels_map)
660
+
661
+ def _get_noise_defaults(self, name: str, num_qubits: int) -> tuple:
662
+ """Return noise default values/ranges for duration and error of supported
663
+ instructions. There are two possible formats:
664
+ - (min_duration, max_duration, min_error, max_error),
665
+ if the defaults are ranges.
666
+ - (duration, error), if the defaults are fixed values.
667
+ """
668
+ if name in _NOISE_DEFAULTS:
669
+ return _NOISE_DEFAULTS[name]
670
+ if num_qubits == 1:
671
+ return _NOISE_DEFAULTS_FALLBACK["1-q"]
672
+ return _NOISE_DEFAULTS_FALLBACK["multi-q"]
673
+
674
+ def _get_calibration_sequence(
675
+ self, inst: str, num_qubits: int, qargs: tuple[int]
676
+ ) -> list[PulseQobjInstruction]:
677
+ """Return calibration pulse sequence for given instruction (defined by name and num_qubits)
678
+ acting on qargs.
679
+ """
680
+
681
+ pulse_library = _pulse_library()
682
+ # Note that the calibration pulses are different for
683
+ # 1q gates vs 2q gates vs measurement instructions.
684
+ if inst == "measure":
685
+ with warnings.catch_warnings():
686
+ # The class PulseQobjInstruction is deprecated
687
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
688
+ sequence = [
689
+ PulseQobjInstruction(
690
+ name="acquire",
691
+ duration=1792,
692
+ t0=0,
693
+ qubits=qargs,
694
+ memory_slot=qargs,
695
+ )
696
+ ] + [
697
+ PulseQobjInstruction(name=pulse_library[1].name, ch=f"m{i}", t0=0)
698
+ for i in qargs
699
+ ]
700
+ return sequence
701
+ with warnings.catch_warnings():
702
+ # The class PulseQobjInstruction is deprecated
703
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
704
+ if num_qubits == 1:
705
+ return [
706
+ PulseQobjInstruction(name="fc", ch=f"u{qargs[0]}", t0=0, phase="-P0"),
707
+ PulseQobjInstruction(name=pulse_library[0].name, ch=f"d{qargs[0]}", t0=0),
708
+ ]
709
+ return [
710
+ PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[0]}", t0=0),
711
+ PulseQobjInstruction(name=pulse_library[2].name, ch=f"u{qargs[0]}", t0=0),
712
+ PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[1]}", t0=0),
713
+ PulseQobjInstruction(name="fc", ch=f"d{qargs[1]}", t0=0, phase=2.1),
714
+ ]
715
+
716
+ def _generate_calibration_defaults(self) -> PulseDefaults:
717
+ """Generate pulse calibration defaults as specified with `self._calibrate_instructions`.
718
+ If `self._calibrate_instructions` is True, the pulse schedules will be generated from
719
+ a series of default calibration sequences. If `self._calibrate_instructions` is False,
720
+ the pulse schedules will contain empty calibration sequences, but still be generated and
721
+ added to the target.
722
+ """
723
+
724
+ # If self._calibrate_instructions==True, this method
725
+ # will generate default pulse schedules for all gates in self._basis_gates,
726
+ # except for `delay` and `reset`.
727
+ calibration_buffer = self._basis_gates.copy()
728
+ for inst in ["delay", "reset"]:
729
+ calibration_buffer.remove(inst)
730
+
731
+ # List of calibration commands (generated from sequences of PulseQobjInstructions)
732
+ # corresponding to each calibrated instruction. Note that the calibration pulses
733
+ # are different for 1q gates vs 2q gates vs measurement instructions.
734
+ cmd_def = []
735
+ for inst in calibration_buffer:
736
+ num_qubits = self._supported_gates[inst].num_qubits
737
+ qarg_set = self._coupling_map if num_qubits > 1 else list(range(self.num_qubits))
738
+ if inst == "measure":
739
+ cmd_def.append(
740
+ Command(
741
+ name=inst,
742
+ qubits=qarg_set,
743
+ sequence=(
744
+ self._get_calibration_sequence(inst, num_qubits, qarg_set)
745
+ if self._calibrate_instructions
746
+ else []
747
+ ),
748
+ )
749
+ )
750
+ else:
751
+ for qarg in qarg_set:
752
+ qubits = [qarg] if num_qubits == 1 else qarg
753
+ cmd_def.append(
754
+ Command(
755
+ name=inst,
756
+ qubits=qubits,
757
+ sequence=(
758
+ self._get_calibration_sequence(inst, num_qubits, qubits)
759
+ if self._calibrate_instructions
760
+ else []
761
+ ),
762
+ )
763
+ )
764
+
765
+ qubit_freq_est = np.random.normal(4.8, scale=0.01, size=self.num_qubits).tolist()
766
+ meas_freq_est = np.linspace(6.4, 6.6, self.num_qubits).tolist()
767
+ return PulseDefaults(
768
+ qubit_freq_est=qubit_freq_est,
769
+ meas_freq_est=meas_freq_est,
770
+ buffer=0,
771
+ pulse_library=_pulse_library(),
772
+ cmd_def=cmd_def,
773
+ )
774
+
775
+ def _build_generic_target(self):
776
+ """This method generates a :class:`~.Target` instance with
777
+ default qubit, instruction and calibration properties.
778
+ """
779
+ # the qubit properties are sampled from default ranges
780
+ properties = _QUBIT_PROPERTIES
781
+ if not self._noise_info:
782
+ self._target = Target(
783
+ description=f"Generic Target with {self._num_qubits} qubits",
784
+ num_qubits=self._num_qubits,
785
+ dt=properties["dt"],
786
+ qubit_properties=None,
787
+ concurrent_measurements=[list(range(self._num_qubits))],
788
+ )
789
+ else:
790
+ self._target = Target(
791
+ description=f"Generic Target with {self._num_qubits} qubits",
792
+ num_qubits=self._num_qubits,
793
+ dt=properties["dt"],
794
+ qubit_properties=[
795
+ QubitProperties(
796
+ t1=self._rng.uniform(properties["t1"][0], properties["t1"][1]),
797
+ t2=self._rng.uniform(properties["t2"][0], properties["t2"][1]),
798
+ frequency=self._rng.uniform(
799
+ properties["frequency"][0], properties["frequency"][1]
800
+ ),
801
+ )
802
+ for _ in range(self._num_qubits)
803
+ ],
804
+ concurrent_measurements=[list(range(self._num_qubits))],
805
+ )
806
+
807
+ # Generate instruction schedule map with calibrations to add to target.
808
+ calibration_inst_map = None
809
+ if self._calibrate_instructions is not None:
810
+ if isinstance(self._calibrate_instructions, InstructionScheduleMap):
811
+ calibration_inst_map = self._calibrate_instructions
812
+ else:
813
+ defaults = self._generate_calibration_defaults()
814
+ calibration_inst_map = defaults.instruction_schedule_map
815
+
816
+ # Iterate over gates, generate noise params from defaults,
817
+ # and add instructions, noise and calibrations to target.
818
+ for name in self._basis_gates:
819
+ if name not in self._supported_gates:
820
+ raise QiskitError(
821
+ f"Provided basis gate {name} is not an instruction "
822
+ f"in the standard qiskit circuit library."
823
+ )
824
+ gate = self._supported_gates[name]
825
+ if self.num_qubits < gate.num_qubits:
826
+ raise QiskitError(
827
+ f"Provided basis gate {name} needs more qubits than {self.num_qubits}, "
828
+ f"which is the size of the backend."
829
+ )
830
+ if self._noise_info:
831
+ noise_params = self._get_noise_defaults(name, gate.num_qubits)
832
+ self._add_noisy_instruction_to_target(gate, noise_params, calibration_inst_map)
833
+ else:
834
+ qarg_set = self._coupling_map if gate.num_qubits > 1 else range(self.num_qubits)
835
+ props = {(qarg,) if isinstance(qarg, int) else qarg: None for qarg in qarg_set}
836
+ self._target.add_instruction(gate, properties=props, name=name)
837
+
838
+ if self._control_flow:
839
+ self._target.add_instruction(IfElseOp, name="if_else")
840
+ self._target.add_instruction(WhileLoopOp, name="while_loop")
841
+ self._target.add_instruction(ForLoopOp, name="for_loop")
842
+ self._target.add_instruction(SwitchCaseOp, name="switch_case")
843
+ self._target.add_instruction(BreakLoopOp, name="break")
844
+ self._target.add_instruction(ContinueLoopOp, name="continue")
845
+
846
+ def _add_noisy_instruction_to_target(
847
+ self,
848
+ instruction: Instruction,
849
+ noise_params: tuple[float, ...] | None,
850
+ calibration_inst_map: InstructionScheduleMap | None,
851
+ ) -> None:
852
+ """Add instruction properties to target for specified instruction.
853
+
854
+ Args:
855
+ instruction: Instance of instruction to be added to the target
856
+ noise_params: Error and duration noise values/ranges to
857
+ include in instruction properties.
858
+ calibration_inst_map: Instruction schedule map with calibration defaults
859
+ """
860
+ qarg_set = self._coupling_map if instruction.num_qubits > 1 else range(self.num_qubits)
861
+ props = {}
862
+ for qarg in qarg_set:
863
+ try:
864
+ qargs = tuple(qarg)
865
+ except TypeError:
866
+ qargs = (qarg,)
867
+ duration, error = (
868
+ noise_params
869
+ if len(noise_params) == 2
870
+ else (self._rng.uniform(*noise_params[:2]), self._rng.uniform(*noise_params[2:]))
871
+ )
872
+ if (
873
+ calibration_inst_map is not None
874
+ and instruction.name not in ["reset", "delay"]
875
+ and qarg in calibration_inst_map.qubits_with_instruction(instruction.name)
876
+ ):
877
+ # Do NOT call .get method. This parses Qobj immediately.
878
+ # This operation is computationally expensive and should be bypassed.
879
+ calibration_entry = calibration_inst_map._get_calibration_entry(
880
+ instruction.name, qargs
881
+ )
882
+ else:
883
+ calibration_entry = None
884
+ if duration is not None and len(noise_params) > 2:
885
+ # Ensure exact conversion of duration from seconds to dt
886
+ dt = _QUBIT_PROPERTIES["dt"]
887
+ rounded_duration = round(duration / dt) * dt
888
+ # Clamp rounded duration to be between min and max values
889
+ duration = max(noise_params[0], min(rounded_duration, noise_params[1]))
890
+ props.update({qargs: InstructionProperties(duration, error, calibration_entry)})
891
+ self._target.add_instruction(instruction, props)
892
+
893
+ # The "measure" instruction calibrations need to be added qubit by qubit, once the
894
+ # instruction has been added to the target.
895
+ if calibration_inst_map is not None and instruction.name == "measure":
896
+ for qarg in calibration_inst_map.qubits_with_instruction(instruction.name):
897
+ try:
898
+ qargs = tuple(qarg)
899
+ except TypeError:
900
+ qargs = (qarg,)
901
+ # Do NOT call .get method. This parses Qobj immediately.
902
+ # This operation is computationally expensive and should be bypassed.
903
+ calibration_entry = calibration_inst_map._get_calibration_entry(
904
+ instruction.name, qargs
905
+ )
906
+ for qubit in qargs:
907
+ if qubit < self.num_qubits:
908
+ self._target[instruction.name][(qubit,)].calibration = calibration_entry
909
+
910
+ def run(self, run_input, **options):
911
+ """Run on the backend using a simulator.
912
+
913
+ This method runs circuit jobs (an individual or a list of :class:`~.QuantumCircuit`
914
+ ) and pulse jobs (an individual or a list of :class:`~.Schedule` or
915
+ :class:`~.ScheduleBlock`) using :class:`~.BasicSimulator` or Aer simulator and returns a
916
+ :class:`~qiskit.providers.Job` object.
917
+
918
+ If qiskit-aer is installed, jobs will be run using the ``AerSimulator`` with
919
+ noise model of the backend. Otherwise, jobs will be run using the
920
+ ``BasicSimulator`` simulator without noise.
921
+
922
+ Noisy simulations of pulse jobs are not yet supported in :class:`~.GenericBackendV2`.
923
+
924
+ Args:
925
+ run_input (QuantumCircuit or Schedule or ScheduleBlock or list): An
926
+ individual or a list of
927
+ :class:`~qiskit.circuit.QuantumCircuit`,
928
+ :class:`~qiskit.pulse.ScheduleBlock`, or
929
+ :class:`~qiskit.pulse.Schedule` objects to run on the backend.
930
+ options: Any kwarg options to pass to the backend for running the
931
+ config. If a key is also present in the options
932
+ attribute/object, then the expectation is that the value
933
+ specified will be used instead of what's set in the options
934
+ object.
935
+
936
+ Returns:
937
+ Job: The job object for the run
938
+
939
+ Raises:
940
+ QiskitError: If a pulse job is supplied and qiskit_aer is not installed.
941
+ """
942
+ circuits = run_input
943
+ pulse_job = None
944
+ if isinstance(circuits, (pulse.Schedule, pulse.ScheduleBlock)):
945
+ pulse_job = True
946
+ elif isinstance(circuits, QuantumCircuit):
947
+ pulse_job = False
948
+ elif isinstance(circuits, list):
949
+ if circuits:
950
+ if all(isinstance(x, (pulse.Schedule, pulse.ScheduleBlock)) for x in circuits):
951
+ pulse_job = True
952
+ elif all(isinstance(x, QuantumCircuit) for x in circuits):
953
+ pulse_job = False
954
+ if pulse_job is None: # submitted job is invalid
955
+ raise QiskitError(
956
+ f"Invalid input object {circuits}, must be either a "
957
+ "QuantumCircuit, Schedule, or a list of either"
958
+ )
959
+ if pulse_job: # pulse job
960
+ raise QiskitError("Pulse simulation is currently not supported for V2 backends.")
961
+ # circuit job
962
+ if not _optionals.HAS_AER:
963
+ warnings.warn("Aer not found using BasicSimulator and no noise", RuntimeWarning)
964
+ if self._sim is None:
965
+ self._setup_sim()
966
+ self._sim._options = self._options
967
+ job = self._sim.run(circuits, **options)
968
+ return job
969
+
970
+ def _setup_sim(self) -> None:
971
+ if _optionals.HAS_AER:
972
+ from qiskit_aer import AerSimulator
973
+ from qiskit_aer.noise import NoiseModel
974
+
975
+ self._sim = AerSimulator()
976
+ noise_model = NoiseModel.from_backend(self)
977
+ self._sim.set_options(noise_model=noise_model)
978
+ # Update backend default too to avoid overwriting
979
+ # it when run() is called
980
+ self.set_options(noise_model=noise_model)
981
+ else:
982
+ self._sim = BasicSimulator()
983
+
984
+ @classmethod
985
+ def _default_options(cls) -> Options:
986
+ if _optionals.HAS_AER:
987
+ from qiskit_aer import AerSimulator
988
+
989
+ return AerSimulator._default_options()
990
+ else:
991
+ return BasicSimulator._default_options()
992
+
993
+ def drive_channel(self, qubit: int):
994
+ drive_channels_map = getattr(self, "channels_map", {}).get("drive", {})
995
+ qubits = (qubit,)
996
+ if qubits in drive_channels_map:
997
+ return drive_channels_map[qubits][0]
998
+ return None
999
+
1000
+ def measure_channel(self, qubit: int):
1001
+ measure_channels_map = getattr(self, "channels_map", {}).get("measure", {})
1002
+ qubits = (qubit,)
1003
+ if qubits in measure_channels_map:
1004
+ return measure_channels_map[qubits][0]
1005
+ return None
1006
+
1007
+ def acquire_channel(self, qubit: int):
1008
+ acquire_channels_map = getattr(self, "channels_map", {}).get("acquire", {})
1009
+ qubits = (qubit,)
1010
+ if qubits in acquire_channels_map:
1011
+ return acquire_channels_map[qubits][0]
1012
+ return None
1013
+
1014
+ def control_channel(self, qubits: Iterable[int]):
1015
+ control_channels_map = getattr(self, "channels_map", {}).get("control", {})
1016
+ qubits = tuple(qubits)
1017
+ if qubits in control_channels_map:
1018
+ return control_channels_map[qubits]
1019
+ return []