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,811 @@
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
+
52
+ from .basic_provider_job import BasicProviderJob
53
+ from .basic_provider_tools import single_gate_matrix
54
+ from .basic_provider_tools import (
55
+ SINGLE_QUBIT_GATES,
56
+ TWO_QUBIT_GATES,
57
+ TWO_QUBIT_GATES_WITH_PARAMETERS,
58
+ THREE_QUBIT_GATES,
59
+ )
60
+ from .basic_provider_tools import einsum_vecmul_index
61
+ from .exceptions import BasicProviderError
62
+
63
+ logger = logging.getLogger(__name__)
64
+
65
+
66
+ class BasicSimulator(BackendV2):
67
+ """Python implementation of a basic (non-efficient) quantum simulator."""
68
+
69
+ # Formerly calculated as `int(log2(local_hardware_info()["memory"]*(1024**3)/16))`.
70
+ # After the removal of `local_hardware_info()`, it's hardcoded to 24 qubits,
71
+ # which matches the ~268 MB of required memory.
72
+ MAX_QUBITS_MEMORY = 24
73
+
74
+ def __init__(
75
+ self,
76
+ provider: Provider | None = None,
77
+ target: Target | None = None,
78
+ **fields,
79
+ ) -> None:
80
+ """
81
+ Args:
82
+ provider: An optional backwards reference to the
83
+ :class:`~qiskit.providers.Provider` object that the backend
84
+ is from.
85
+ target: An optional target to configure the simulator.
86
+ fields: kwargs for the values to use to override the default
87
+ options.
88
+
89
+ Raises:
90
+ AttributeError: If a field is specified that's outside the backend's
91
+ options.
92
+ """
93
+
94
+ super().__init__(
95
+ provider=provider,
96
+ name="basic_simulator",
97
+ description="A python simulator for quantum experiments",
98
+ backend_version="0.1",
99
+ **fields,
100
+ )
101
+
102
+ self._target = target
103
+ self._configuration = None
104
+
105
+ # Internal simulator variables
106
+ self._local_random = None
107
+ self._classical_memory = 0
108
+ self._classical_register = 0
109
+ self._statevector = 0
110
+ self._number_of_cmembits = 0
111
+ self._number_of_qubits = 0
112
+ self._shots = 0
113
+ self._memory = False
114
+ self._initial_statevector = self.options.get("initial_statevector")
115
+ self._chop_threshold = self.options.get("chop_threashold")
116
+ self._qobj_config = None
117
+ self._sample_measure = False
118
+
119
+ @property
120
+ def max_circuits(self) -> None:
121
+ return None
122
+
123
+ @property
124
+ def target(self) -> Target:
125
+ if not self._target:
126
+ self._target = self._build_basic_target()
127
+ return self._target
128
+
129
+ def _build_basic_target(self) -> Target:
130
+ """Helper method that returns a minimal target with a basis gate set but
131
+ no coupling map, instruction properties or calibrations.
132
+
133
+ Returns:
134
+ The configured target.
135
+ """
136
+ # Set num_qubits to None to signal the transpiler not to
137
+ # resize the circuit to fit a specific (potentially too large)
138
+ # number of qubits. The number of qubits in the circuits given to the
139
+ # `run` method will determine the size of the simulated statevector.
140
+ target = Target(
141
+ description="Basic Target",
142
+ num_qubits=None,
143
+ )
144
+ basis_gates = [
145
+ "ccx",
146
+ "ccz",
147
+ "ch",
148
+ "cp",
149
+ "crx",
150
+ "cry",
151
+ "crz",
152
+ "cs",
153
+ "csdg",
154
+ "cswap",
155
+ "csx",
156
+ "cu",
157
+ "cu1",
158
+ "cu3",
159
+ "cx",
160
+ "cy",
161
+ "cz",
162
+ "dcx",
163
+ "delay",
164
+ "ecr",
165
+ "global_phase",
166
+ "h",
167
+ "id",
168
+ "iswap",
169
+ "measure",
170
+ "p",
171
+ "r",
172
+ "rccx",
173
+ "reset",
174
+ "rx",
175
+ "rxx",
176
+ "ry",
177
+ "ryy",
178
+ "rz",
179
+ "rzx",
180
+ "rzz",
181
+ "s",
182
+ "sdg",
183
+ "swap",
184
+ "sx",
185
+ "sxdg",
186
+ "t",
187
+ "tdg",
188
+ "u",
189
+ "u1",
190
+ "u2",
191
+ "u3",
192
+ "unitary",
193
+ "x",
194
+ "xx_minus_yy",
195
+ "xx_plus_yy",
196
+ "y",
197
+ "z",
198
+ ]
199
+ inst_mapping = get_standard_gate_name_mapping()
200
+ for name in basis_gates:
201
+ if name in inst_mapping:
202
+ instruction = inst_mapping[name]
203
+ target.add_instruction(instruction, properties=None, name=name)
204
+ elif name == "unitary":
205
+ # This is a placeholder for a UnitaryGate instance,
206
+ # to signal the transpiler not to decompose unitaries
207
+ # in the circuit.
208
+ target.add_instruction(UnitaryGate, name="unitary")
209
+ else:
210
+ raise BasicProviderError(
211
+ f"Gate is not a valid basis gate for this simulator: {name}"
212
+ )
213
+ return target
214
+
215
+ def configuration(self) -> BackendConfiguration:
216
+ """Return the simulator backend configuration.
217
+
218
+ Returns:
219
+ The configuration for the backend.
220
+ """
221
+ # Note: this is a custom attribute of the BasicSimulator class and
222
+ # not part of the BackendV2 interface. It has only been added for
223
+ # compatibility with the `assemble` function (currently used in `run`),
224
+ # which still relies on legacy BackendV1 attributes. Once the internal
225
+ # use of `assemble` is resolved, this attribute will no longer be
226
+ # necessary.
227
+
228
+ if self._configuration:
229
+ return self._configuration
230
+
231
+ gates = [
232
+ {
233
+ "name": name,
234
+ "parameters": self.target.operation_from_name(name).params,
235
+ }
236
+ for name in self.target.operation_names
237
+ ]
238
+
239
+ with warnings.catch_warnings():
240
+ # TODO Provider models are deprecated
241
+ # https://github.com/Qiskit/qiskit/issues/12843
242
+ warnings.filterwarnings(
243
+ "ignore",
244
+ category=DeprecationWarning,
245
+ message=r".+qiskit\.providers\.models\.backendconfiguration\..+",
246
+ )
247
+ self._configuration = BackendConfiguration(
248
+ backend_name=self.name,
249
+ backend_version=self.backend_version,
250
+ n_qubits=self.num_qubits,
251
+ basis_gates=self.target.operation_names,
252
+ gates=gates,
253
+ local=True,
254
+ simulator=True,
255
+ conditional=True,
256
+ open_pulse=False,
257
+ memory=True,
258
+ # This max_shots is used by the assembler, setting it to 0
259
+ # to maintain the behavior from the previous implementation.
260
+ # Not related to the actual shots set in the backend options
261
+ max_shots=0,
262
+ coupling_map=None,
263
+ description="A python simulator for quantum experiments",
264
+ )
265
+ return self._configuration
266
+
267
+ @classmethod
268
+ def _default_options(cls) -> Options:
269
+ return Options(
270
+ shots=1024,
271
+ memory=False,
272
+ initial_statevector=None,
273
+ chop_threshold=1e-15,
274
+ allow_sample_measuring=True,
275
+ seed_simulator=None,
276
+ parameter_binds=None,
277
+ )
278
+
279
+ def _add_unitary(self, gate: np.ndarray, qubits: list[int]) -> None:
280
+ """Apply an N-qubit unitary matrix.
281
+
282
+ Args:
283
+ gate (matrix_like): an N-qubit unitary matrix
284
+ qubits (list): the list of N-qubits.
285
+ """
286
+ # Get the number of qubits
287
+ num_qubits = len(qubits)
288
+ # Compute einsum index string for 1-qubit matrix multiplication
289
+ indexes = einsum_vecmul_index(qubits, self._number_of_qubits)
290
+ # Convert to complex rank-2N tensor
291
+ gate_tensor = np.reshape(np.array(gate, dtype=complex), num_qubits * [2, 2])
292
+ # Apply matrix multiplication
293
+ self._statevector = np.einsum(
294
+ indexes, gate_tensor, self._statevector, dtype=complex, casting="no"
295
+ )
296
+
297
+ def _get_measure_outcome(self, qubit: int) -> tuple[str, int]:
298
+ """Simulate the outcome of measurement of a qubit.
299
+
300
+ Args:
301
+ qubit: the qubit to measure
302
+
303
+ Return:
304
+ pair (outcome, probability) where outcome is '0' or '1' and
305
+ probability is the probability of the returned outcome.
306
+ """
307
+ # Axis for numpy.sum to compute probabilities
308
+ axis = list(range(self._number_of_qubits))
309
+ axis.remove(self._number_of_qubits - 1 - qubit)
310
+ probabilities = np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis))
311
+ # Compute einsum index string for 1-qubit matrix multiplication
312
+ random_number = self._local_random.random()
313
+ if random_number < probabilities[0]:
314
+ return "0", probabilities[0]
315
+ # Else outcome was '1'
316
+ return "1", probabilities[1]
317
+
318
+ def _add_sample_measure(
319
+ self, measure_params: list[list[int, int]], num_samples: int
320
+ ) -> list[hex]:
321
+ """Generate memory samples from current statevector.
322
+
323
+ Args:
324
+ measure_params: List of (qubit, cmembit) values for
325
+ measure instructions to sample.
326
+ num_samples: The number of memory samples to generate.
327
+
328
+ Returns:
329
+ A list of memory values in hex format.
330
+ """
331
+ # Get unique qubits that are actually measured and sort in
332
+ # ascending order
333
+ measured_qubits = sorted({qubit for qubit, cmembit in measure_params})
334
+ num_measured = len(measured_qubits)
335
+ # We use the axis kwarg for numpy.sum to compute probabilities
336
+ # this sums over all non-measured qubits to return a vector
337
+ # of measure probabilities for the measured qubits
338
+ axis = list(range(self._number_of_qubits))
339
+ for qubit in reversed(measured_qubits):
340
+ # Remove from largest qubit to smallest so list position is correct
341
+ # with respect to position from end of the list
342
+ axis.remove(self._number_of_qubits - 1 - qubit)
343
+ probabilities = np.reshape(
344
+ np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis)), 2**num_measured
345
+ )
346
+ # Generate samples on measured qubits as ints with qubit
347
+ # position in the bit-string for each int given by the qubit
348
+ # position in the sorted measured_qubits list
349
+ samples = self._local_random.choice(range(2**num_measured), num_samples, p=probabilities)
350
+ # Convert the ints to bitstrings
351
+ memory = []
352
+ for sample in samples:
353
+ classical_memory = self._classical_memory
354
+ for qubit, cmembit in measure_params:
355
+ pos = measured_qubits.index(qubit)
356
+ qubit_outcome = int((sample & (1 << pos)) >> pos)
357
+ membit = 1 << cmembit
358
+ classical_memory = (classical_memory & (~membit)) | (qubit_outcome << cmembit)
359
+ value = bin(classical_memory)[2:]
360
+ memory.append(hex(int(value, 2)))
361
+ return memory
362
+
363
+ def _add_measure(self, qubit: int, cmembit: int, cregbit: int | None = None) -> None:
364
+ """Apply a measure instruction to a qubit.
365
+
366
+ Args:
367
+ qubit: qubit is the qubit measured.
368
+ cmembit: is the classical memory bit to store outcome in.
369
+ cregbit: is the classical register bit to store outcome in.
370
+ """
371
+ # get measure outcome
372
+ outcome, probability = self._get_measure_outcome(qubit)
373
+ # update classical state
374
+ membit = 1 << cmembit
375
+ self._classical_memory = (self._classical_memory & (~membit)) | (int(outcome) << cmembit)
376
+
377
+ if cregbit is not None:
378
+ regbit = 1 << cregbit
379
+ self._classical_register = (self._classical_register & (~regbit)) | (
380
+ int(outcome) << cregbit
381
+ )
382
+
383
+ # update quantum state
384
+ if outcome == "0":
385
+ update_diag = [[1 / math.sqrt(probability), 0], [0, 0]]
386
+ else:
387
+ update_diag = [[0, 0], [0, 1 / math.sqrt(probability)]]
388
+ # update classical state
389
+ self._add_unitary(update_diag, [qubit])
390
+
391
+ def _add_reset(self, qubit: int) -> None:
392
+ """Apply a reset instruction to a qubit.
393
+
394
+ Args:
395
+ qubit: the qubit being rest
396
+
397
+ This is done by doing a simulating a measurement
398
+ outcome and projecting onto the outcome state while
399
+ renormalizing.
400
+ """
401
+ # get measure outcome
402
+ outcome, probability = self._get_measure_outcome(qubit)
403
+ # update quantum state
404
+ if outcome == "0":
405
+ update = [[1 / math.sqrt(probability), 0], [0, 0]]
406
+ self._add_unitary(update, [qubit])
407
+ else:
408
+ update = [[0, 1 / math.sqrt(probability)], [0, 0]]
409
+ self._add_unitary(update, [qubit])
410
+
411
+ def _validate_initial_statevector(self) -> None:
412
+ """Validate an initial statevector"""
413
+ # If the initial statevector isn't set we don't need to validate
414
+ if self._initial_statevector is None:
415
+ return
416
+ # Check statevector is correct length for number of qubits
417
+ length = len(self._initial_statevector)
418
+ required_dim = 2**self._number_of_qubits
419
+ if length != required_dim:
420
+ raise BasicProviderError(
421
+ f"initial statevector is incorrect length: {length} != {required_dim}"
422
+ )
423
+
424
+ def _set_options(
425
+ self, qobj_config: QasmQobjConfig | None = None, backend_options: dict | None = None
426
+ ) -> None:
427
+ """Set the backend options for all experiments in a qobj"""
428
+ # Reset default options
429
+ self._initial_statevector = self.options.get("initial_statevector")
430
+ self._chop_threshold = self.options.get("chop_threshold")
431
+ if "backend_options" in backend_options and backend_options["backend_options"]:
432
+ backend_options = backend_options["backend_options"]
433
+
434
+ # Check for custom initial statevector in backend_options first,
435
+ # then config second
436
+ if (
437
+ "initial_statevector" in backend_options
438
+ and backend_options["initial_statevector"] is not None
439
+ ):
440
+ self._initial_statevector = np.array(
441
+ backend_options["initial_statevector"], dtype=complex
442
+ )
443
+ elif hasattr(qobj_config, "initial_statevector"):
444
+ self._initial_statevector = np.array(qobj_config.initial_statevector, dtype=complex)
445
+ if self._initial_statevector is not None:
446
+ # Check the initial statevector is normalized
447
+ norm = np.linalg.norm(self._initial_statevector)
448
+ if round(norm, 12) != 1:
449
+ raise BasicProviderError(f"initial statevector is not normalized: norm {norm} != 1")
450
+ # Check for custom chop threshold
451
+ # Replace with custom options
452
+ if "chop_threshold" in backend_options:
453
+ self._chop_threshold = backend_options["chop_threshold"]
454
+ elif hasattr(qobj_config, "chop_threshold"):
455
+ self._chop_threshold = qobj_config.chop_threshold
456
+
457
+ def _initialize_statevector(self) -> None:
458
+ """Set the initial statevector for simulation"""
459
+ if self._initial_statevector is None:
460
+ # Set to default state of all qubits in |0>
461
+ self._statevector = np.zeros(2**self._number_of_qubits, dtype=complex)
462
+ self._statevector[0] = 1
463
+ else:
464
+ self._statevector = self._initial_statevector.copy()
465
+ # Reshape to rank-N tensor
466
+ self._statevector = np.reshape(self._statevector, self._number_of_qubits * [2])
467
+
468
+ def _validate_measure_sampling(self, experiment: QasmQobjExperiment) -> None:
469
+ """Determine if measure sampling is allowed for an experiment
470
+
471
+ Args:
472
+ experiment: a qobj experiment.
473
+ """
474
+ # If shots=1 we should disable measure sampling.
475
+ # This is also required for statevector simulator to return the
476
+ # correct final statevector without silently dropping final measurements.
477
+ if self._shots <= 1:
478
+ self._sample_measure = False
479
+ return
480
+
481
+ # Check for config flag
482
+ if hasattr(experiment.config, "allows_measure_sampling"):
483
+ self._sample_measure = experiment.config.allows_measure_sampling
484
+ # If flag isn't found do a simple test to see if a circuit contains
485
+ # no reset instructions, and no gates instructions after
486
+ # the first measure.
487
+ else:
488
+ measure_flag = False
489
+ for instruction in experiment.instructions:
490
+ # If circuit contains reset operations we cannot sample
491
+ if instruction.name == "reset":
492
+ self._sample_measure = False
493
+ return
494
+ # If circuit contains a measure option then we can
495
+ # sample only if all following operations are measures
496
+ if measure_flag:
497
+ # If we find a non-measure instruction
498
+ # we cannot do measure sampling
499
+ if instruction.name not in ["measure", "barrier", "id", "u0"]:
500
+ self._sample_measure = False
501
+ return
502
+ elif instruction.name == "measure":
503
+ measure_flag = True
504
+ # If we made it to the end of the circuit without returning
505
+ # measure sampling is allowed
506
+ self._sample_measure = True
507
+
508
+ def run(
509
+ self, run_input: QuantumCircuit | list[QuantumCircuit], **backend_options
510
+ ) -> BasicProviderJob:
511
+ """Run on the backend.
512
+
513
+ Args:
514
+ run_input: payload of the experiment
515
+ backend_options: backend options
516
+
517
+ Returns:
518
+ BasicProviderJob: derived from BaseJob
519
+
520
+ Additional Information:
521
+ backend_options: Is a dict of options for the backend. It may contain
522
+ * "initial_statevector": vector_like
523
+
524
+ The "initial_statevector" option specifies a custom initial
525
+ initial statevector for the simulator to be used instead of the all
526
+ zero state. This size of this vector must be correct for the number
527
+ of qubits in ``run_input`` parameter.
528
+
529
+ Example::
530
+
531
+ backend_options = {
532
+ "initial_statevector": np.array([1, 0, 0, 1j]) / math.sqrt(2),
533
+ }
534
+ """
535
+ # TODO: replace assemble with new run flow
536
+ from qiskit.compiler.assembler import _assemble
537
+
538
+ out_options = {}
539
+ for key, value in backend_options.items():
540
+ if not hasattr(self.options, key):
541
+ warnings.warn(
542
+ f"Option {key} is not used by this backend", UserWarning, stacklevel=2
543
+ )
544
+ else:
545
+ out_options[key] = value
546
+ qobj = _assemble(run_input, self, **out_options)
547
+ qobj_options = qobj.config
548
+ self._set_options(qobj_config=qobj_options, backend_options=backend_options)
549
+ job_id = str(uuid.uuid4())
550
+ job = BasicProviderJob(self, job_id, self._run_job(job_id, qobj))
551
+ return job
552
+
553
+ def _run_job(self, job_id: str, qobj: QasmQobj) -> Result:
554
+ """Run experiments in qobj
555
+
556
+ Args:
557
+ job_id: unique id for the job.
558
+ qobj: job description
559
+
560
+ Returns:
561
+ Result object
562
+ """
563
+ self._validate(qobj)
564
+ result_list = []
565
+ self._shots = qobj.config.shots
566
+ self._memory = getattr(qobj.config, "memory", False)
567
+ self._qobj_config = qobj.config
568
+ start = time.time()
569
+ for experiment in qobj.experiments:
570
+ result_list.append(self.run_experiment(experiment))
571
+ end = time.time()
572
+ result = {
573
+ "backend_name": self.name,
574
+ "backend_version": self.backend_version,
575
+ "qobj_id": qobj.qobj_id,
576
+ "job_id": job_id,
577
+ "results": result_list,
578
+ "status": "COMPLETED",
579
+ "success": True,
580
+ "time_taken": (end - start),
581
+ "header": qobj.header.to_dict(),
582
+ }
583
+
584
+ return Result.from_dict(result)
585
+
586
+ def run_experiment(self, experiment: QasmQobjExperiment) -> dict[str, ...]:
587
+ """Run an experiment (circuit) and return a single experiment result.
588
+
589
+ Args:
590
+ experiment: experiment from qobj experiments list
591
+
592
+ Returns:
593
+ A result dictionary which looks something like::
594
+
595
+ {
596
+ "name": name of this experiment (obtained from qobj.experiment header)
597
+ "seed": random seed used for simulation
598
+ "shots": number of shots used in the simulation
599
+ "data":
600
+ {
601
+ "counts": {'0x9: 5, ...},
602
+ "memory": ['0x9', '0xF', '0x1D', ..., '0x9']
603
+ },
604
+ "status": status string for the simulation
605
+ "success": boolean
606
+ "time_taken": simulation time of this single experiment
607
+ }
608
+ Raises:
609
+ BasicProviderError: if an error occurred.
610
+ """
611
+ start = time.time()
612
+ self._number_of_qubits = experiment.config.n_qubits
613
+ self._number_of_cmembits = experiment.config.memory_slots
614
+ self._statevector = 0
615
+ self._classical_memory = 0
616
+ self._classical_register = 0
617
+ self._sample_measure = False
618
+ global_phase = experiment.header.global_phase
619
+
620
+ # Validate the dimension of initial statevector if set
621
+ self._validate_initial_statevector()
622
+
623
+ # Get the seed looking in circuit, qobj, and then random.
624
+ if hasattr(experiment.config, "seed_simulator"):
625
+ seed_simulator = experiment.config.seed_simulator
626
+ elif hasattr(self._qobj_config, "seed_simulator"):
627
+ seed_simulator = self._qobj_config.seed_simulator
628
+ else:
629
+ # For compatibility on Windows force dyte to be int32
630
+ # and set the maximum value to be (2 ** 31) - 1
631
+ seed_simulator = np.random.randint(2147483647, dtype="int32")
632
+
633
+ self._local_random = np.random.default_rng(seed=seed_simulator)
634
+ # Check if measure sampling is supported for current circuit
635
+ self._validate_measure_sampling(experiment)
636
+
637
+ # List of final counts for all shots
638
+ memory = []
639
+ # Check if we can sample measurements, if so we only perform 1 shot
640
+ # and sample all outcomes from the final state vector
641
+ if self._sample_measure:
642
+ shots = 1
643
+ # Store (qubit, cmembit) pairs for all measure ops in circuit to
644
+ # be sampled
645
+ measure_sample_ops = []
646
+ else:
647
+ shots = self._shots
648
+ for _ in range(shots):
649
+ self._initialize_statevector()
650
+ # apply global_phase
651
+ self._statevector *= np.exp(1j * global_phase)
652
+ # Initialize classical memory to all 0
653
+ self._classical_memory = 0
654
+ self._classical_register = 0
655
+ for operation in experiment.instructions:
656
+ conditional = getattr(operation, "conditional", None)
657
+ if isinstance(conditional, int):
658
+ conditional_bit_set = (self._classical_register >> conditional) & 1
659
+ if not conditional_bit_set:
660
+ continue
661
+ elif conditional is not None:
662
+ mask = int(operation.conditional.mask, 16)
663
+ if mask > 0:
664
+ value = self._classical_memory & mask
665
+ while (mask & 0x1) == 0:
666
+ mask >>= 1
667
+ value >>= 1
668
+ if value != int(operation.conditional.val, 16):
669
+ continue
670
+ if operation.name == "unitary":
671
+ qubits = operation.qubits
672
+ gate = operation.params[0]
673
+ self._add_unitary(gate, qubits)
674
+ elif operation.name in ("id", "u0", "delay"):
675
+ pass
676
+ elif operation.name == "global_phase":
677
+ params = getattr(operation, "params", None)
678
+ gate = GlobalPhaseGate(*params).to_matrix()
679
+ self._add_unitary(gate, [])
680
+ # Check if single qubit gate
681
+ elif operation.name in SINGLE_QUBIT_GATES:
682
+ params = getattr(operation, "params", None)
683
+ qubit = operation.qubits[0]
684
+ gate = single_gate_matrix(operation.name, params)
685
+ self._add_unitary(gate, [qubit])
686
+ elif operation.name in TWO_QUBIT_GATES_WITH_PARAMETERS:
687
+ params = getattr(operation, "params", None)
688
+ qubit0 = operation.qubits[0]
689
+ qubit1 = operation.qubits[1]
690
+ gate = TWO_QUBIT_GATES_WITH_PARAMETERS[operation.name](*params).to_matrix()
691
+ self._add_unitary(gate, [qubit0, qubit1])
692
+ elif operation.name in ("id", "u0"):
693
+ pass
694
+ elif operation.name in TWO_QUBIT_GATES:
695
+ qubit0 = operation.qubits[0]
696
+ qubit1 = operation.qubits[1]
697
+ gate = TWO_QUBIT_GATES[operation.name]
698
+ self._add_unitary(gate, [qubit0, qubit1])
699
+ elif operation.name in THREE_QUBIT_GATES:
700
+ qubit0 = operation.qubits[0]
701
+ qubit1 = operation.qubits[1]
702
+ qubit2 = operation.qubits[2]
703
+ gate = THREE_QUBIT_GATES[operation.name]
704
+ self._add_unitary(gate, [qubit0, qubit1, qubit2])
705
+ # Check if reset
706
+ elif operation.name == "reset":
707
+ qubit = operation.qubits[0]
708
+ self._add_reset(qubit)
709
+ # Check if barrier
710
+ elif operation.name == "barrier":
711
+ pass
712
+ # Check if measure
713
+ elif operation.name == "measure":
714
+ qubit = operation.qubits[0]
715
+ cmembit = operation.memory[0]
716
+ cregbit = operation.register[0] if hasattr(operation, "register") else None
717
+
718
+ if self._sample_measure:
719
+ # If sampling measurements record the qubit and cmembit
720
+ # for this measurement for later sampling
721
+ measure_sample_ops.append((qubit, cmembit))
722
+ else:
723
+ # If not sampling perform measurement as normal
724
+ self._add_measure(qubit, cmembit, cregbit)
725
+ elif operation.name == "bfunc":
726
+ mask = int(operation.mask, 16)
727
+ relation = operation.relation
728
+ val = int(operation.val, 16)
729
+
730
+ cregbit = operation.register
731
+ cmembit = operation.memory if hasattr(operation, "memory") else None
732
+
733
+ compared = (self._classical_register & mask) - val
734
+
735
+ if relation == "==":
736
+ outcome = compared == 0
737
+ elif relation == "!=":
738
+ outcome = compared != 0
739
+ elif relation == "<":
740
+ outcome = compared < 0
741
+ elif relation == "<=":
742
+ outcome = compared <= 0
743
+ elif relation == ">":
744
+ outcome = compared > 0
745
+ elif relation == ">=":
746
+ outcome = compared >= 0
747
+ else:
748
+ raise BasicProviderError("Invalid boolean function relation.")
749
+
750
+ # Store outcome in register and optionally memory slot
751
+ regbit = 1 << cregbit
752
+ self._classical_register = (self._classical_register & (~regbit)) | (
753
+ int(outcome) << cregbit
754
+ )
755
+ if cmembit is not None:
756
+ membit = 1 << cmembit
757
+ self._classical_memory = (self._classical_memory & (~membit)) | (
758
+ int(outcome) << cmembit
759
+ )
760
+ else:
761
+ backend = self.name
762
+ err_msg = '{0} encountered unrecognized operation "{1}"'
763
+ raise BasicProviderError(err_msg.format(backend, operation.name))
764
+
765
+ # Add final creg data to memory list
766
+ if self._number_of_cmembits > 0:
767
+ if self._sample_measure:
768
+ # If sampling we generate all shot samples from the final statevector
769
+ memory = self._add_sample_measure(measure_sample_ops, self._shots)
770
+ else:
771
+ # Turn classical_memory (int) into bit string and pad zero for unused cmembits
772
+ outcome = bin(self._classical_memory)[2:]
773
+ memory.append(hex(int(outcome, 2)))
774
+
775
+ # Add data
776
+ data = {"counts": dict(Counter(memory))}
777
+ # Optionally add memory list
778
+ if self._memory:
779
+ data["memory"] = memory
780
+ end = time.time()
781
+ return {
782
+ "name": experiment.header.name,
783
+ "seed_simulator": seed_simulator,
784
+ "shots": self._shots,
785
+ "data": data,
786
+ "status": "DONE",
787
+ "success": True,
788
+ "time_taken": (end - start),
789
+ "header": experiment.header.to_dict(),
790
+ }
791
+
792
+ def _validate(self, qobj: QasmQobj) -> None:
793
+ """Semantic validations of the qobj which cannot be done via schemas."""
794
+ n_qubits = qobj.config.n_qubits
795
+ max_qubits = self.MAX_QUBITS_MEMORY
796
+ if n_qubits > max_qubits:
797
+ raise BasicProviderError(
798
+ f"Number of qubits {n_qubits} is greater than maximum ({max_qubits}) "
799
+ f'for "{self.name}".'
800
+ )
801
+ for experiment in qobj.experiments:
802
+ name = experiment.header.name
803
+ if experiment.config.memory_slots == 0:
804
+ logger.warning(
805
+ 'No classical registers in circuit "%s", counts will be empty.', name
806
+ )
807
+ elif "measure" not in [op.name for op in experiment.instructions]:
808
+ logger.warning(
809
+ 'No measurements in circuit "%s", classical register will remain all zeros.',
810
+ name,
811
+ )