qiskit 1.0.0b1__cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1095) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +195 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_qasm2.abi3.so +0 -0
  5. qiskit/assembler/__init__.py +47 -0
  6. qiskit/assembler/assemble_circuits.py +408 -0
  7. qiskit/assembler/assemble_schedules.py +372 -0
  8. qiskit/assembler/disassemble.py +318 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +425 -0
  11. qiskit/circuit/_classical_resource_map.py +144 -0
  12. qiskit/circuit/_utils.py +170 -0
  13. qiskit/circuit/add_control.py +274 -0
  14. qiskit/circuit/annotated_operation.py +188 -0
  15. qiskit/circuit/barrier.py +51 -0
  16. qiskit/circuit/bit.py +142 -0
  17. qiskit/circuit/classical/__init__.py +41 -0
  18. qiskit/circuit/classical/expr/__init__.py +218 -0
  19. qiskit/circuit/classical/expr/constructors.py +473 -0
  20. qiskit/circuit/classical/expr/expr.py +356 -0
  21. qiskit/circuit/classical/expr/visitors.py +280 -0
  22. qiskit/circuit/classical/types/__init__.py +108 -0
  23. qiskit/circuit/classical/types/ordering.py +222 -0
  24. qiskit/circuit/classical/types/types.py +117 -0
  25. qiskit/circuit/classicalfunction/__init__.py +131 -0
  26. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  27. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  28. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  29. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  30. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  31. qiskit/circuit/classicalfunction/types.py +18 -0
  32. qiskit/circuit/classicalfunction/utils.py +91 -0
  33. qiskit/circuit/classicalregister.py +71 -0
  34. qiskit/circuit/commutation_checker.py +176 -0
  35. qiskit/circuit/controlflow/__init__.py +27 -0
  36. qiskit/circuit/controlflow/_builder_utils.py +199 -0
  37. qiskit/circuit/controlflow/break_loop.py +70 -0
  38. qiskit/circuit/controlflow/builder.py +651 -0
  39. qiskit/circuit/controlflow/continue_loop.py +72 -0
  40. qiskit/circuit/controlflow/control_flow.py +52 -0
  41. qiskit/circuit/controlflow/for_loop.py +232 -0
  42. qiskit/circuit/controlflow/if_else.py +517 -0
  43. qiskit/circuit/controlflow/switch_case.py +424 -0
  44. qiskit/circuit/controlflow/while_loop.py +177 -0
  45. qiskit/circuit/controlledgate.py +271 -0
  46. qiskit/circuit/delay.py +104 -0
  47. qiskit/circuit/duration.py +88 -0
  48. qiskit/circuit/equivalence.py +291 -0
  49. qiskit/circuit/equivalence_library.py +18 -0
  50. qiskit/circuit/exceptions.py +19 -0
  51. qiskit/circuit/gate.py +245 -0
  52. qiskit/circuit/instruction.py +655 -0
  53. qiskit/circuit/instructionset.py +191 -0
  54. qiskit/circuit/library/__init__.py +581 -0
  55. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  56. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  57. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  58. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  59. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  60. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
  61. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  62. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  63. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  64. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  65. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  66. qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
  67. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  68. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  69. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
  70. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  71. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  72. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  73. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  74. qiskit/circuit/library/arithmetic/quadratic_form.py +197 -0
  75. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  76. qiskit/circuit/library/basis_change/__init__.py +15 -0
  77. qiskit/circuit/library/basis_change/qft.py +289 -0
  78. qiskit/circuit/library/blueprintcircuit.py +186 -0
  79. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  80. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  81. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  82. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  83. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  84. qiskit/circuit/library/data_preparation/__init__.py +47 -0
  85. qiskit/circuit/library/data_preparation/initializer.py +96 -0
  86. qiskit/circuit/library/data_preparation/pauli_feature_map.py +296 -0
  87. qiskit/circuit/library/data_preparation/state_preparation.py +526 -0
  88. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  89. qiskit/circuit/library/data_preparation/zz_feature_map.py +114 -0
  90. qiskit/circuit/library/evolved_operator_ansatz.py +245 -0
  91. qiskit/circuit/library/fourier_checking.py +97 -0
  92. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  93. qiskit/circuit/library/generalized_gates/diagonal.py +164 -0
  94. qiskit/circuit/library/generalized_gates/gms.py +121 -0
  95. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  96. qiskit/circuit/library/generalized_gates/isometry.py +573 -0
  97. qiskit/circuit/library/generalized_gates/linear_function.py +302 -0
  98. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +138 -0
  99. qiskit/circuit/library/generalized_gates/mcmt.py +254 -0
  100. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  101. qiskit/circuit/library/generalized_gates/permutation.py +190 -0
  102. qiskit/circuit/library/generalized_gates/rv.py +93 -0
  103. qiskit/circuit/library/generalized_gates/uc.py +304 -0
  104. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  105. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  106. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  108. qiskit/circuit/library/generalized_gates/unitary.py +198 -0
  109. qiskit/circuit/library/graph_state.py +86 -0
  110. qiskit/circuit/library/grover_operator.py +311 -0
  111. qiskit/circuit/library/hamiltonian_gate.py +146 -0
  112. qiskit/circuit/library/hidden_linear_function.py +98 -0
  113. qiskit/circuit/library/iqp.py +96 -0
  114. qiskit/circuit/library/n_local/__init__.py +31 -0
  115. qiskit/circuit/library/n_local/efficient_su2.py +162 -0
  116. qiskit/circuit/library/n_local/excitation_preserving.py +176 -0
  117. qiskit/circuit/library/n_local/n_local.py +1044 -0
  118. qiskit/circuit/library/n_local/pauli_two_design.py +131 -0
  119. qiskit/circuit/library/n_local/qaoa_ansatz.py +288 -0
  120. qiskit/circuit/library/n_local/real_amplitudes.py +189 -0
  121. qiskit/circuit/library/n_local/two_local.py +334 -0
  122. qiskit/circuit/library/overlap.py +111 -0
  123. qiskit/circuit/library/pauli_evolution.py +180 -0
  124. qiskit/circuit/library/phase_estimation.py +99 -0
  125. qiskit/circuit/library/phase_oracle.py +153 -0
  126. qiskit/circuit/library/quantum_volume.py +114 -0
  127. qiskit/circuit/library/standard_gates/__init__.py +116 -0
  128. qiskit/circuit/library/standard_gates/dcx.py +71 -0
  129. qiskit/circuit/library/standard_gates/ecr.py +114 -0
  130. qiskit/circuit/library/standard_gates/equivalence_library.py +1677 -0
  131. qiskit/circuit/library/standard_gates/global_phase.py +63 -0
  132. qiskit/circuit/library/standard_gates/h.py +224 -0
  133. qiskit/circuit/library/standard_gates/i.py +60 -0
  134. qiskit/circuit/library/standard_gates/iswap.py +129 -0
  135. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +390 -0
  136. qiskit/circuit/library/standard_gates/p.py +364 -0
  137. qiskit/circuit/library/standard_gates/r.py +101 -0
  138. qiskit/circuit/library/standard_gates/rx.py +246 -0
  139. qiskit/circuit/library/standard_gates/rxx.py +128 -0
  140. qiskit/circuit/library/standard_gates/ry.py +241 -0
  141. qiskit/circuit/library/standard_gates/ryy.py +128 -0
  142. qiskit/circuit/library/standard_gates/rz.py +261 -0
  143. qiskit/circuit/library/standard_gates/rzx.py +174 -0
  144. qiskit/circuit/library/standard_gates/rzz.py +141 -0
  145. qiskit/circuit/library/standard_gates/s.py +303 -0
  146. qiskit/circuit/library/standard_gates/swap.py +246 -0
  147. qiskit/circuit/library/standard_gates/sx.py +268 -0
  148. qiskit/circuit/library/standard_gates/t.py +150 -0
  149. qiskit/circuit/library/standard_gates/u.py +338 -0
  150. qiskit/circuit/library/standard_gates/u1.py +383 -0
  151. qiskit/circuit/library/standard_gates/u2.py +132 -0
  152. qiskit/circuit/library/standard_gates/u3.py +358 -0
  153. qiskit/circuit/library/standard_gates/x.py +1370 -0
  154. qiskit/circuit/library/standard_gates/xx_minus_yy.py +179 -0
  155. qiskit/circuit/library/standard_gates/xx_plus_yy.py +180 -0
  156. qiskit/circuit/library/standard_gates/y.py +221 -0
  157. qiskit/circuit/library/standard_gates/z.py +294 -0
  158. qiskit/circuit/library/templates/__init__.py +92 -0
  159. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  160. qiskit/circuit/library/templates/clifford/clifford_2_1.py +33 -0
  161. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  164. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  166. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  170. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  171. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  176. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  179. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  180. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  182. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  188. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  191. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  226. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  227. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  228. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  229. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  230. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  231. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  233. qiskit/circuit/measure.py +41 -0
  234. qiskit/circuit/operation.py +62 -0
  235. qiskit/circuit/parameter.py +160 -0
  236. qiskit/circuit/parameterexpression.py +515 -0
  237. qiskit/circuit/parametertable.py +263 -0
  238. qiskit/circuit/parametervector.py +114 -0
  239. qiskit/circuit/qpy_serialization.py +28 -0
  240. qiskit/circuit/quantumcircuit.py +6074 -0
  241. qiskit/circuit/quantumcircuitdata.py +138 -0
  242. qiskit/circuit/quantumregister.py +90 -0
  243. qiskit/circuit/random/__init__.py +15 -0
  244. qiskit/circuit/random/utils.py +209 -0
  245. qiskit/circuit/register.py +256 -0
  246. qiskit/circuit/reset.py +31 -0
  247. qiskit/circuit/singleton.py +604 -0
  248. qiskit/circuit/store.py +87 -0
  249. qiskit/circuit/tools/__init__.py +16 -0
  250. qiskit/circuit/tools/pi_check.py +190 -0
  251. qiskit/compiler/__init__.py +33 -0
  252. qiskit/compiler/assembler.py +597 -0
  253. qiskit/compiler/scheduler.py +107 -0
  254. qiskit/compiler/sequencer.py +69 -0
  255. qiskit/compiler/transpiler.py +613 -0
  256. qiskit/converters/__init__.py +59 -0
  257. qiskit/converters/circuit_to_dag.py +96 -0
  258. qiskit/converters/circuit_to_dagdependency.py +51 -0
  259. qiskit/converters/circuit_to_gate.py +109 -0
  260. qiskit/converters/circuit_to_instruction.py +131 -0
  261. qiskit/converters/dag_to_circuit.py +77 -0
  262. qiskit/converters/dag_to_dagdependency.py +55 -0
  263. qiskit/converters/dagdependency_to_circuit.py +42 -0
  264. qiskit/converters/dagdependency_to_dag.py +49 -0
  265. qiskit/dagcircuit/__init__.py +44 -0
  266. qiskit/dagcircuit/collect_blocks.py +386 -0
  267. qiskit/dagcircuit/dagcircuit.py +2105 -0
  268. qiskit/dagcircuit/dagdependency.py +626 -0
  269. qiskit/dagcircuit/dagdepnode.py +157 -0
  270. qiskit/dagcircuit/dagnode.py +322 -0
  271. qiskit/dagcircuit/exceptions.py +42 -0
  272. qiskit/exceptions.py +97 -0
  273. qiskit/execute_function.py +354 -0
  274. qiskit/extensions/__init__.py +70 -0
  275. qiskit/extensions/exceptions.py +31 -0
  276. qiskit/extensions/quantum_initializer/__init__.py +26 -0
  277. qiskit/extensions/quantum_initializer/squ.py +163 -0
  278. qiskit/extensions/simulator/__init__.py +15 -0
  279. qiskit/extensions/simulator/snapshot.py +70 -0
  280. qiskit/namespace.py +76 -0
  281. qiskit/passmanager/__init__.py +242 -0
  282. qiskit/passmanager/base_tasks.py +230 -0
  283. qiskit/passmanager/compilation_status.py +74 -0
  284. qiskit/passmanager/exceptions.py +19 -0
  285. qiskit/passmanager/flow_controllers.py +336 -0
  286. qiskit/passmanager/passmanager.py +317 -0
  287. qiskit/primitives/__init__.py +62 -0
  288. qiskit/primitives/backend_estimator.py +473 -0
  289. qiskit/primitives/backend_sampler.py +209 -0
  290. qiskit/primitives/base/__init__.py +20 -0
  291. qiskit/primitives/base/base_estimator.py +256 -0
  292. qiskit/primitives/base/base_primitive.py +74 -0
  293. qiskit/primitives/base/base_result.py +87 -0
  294. qiskit/primitives/base/base_sampler.py +202 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/estimator.py +158 -0
  299. qiskit/primitives/primitive_job.py +73 -0
  300. qiskit/primitives/sampler.py +155 -0
  301. qiskit/primitives/utils.py +216 -0
  302. qiskit/providers/__init__.py +773 -0
  303. qiskit/providers/backend.py +653 -0
  304. qiskit/providers/backend_compat.py +347 -0
  305. qiskit/providers/basicaer/__init__.py +73 -0
  306. qiskit/providers/basicaer/basicaerjob.py +65 -0
  307. qiskit/providers/basicaer/basicaerprovider.py +127 -0
  308. qiskit/providers/basicaer/basicaertools.py +186 -0
  309. qiskit/providers/basicaer/exceptions.py +30 -0
  310. qiskit/providers/basicaer/qasm_simulator.py +678 -0
  311. qiskit/providers/basicaer/statevector_simulator.py +121 -0
  312. qiskit/providers/basicaer/unitary_simulator.py +395 -0
  313. qiskit/providers/exceptions.py +45 -0
  314. qiskit/providers/fake_provider/__init__.py +267 -0
  315. qiskit/providers/fake_provider/backends/__init__.py +110 -0
  316. qiskit/providers/fake_provider/backends/almaden/__init__.py +16 -0
  317. qiskit/providers/fake_provider/backends/almaden/conf_almaden.json +1 -0
  318. qiskit/providers/fake_provider/backends/almaden/fake_almaden.py +58 -0
  319. qiskit/providers/fake_provider/backends/almaden/props_almaden.json +1 -0
  320. qiskit/providers/fake_provider/backends/armonk/__init__.py +16 -0
  321. qiskit/providers/fake_provider/backends/armonk/conf_armonk.json +1 -0
  322. qiskit/providers/fake_provider/backends/armonk/defs_armonk.json +1 -0
  323. qiskit/providers/fake_provider/backends/armonk/fake_armonk.py +48 -0
  324. qiskit/providers/fake_provider/backends/armonk/props_armonk.json +1 -0
  325. qiskit/providers/fake_provider/backends/athens/__init__.py +16 -0
  326. qiskit/providers/fake_provider/backends/athens/conf_athens.json +1 -0
  327. qiskit/providers/fake_provider/backends/athens/defs_athens.json +1 -0
  328. qiskit/providers/fake_provider/backends/athens/fake_athens.py +38 -0
  329. qiskit/providers/fake_provider/backends/athens/props_athens.json +1 -0
  330. qiskit/providers/fake_provider/backends/auckland/__init__.py +15 -0
  331. qiskit/providers/fake_provider/backends/auckland/conf_auckland.json +1 -0
  332. qiskit/providers/fake_provider/backends/auckland/defs_auckland.json +1 -0
  333. qiskit/providers/fake_provider/backends/auckland/fake_auckland.py +29 -0
  334. qiskit/providers/fake_provider/backends/auckland/props_auckland.json +1 -0
  335. qiskit/providers/fake_provider/backends/belem/__init__.py +16 -0
  336. qiskit/providers/fake_provider/backends/belem/conf_belem.json +1 -0
  337. qiskit/providers/fake_provider/backends/belem/defs_belem.json +1 -0
  338. qiskit/providers/fake_provider/backends/belem/fake_belem.py +38 -0
  339. qiskit/providers/fake_provider/backends/belem/props_belem.json +1 -0
  340. qiskit/providers/fake_provider/backends/boeblingen/__init__.py +16 -0
  341. qiskit/providers/fake_provider/backends/boeblingen/conf_boeblingen.json +1 -0
  342. qiskit/providers/fake_provider/backends/boeblingen/defs_boeblingen.json +1 -0
  343. qiskit/providers/fake_provider/backends/boeblingen/fake_boeblingen.py +60 -0
  344. qiskit/providers/fake_provider/backends/boeblingen/props_boeblingen.json +1 -0
  345. qiskit/providers/fake_provider/backends/bogota/__init__.py +16 -0
  346. qiskit/providers/fake_provider/backends/bogota/conf_bogota.json +1 -0
  347. qiskit/providers/fake_provider/backends/bogota/defs_bogota.json +1 -0
  348. qiskit/providers/fake_provider/backends/bogota/fake_bogota.py +38 -0
  349. qiskit/providers/fake_provider/backends/bogota/props_bogota.json +1 -0
  350. qiskit/providers/fake_provider/backends/brooklyn/__init__.py +16 -0
  351. qiskit/providers/fake_provider/backends/brooklyn/conf_brooklyn.json +1 -0
  352. qiskit/providers/fake_provider/backends/brooklyn/defs_brooklyn.json +1 -0
  353. qiskit/providers/fake_provider/backends/brooklyn/fake_brooklyn.py +38 -0
  354. qiskit/providers/fake_provider/backends/brooklyn/props_brooklyn.json +1 -0
  355. qiskit/providers/fake_provider/backends/burlington/__init__.py +16 -0
  356. qiskit/providers/fake_provider/backends/burlington/conf_burlington.json +1 -0
  357. qiskit/providers/fake_provider/backends/burlington/fake_burlington.py +50 -0
  358. qiskit/providers/fake_provider/backends/burlington/props_burlington.json +1 -0
  359. qiskit/providers/fake_provider/backends/cairo/__init__.py +16 -0
  360. qiskit/providers/fake_provider/backends/cairo/conf_cairo.json +1 -0
  361. qiskit/providers/fake_provider/backends/cairo/defs_cairo.json +1 -0
  362. qiskit/providers/fake_provider/backends/cairo/fake_cairo.py +38 -0
  363. qiskit/providers/fake_provider/backends/cairo/props_cairo.json +1 -0
  364. qiskit/providers/fake_provider/backends/cambridge/__init__.py +17 -0
  365. qiskit/providers/fake_provider/backends/cambridge/conf_cambridge.json +1 -0
  366. qiskit/providers/fake_provider/backends/cambridge/fake_cambridge.py +72 -0
  367. qiskit/providers/fake_provider/backends/cambridge/props_cambridge.json +1 -0
  368. qiskit/providers/fake_provider/backends/cambridge/props_cambridge_alt.json +1 -0
  369. qiskit/providers/fake_provider/backends/casablanca/__init__.py +16 -0
  370. qiskit/providers/fake_provider/backends/casablanca/conf_casablanca.json +1 -0
  371. qiskit/providers/fake_provider/backends/casablanca/defs_casablanca.json +1 -0
  372. qiskit/providers/fake_provider/backends/casablanca/fake_casablanca.py +38 -0
  373. qiskit/providers/fake_provider/backends/casablanca/props_casablanca.json +1 -0
  374. qiskit/providers/fake_provider/backends/essex/__init__.py +16 -0
  375. qiskit/providers/fake_provider/backends/essex/conf_essex.json +1 -0
  376. qiskit/providers/fake_provider/backends/essex/fake_essex.py +54 -0
  377. qiskit/providers/fake_provider/backends/essex/props_essex.json +1 -0
  378. qiskit/providers/fake_provider/backends/geneva/__init__.py +15 -0
  379. qiskit/providers/fake_provider/backends/geneva/conf_geneva.json +1 -0
  380. qiskit/providers/fake_provider/backends/geneva/defs_geneva.json +1 -0
  381. qiskit/providers/fake_provider/backends/geneva/fake_geneva.py +29 -0
  382. qiskit/providers/fake_provider/backends/geneva/props_geneva.json +1 -0
  383. qiskit/providers/fake_provider/backends/guadalupe/__init__.py +16 -0
  384. qiskit/providers/fake_provider/backends/guadalupe/conf_guadalupe.json +1 -0
  385. qiskit/providers/fake_provider/backends/guadalupe/defs_guadalupe.json +1 -0
  386. qiskit/providers/fake_provider/backends/guadalupe/fake_guadalupe.py +39 -0
  387. qiskit/providers/fake_provider/backends/guadalupe/props_guadalupe.json +1 -0
  388. qiskit/providers/fake_provider/backends/hanoi/__init__.py +16 -0
  389. qiskit/providers/fake_provider/backends/hanoi/conf_hanoi.json +1 -0
  390. qiskit/providers/fake_provider/backends/hanoi/defs_hanoi.json +1 -0
  391. qiskit/providers/fake_provider/backends/hanoi/fake_hanoi.py +38 -0
  392. qiskit/providers/fake_provider/backends/hanoi/props_hanoi.json +1 -0
  393. qiskit/providers/fake_provider/backends/jakarta/__init__.py +16 -0
  394. qiskit/providers/fake_provider/backends/jakarta/conf_jakarta.json +1 -0
  395. qiskit/providers/fake_provider/backends/jakarta/defs_jakarta.json +1 -0
  396. qiskit/providers/fake_provider/backends/jakarta/fake_jakarta.py +38 -0
  397. qiskit/providers/fake_provider/backends/jakarta/props_jakarta.json +1 -0
  398. qiskit/providers/fake_provider/backends/johannesburg/__init__.py +16 -0
  399. qiskit/providers/fake_provider/backends/johannesburg/conf_johannesburg.json +1 -0
  400. qiskit/providers/fake_provider/backends/johannesburg/fake_johannesburg.py +58 -0
  401. qiskit/providers/fake_provider/backends/johannesburg/props_johannesburg.json +1 -0
  402. qiskit/providers/fake_provider/backends/kolkata/__init__.py +16 -0
  403. qiskit/providers/fake_provider/backends/kolkata/conf_kolkata.json +1 -0
  404. qiskit/providers/fake_provider/backends/kolkata/defs_kolkata.json +1 -0
  405. qiskit/providers/fake_provider/backends/kolkata/fake_kolkata.py +38 -0
  406. qiskit/providers/fake_provider/backends/kolkata/props_kolkata.json +1 -0
  407. qiskit/providers/fake_provider/backends/lagos/__init__.py +16 -0
  408. qiskit/providers/fake_provider/backends/lagos/conf_lagos.json +1 -0
  409. qiskit/providers/fake_provider/backends/lagos/defs_lagos.json +1 -0
  410. qiskit/providers/fake_provider/backends/lagos/fake_lagos.py +38 -0
  411. qiskit/providers/fake_provider/backends/lagos/props_lagos.json +1 -0
  412. qiskit/providers/fake_provider/backends/lima/__init__.py +16 -0
  413. qiskit/providers/fake_provider/backends/lima/conf_lima.json +1 -0
  414. qiskit/providers/fake_provider/backends/lima/defs_lima.json +1 -0
  415. qiskit/providers/fake_provider/backends/lima/fake_lima.py +38 -0
  416. qiskit/providers/fake_provider/backends/lima/props_lima.json +1 -0
  417. qiskit/providers/fake_provider/backends/london/__init__.py +16 -0
  418. qiskit/providers/fake_provider/backends/london/conf_london.json +1 -0
  419. qiskit/providers/fake_provider/backends/london/fake_london.py +54 -0
  420. qiskit/providers/fake_provider/backends/london/props_london.json +1 -0
  421. qiskit/providers/fake_provider/backends/manhattan/__init__.py +16 -0
  422. qiskit/providers/fake_provider/backends/manhattan/conf_manhattan.json +1 -0
  423. qiskit/providers/fake_provider/backends/manhattan/defs_manhattan.json +1 -0
  424. qiskit/providers/fake_provider/backends/manhattan/fake_manhattan.py +38 -0
  425. qiskit/providers/fake_provider/backends/manhattan/props_manhattan.json +1 -0
  426. qiskit/providers/fake_provider/backends/manila/__init__.py +16 -0
  427. qiskit/providers/fake_provider/backends/manila/conf_manila.json +1 -0
  428. qiskit/providers/fake_provider/backends/manila/defs_manila.json +1 -0
  429. qiskit/providers/fake_provider/backends/manila/fake_manila.py +38 -0
  430. qiskit/providers/fake_provider/backends/manila/props_manila.json +1 -0
  431. qiskit/providers/fake_provider/backends/melbourne/__init__.py +16 -0
  432. qiskit/providers/fake_provider/backends/melbourne/conf_melbourne.json +1 -0
  433. qiskit/providers/fake_provider/backends/melbourne/fake_melbourne.py +91 -0
  434. qiskit/providers/fake_provider/backends/melbourne/props_melbourne.json +1 -0
  435. qiskit/providers/fake_provider/backends/montreal/__init__.py +16 -0
  436. qiskit/providers/fake_provider/backends/montreal/conf_montreal.json +1 -0
  437. qiskit/providers/fake_provider/backends/montreal/defs_montreal.json +1 -0
  438. qiskit/providers/fake_provider/backends/montreal/fake_montreal.py +38 -0
  439. qiskit/providers/fake_provider/backends/montreal/props_montreal.json +1 -0
  440. qiskit/providers/fake_provider/backends/mumbai/__init__.py +16 -0
  441. qiskit/providers/fake_provider/backends/mumbai/conf_mumbai.json +1 -0
  442. qiskit/providers/fake_provider/backends/mumbai/defs_mumbai.json +1 -0
  443. qiskit/providers/fake_provider/backends/mumbai/fake_mumbai.py +38 -0
  444. qiskit/providers/fake_provider/backends/mumbai/props_mumbai.json +1 -0
  445. qiskit/providers/fake_provider/backends/nairobi/__init__.py +16 -0
  446. qiskit/providers/fake_provider/backends/nairobi/conf_nairobi.json +1 -0
  447. qiskit/providers/fake_provider/backends/nairobi/defs_nairobi.json +1 -0
  448. qiskit/providers/fake_provider/backends/nairobi/fake_nairobi.py +38 -0
  449. qiskit/providers/fake_provider/backends/nairobi/props_nairobi.json +1 -0
  450. qiskit/providers/fake_provider/backends/oslo/__init__.py +15 -0
  451. qiskit/providers/fake_provider/backends/oslo/conf_oslo.json +1 -0
  452. qiskit/providers/fake_provider/backends/oslo/defs_oslo.json +1 -0
  453. qiskit/providers/fake_provider/backends/oslo/fake_oslo.py +29 -0
  454. qiskit/providers/fake_provider/backends/oslo/props_oslo.json +1 -0
  455. qiskit/providers/fake_provider/backends/ourense/__init__.py +16 -0
  456. qiskit/providers/fake_provider/backends/ourense/conf_ourense.json +1 -0
  457. qiskit/providers/fake_provider/backends/ourense/fake_ourense.py +50 -0
  458. qiskit/providers/fake_provider/backends/ourense/props_ourense.json +1 -0
  459. qiskit/providers/fake_provider/backends/paris/__init__.py +16 -0
  460. qiskit/providers/fake_provider/backends/paris/conf_paris.json +1 -0
  461. qiskit/providers/fake_provider/backends/paris/defs_paris.json +1 -0
  462. qiskit/providers/fake_provider/backends/paris/fake_paris.py +64 -0
  463. qiskit/providers/fake_provider/backends/paris/props_paris.json +1 -0
  464. qiskit/providers/fake_provider/backends/perth/__init__.py +15 -0
  465. qiskit/providers/fake_provider/backends/perth/conf_perth.json +1 -0
  466. qiskit/providers/fake_provider/backends/perth/defs_perth.json +1 -0
  467. qiskit/providers/fake_provider/backends/perth/fake_perth.py +29 -0
  468. qiskit/providers/fake_provider/backends/perth/props_perth.json +1 -0
  469. qiskit/providers/fake_provider/backends/poughkeepsie/__init__.py +16 -0
  470. qiskit/providers/fake_provider/backends/poughkeepsie/conf_poughkeepsie.json +1 -0
  471. qiskit/providers/fake_provider/backends/poughkeepsie/defs_poughkeepsie.json +1 -0
  472. qiskit/providers/fake_provider/backends/poughkeepsie/fake_poughkeepsie.py +124 -0
  473. qiskit/providers/fake_provider/backends/poughkeepsie/props_poughkeepsie.json +1 -0
  474. qiskit/providers/fake_provider/backends/prague/__init__.py +15 -0
  475. qiskit/providers/fake_provider/backends/prague/conf_prague.json +1 -0
  476. qiskit/providers/fake_provider/backends/prague/fake_prague.py +28 -0
  477. qiskit/providers/fake_provider/backends/prague/props_prague.json +1 -0
  478. qiskit/providers/fake_provider/backends/quito/__init__.py +16 -0
  479. qiskit/providers/fake_provider/backends/quito/conf_quito.json +1 -0
  480. qiskit/providers/fake_provider/backends/quito/defs_quito.json +1 -0
  481. qiskit/providers/fake_provider/backends/quito/fake_quito.py +38 -0
  482. qiskit/providers/fake_provider/backends/quito/props_quito.json +1 -0
  483. qiskit/providers/fake_provider/backends/rochester/__init__.py +16 -0
  484. qiskit/providers/fake_provider/backends/rochester/conf_rochester.json +1 -0
  485. qiskit/providers/fake_provider/backends/rochester/fake_rochester.py +36 -0
  486. qiskit/providers/fake_provider/backends/rochester/props_rochester.json +1 -0
  487. qiskit/providers/fake_provider/backends/rome/__init__.py +16 -0
  488. qiskit/providers/fake_provider/backends/rome/conf_rome.json +1 -0
  489. qiskit/providers/fake_provider/backends/rome/defs_rome.json +1 -0
  490. qiskit/providers/fake_provider/backends/rome/fake_rome.py +38 -0
  491. qiskit/providers/fake_provider/backends/rome/props_rome.json +1 -0
  492. qiskit/providers/fake_provider/backends/rueschlikon/__init__.py +15 -0
  493. qiskit/providers/fake_provider/backends/rueschlikon/fake_rueschlikon.py +74 -0
  494. qiskit/providers/fake_provider/backends/santiago/__init__.py +16 -0
  495. qiskit/providers/fake_provider/backends/santiago/conf_santiago.json +1 -0
  496. qiskit/providers/fake_provider/backends/santiago/defs_santiago.json +1 -0
  497. qiskit/providers/fake_provider/backends/santiago/fake_santiago.py +38 -0
  498. qiskit/providers/fake_provider/backends/santiago/props_santiago.json +1 -0
  499. qiskit/providers/fake_provider/backends/sherbrooke/__init__.py +17 -0
  500. qiskit/providers/fake_provider/backends/sherbrooke/conf_sherbrooke.json +1 -0
  501. qiskit/providers/fake_provider/backends/sherbrooke/defs_sherbrooke.json +1 -0
  502. qiskit/providers/fake_provider/backends/sherbrooke/fake_sherbrooke.py +28 -0
  503. qiskit/providers/fake_provider/backends/sherbrooke/props_sherbrooke.json +1 -0
  504. qiskit/providers/fake_provider/backends/singapore/__init__.py +16 -0
  505. qiskit/providers/fake_provider/backends/singapore/conf_singapore.json +1 -0
  506. qiskit/providers/fake_provider/backends/singapore/fake_singapore.py +58 -0
  507. qiskit/providers/fake_provider/backends/singapore/props_singapore.json +1 -0
  508. qiskit/providers/fake_provider/backends/sydney/__init__.py +16 -0
  509. qiskit/providers/fake_provider/backends/sydney/conf_sydney.json +1 -0
  510. qiskit/providers/fake_provider/backends/sydney/defs_sydney.json +1 -0
  511. qiskit/providers/fake_provider/backends/sydney/fake_sydney.py +38 -0
  512. qiskit/providers/fake_provider/backends/sydney/props_sydney.json +1 -0
  513. qiskit/providers/fake_provider/backends/tenerife/__init__.py +15 -0
  514. qiskit/providers/fake_provider/backends/tenerife/fake_tenerife.py +64 -0
  515. qiskit/providers/fake_provider/backends/tenerife/props_tenerife.json +1 -0
  516. qiskit/providers/fake_provider/backends/tokyo/__init__.py +15 -0
  517. qiskit/providers/fake_provider/backends/tokyo/fake_tokyo.py +137 -0
  518. qiskit/providers/fake_provider/backends/tokyo/props_tokyo.json +1 -0
  519. qiskit/providers/fake_provider/backends/toronto/__init__.py +16 -0
  520. qiskit/providers/fake_provider/backends/toronto/conf_toronto.json +1 -0
  521. qiskit/providers/fake_provider/backends/toronto/defs_toronto.json +1 -0
  522. qiskit/providers/fake_provider/backends/toronto/fake_toronto.py +38 -0
  523. qiskit/providers/fake_provider/backends/toronto/props_toronto.json +1 -0
  524. qiskit/providers/fake_provider/backends/valencia/__init__.py +16 -0
  525. qiskit/providers/fake_provider/backends/valencia/conf_valencia.json +1 -0
  526. qiskit/providers/fake_provider/backends/valencia/defs_valencia.json +1 -0
  527. qiskit/providers/fake_provider/backends/valencia/fake_valencia.py +38 -0
  528. qiskit/providers/fake_provider/backends/valencia/props_valencia.json +1 -0
  529. qiskit/providers/fake_provider/backends/vigo/__init__.py +16 -0
  530. qiskit/providers/fake_provider/backends/vigo/conf_vigo.json +1 -0
  531. qiskit/providers/fake_provider/backends/vigo/fake_vigo.py +50 -0
  532. qiskit/providers/fake_provider/backends/vigo/props_vigo.json +1 -0
  533. qiskit/providers/fake_provider/backends/washington/__init__.py +18 -0
  534. qiskit/providers/fake_provider/backends/washington/conf_washington.json +1 -0
  535. qiskit/providers/fake_provider/backends/washington/defs_washington.json +1 -0
  536. qiskit/providers/fake_provider/backends/washington/fake_washington.py +38 -0
  537. qiskit/providers/fake_provider/backends/washington/props_washington.json +1 -0
  538. qiskit/providers/fake_provider/backends/yorktown/__init__.py +16 -0
  539. qiskit/providers/fake_provider/backends/yorktown/conf_yorktown.json +1 -0
  540. qiskit/providers/fake_provider/backends/yorktown/fake_yorktown.py +54 -0
  541. qiskit/providers/fake_provider/backends/yorktown/props_yorktown.json +1 -0
  542. qiskit/providers/fake_provider/fake_1q.py +91 -0
  543. qiskit/providers/fake_provider/fake_backend.py +572 -0
  544. qiskit/providers/fake_provider/fake_backend_v2.py +217 -0
  545. qiskit/providers/fake_provider/fake_job.py +81 -0
  546. qiskit/providers/fake_provider/fake_mumbai_v2.py +637 -0
  547. qiskit/providers/fake_provider/fake_openpulse_2q.py +342 -0
  548. qiskit/providers/fake_provider/fake_openpulse_3q.py +332 -0
  549. qiskit/providers/fake_provider/fake_provider.py +214 -0
  550. qiskit/providers/fake_provider/fake_pulse_backend.py +43 -0
  551. qiskit/providers/fake_provider/fake_qasm_backend.py +72 -0
  552. qiskit/providers/fake_provider/fake_qasm_simulator.py +48 -0
  553. qiskit/providers/fake_provider/fake_qobj.py +44 -0
  554. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  555. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  556. qiskit/providers/fake_provider/utils/configurable_backend.py +360 -0
  557. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  558. qiskit/providers/job.py +142 -0
  559. qiskit/providers/jobstatus.py +30 -0
  560. qiskit/providers/models/__init__.py +52 -0
  561. qiskit/providers/models/backendconfiguration.py +994 -0
  562. qiskit/providers/models/backendproperties.py +490 -0
  563. qiskit/providers/models/backendstatus.py +94 -0
  564. qiskit/providers/models/jobstatus.py +66 -0
  565. qiskit/providers/models/pulsedefaults.py +304 -0
  566. qiskit/providers/options.py +273 -0
  567. qiskit/providers/provider.py +79 -0
  568. qiskit/providers/providerutils.py +99 -0
  569. qiskit/pulse/__init__.py +170 -0
  570. qiskit/pulse/builder.py +2733 -0
  571. qiskit/pulse/calibration_entries.py +357 -0
  572. qiskit/pulse/channels.py +221 -0
  573. qiskit/pulse/configuration.py +244 -0
  574. qiskit/pulse/exceptions.py +43 -0
  575. qiskit/pulse/filters.py +302 -0
  576. qiskit/pulse/instruction_schedule_map.py +406 -0
  577. qiskit/pulse/instructions/__init__.py +69 -0
  578. qiskit/pulse/instructions/acquire.py +150 -0
  579. qiskit/pulse/instructions/call.py +176 -0
  580. qiskit/pulse/instructions/delay.py +69 -0
  581. qiskit/pulse/instructions/directives.py +145 -0
  582. qiskit/pulse/instructions/frequency.py +132 -0
  583. qiskit/pulse/instructions/instruction.py +266 -0
  584. qiskit/pulse/instructions/phase.py +149 -0
  585. qiskit/pulse/instructions/play.py +96 -0
  586. qiskit/pulse/instructions/reference.py +99 -0
  587. qiskit/pulse/instructions/snapshot.py +80 -0
  588. qiskit/pulse/library/__init__.py +99 -0
  589. qiskit/pulse/library/continuous.py +430 -0
  590. qiskit/pulse/library/parametric_pulses.py +629 -0
  591. qiskit/pulse/library/pulse.py +137 -0
  592. qiskit/pulse/library/samplers/__init__.py +15 -0
  593. qiskit/pulse/library/samplers/decorators.py +299 -0
  594. qiskit/pulse/library/samplers/strategies.py +71 -0
  595. qiskit/pulse/library/symbolic_pulses.py +1962 -0
  596. qiskit/pulse/library/waveform.py +134 -0
  597. qiskit/pulse/macros.py +256 -0
  598. qiskit/pulse/parameter_manager.py +432 -0
  599. qiskit/pulse/parser.py +314 -0
  600. qiskit/pulse/reference_manager.py +58 -0
  601. qiskit/pulse/schedule.py +2002 -0
  602. qiskit/pulse/transforms/__init__.py +106 -0
  603. qiskit/pulse/transforms/alignments.py +406 -0
  604. qiskit/pulse/transforms/base_transforms.py +71 -0
  605. qiskit/pulse/transforms/canonicalization.py +514 -0
  606. qiskit/pulse/transforms/dag.py +107 -0
  607. qiskit/pulse/utils.py +109 -0
  608. qiskit/qasm/libs/qelib1.inc +266 -0
  609. qiskit/qasm/libs/stdgates.inc +75 -0
  610. qiskit/qasm2/__init__.py +658 -0
  611. qiskit/qasm2/exceptions.py +27 -0
  612. qiskit/qasm2/export.py +374 -0
  613. qiskit/qasm2/parse.py +403 -0
  614. qiskit/qasm3/__init__.py +255 -0
  615. qiskit/qasm3/ast.py +606 -0
  616. qiskit/qasm3/exceptions.py +27 -0
  617. qiskit/qasm3/experimental.py +30 -0
  618. qiskit/qasm3/exporter.py +1079 -0
  619. qiskit/qasm3/printer.py +545 -0
  620. qiskit/qobj/__init__.py +75 -0
  621. qiskit/qobj/common.py +71 -0
  622. qiskit/qobj/converters/__init__.py +18 -0
  623. qiskit/qobj/converters/lo_config.py +168 -0
  624. qiskit/qobj/converters/pulse_instruction.py +1070 -0
  625. qiskit/qobj/pulse_qobj.py +655 -0
  626. qiskit/qobj/qasm_qobj.py +656 -0
  627. qiskit/qobj/utils.py +37 -0
  628. qiskit/qpy/__init__.py +1348 -0
  629. qiskit/qpy/binary_io/__init__.py +36 -0
  630. qiskit/qpy/binary_io/circuits.py +1212 -0
  631. qiskit/qpy/binary_io/schedules.py +619 -0
  632. qiskit/qpy/binary_io/value.py +549 -0
  633. qiskit/qpy/common.py +305 -0
  634. qiskit/qpy/exceptions.py +28 -0
  635. qiskit/qpy/formats.py +360 -0
  636. qiskit/qpy/interface.py +308 -0
  637. qiskit/qpy/type_keys.py +544 -0
  638. qiskit/quantum_info/__init__.py +173 -0
  639. qiskit/quantum_info/analysis/__init__.py +17 -0
  640. qiskit/quantum_info/analysis/average.py +47 -0
  641. qiskit/quantum_info/analysis/distance.py +101 -0
  642. qiskit/quantum_info/analysis/make_observable.py +43 -0
  643. qiskit/quantum_info/analysis/z2_symmetries.py +483 -0
  644. qiskit/quantum_info/operators/__init__.py +28 -0
  645. qiskit/quantum_info/operators/base_operator.py +145 -0
  646. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  647. qiskit/quantum_info/operators/channel/chi.py +190 -0
  648. qiskit/quantum_info/operators/channel/choi.py +217 -0
  649. qiskit/quantum_info/operators/channel/kraus.py +336 -0
  650. qiskit/quantum_info/operators/channel/ptm.py +203 -0
  651. qiskit/quantum_info/operators/channel/quantum_channel.py +350 -0
  652. qiskit/quantum_info/operators/channel/stinespring.py +295 -0
  653. qiskit/quantum_info/operators/channel/superop.py +376 -0
  654. qiskit/quantum_info/operators/channel/transformations.py +467 -0
  655. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  656. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  657. qiskit/quantum_info/operators/dihedral/dihedral.py +508 -0
  658. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +218 -0
  659. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  660. qiskit/quantum_info/operators/dihedral/random.py +61 -0
  661. qiskit/quantum_info/operators/linear_op.py +25 -0
  662. qiskit/quantum_info/operators/measures.py +423 -0
  663. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  664. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  665. qiskit/quantum_info/operators/mixins/group.py +171 -0
  666. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  667. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  668. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  669. qiskit/quantum_info/operators/op_shape.py +533 -0
  670. qiskit/quantum_info/operators/operator.py +778 -0
  671. qiskit/quantum_info/operators/predicates.py +170 -0
  672. qiskit/quantum_info/operators/random.py +154 -0
  673. qiskit/quantum_info/operators/scalar_op.py +253 -0
  674. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  675. qiskit/quantum_info/operators/symplectic/base_pauli.py +720 -0
  676. qiskit/quantum_info/operators/symplectic/clifford.py +1022 -0
  677. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  678. qiskit/quantum_info/operators/symplectic/pauli.py +699 -0
  679. qiskit/quantum_info/operators/symplectic/pauli_list.py +1209 -0
  680. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  681. qiskit/quantum_info/operators/symplectic/random.py +264 -0
  682. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1156 -0
  683. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  684. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  685. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  686. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  687. qiskit/quantum_info/random.py +26 -0
  688. qiskit/quantum_info/states/__init__.py +28 -0
  689. qiskit/quantum_info/states/densitymatrix.py +848 -0
  690. qiskit/quantum_info/states/measures.py +288 -0
  691. qiskit/quantum_info/states/quantum_state.py +503 -0
  692. qiskit/quantum_info/states/random.py +157 -0
  693. qiskit/quantum_info/states/stabilizerstate.py +638 -0
  694. qiskit/quantum_info/states/statevector.py +961 -0
  695. qiskit/quantum_info/states/utils.py +245 -0
  696. qiskit/quantum_info/synthesis/__init__.py +20 -0
  697. qiskit/quantum_info/synthesis/clifford_decompose.py +69 -0
  698. qiskit/quantum_info/synthesis/cnotdihedral_decompose.py +50 -0
  699. qiskit/quantum_info/synthesis/ion_decompose.py +55 -0
  700. qiskit/quantum_info/synthesis/local_invariance.py +93 -0
  701. qiskit/quantum_info/synthesis/one_qubit_decompose.py +284 -0
  702. qiskit/quantum_info/synthesis/qsd.py +269 -0
  703. qiskit/quantum_info/synthesis/quaternion.py +156 -0
  704. qiskit/quantum_info/synthesis/two_qubit_decompose.py +1567 -0
  705. qiskit/quantum_info/synthesis/weyl.py +98 -0
  706. qiskit/quantum_info/synthesis/xx_decompose/__init__.py +19 -0
  707. qiskit/quantum_info/synthesis/xx_decompose/circuits.py +299 -0
  708. qiskit/quantum_info/synthesis/xx_decompose/decomposer.py +314 -0
  709. qiskit/quantum_info/synthesis/xx_decompose/embodiments.py +163 -0
  710. qiskit/quantum_info/synthesis/xx_decompose/paths.py +412 -0
  711. qiskit/quantum_info/synthesis/xx_decompose/polytopes.py +264 -0
  712. qiskit/quantum_info/synthesis/xx_decompose/utilities.py +40 -0
  713. qiskit/quantum_info/synthesis/xx_decompose/weyl.py +133 -0
  714. qiskit/result/__init__.py +67 -0
  715. qiskit/result/counts.py +189 -0
  716. qiskit/result/distributions/__init__.py +17 -0
  717. qiskit/result/distributions/probability.py +100 -0
  718. qiskit/result/distributions/quasi.py +154 -0
  719. qiskit/result/exceptions.py +40 -0
  720. qiskit/result/mitigation/__init__.py +13 -0
  721. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  722. qiskit/result/mitigation/correlated_readout_mitigator.py +268 -0
  723. qiskit/result/mitigation/local_readout_mitigator.py +319 -0
  724. qiskit/result/mitigation/utils.py +161 -0
  725. qiskit/result/models.py +233 -0
  726. qiskit/result/postprocess.py +239 -0
  727. qiskit/result/result.py +397 -0
  728. qiskit/result/sampled_expval.py +75 -0
  729. qiskit/result/utils.py +295 -0
  730. qiskit/scheduler/__init__.py +31 -0
  731. qiskit/scheduler/config.py +35 -0
  732. qiskit/scheduler/lowering.py +187 -0
  733. qiskit/scheduler/methods/__init__.py +22 -0
  734. qiskit/scheduler/methods/basic.py +137 -0
  735. qiskit/scheduler/schedule_circuit.py +67 -0
  736. qiskit/scheduler/sequence.py +102 -0
  737. qiskit/synthesis/__init__.py +122 -0
  738. qiskit/synthesis/clifford/__init__.py +19 -0
  739. qiskit/synthesis/clifford/clifford_decompose_ag.py +176 -0
  740. qiskit/synthesis/clifford/clifford_decompose_bm.py +276 -0
  741. qiskit/synthesis/clifford/clifford_decompose_full.py +61 -0
  742. qiskit/synthesis/clifford/clifford_decompose_greedy.py +347 -0
  743. qiskit/synthesis/clifford/clifford_decompose_layers.py +443 -0
  744. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  745. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +46 -0
  746. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +140 -0
  747. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +264 -0
  748. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  749. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  750. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  751. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  752. qiskit/synthesis/discrete_basis/solovay_kitaev.py +207 -0
  753. qiskit/synthesis/evolution/__init__.py +20 -0
  754. qiskit/synthesis/evolution/evolution_synthesis.py +46 -0
  755. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  756. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  757. qiskit/synthesis/evolution/product_formula.py +328 -0
  758. qiskit/synthesis/evolution/qdrift.py +102 -0
  759. qiskit/synthesis/evolution/suzuki_trotter.py +145 -0
  760. qiskit/synthesis/linear/__init__.py +25 -0
  761. qiskit/synthesis/linear/cnot_synth.py +141 -0
  762. qiskit/synthesis/linear/linear_circuits_utils.py +127 -0
  763. qiskit/synthesis/linear/linear_depth_lnn.py +275 -0
  764. qiskit/synthesis/linear/linear_matrix_utils.py +175 -0
  765. qiskit/synthesis/linear_phase/__init__.py +17 -0
  766. qiskit/synthesis/linear_phase/cnot_phase_synth.py +203 -0
  767. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  768. qiskit/synthesis/linear_phase/cz_depth_lnn.py +206 -0
  769. qiskit/synthesis/permutation/__init__.py +17 -0
  770. qiskit/synthesis/permutation/permutation_full.py +90 -0
  771. qiskit/synthesis/permutation/permutation_lnn.py +68 -0
  772. qiskit/synthesis/permutation/permutation_utils.py +73 -0
  773. qiskit/synthesis/stabilizer/__init__.py +15 -0
  774. qiskit/synthesis/stabilizer/stabilizer_decompose.py +188 -0
  775. qiskit/test/__init__.py +18 -0
  776. qiskit/test/_canonical.py +125 -0
  777. qiskit/test/base.py +331 -0
  778. qiskit/test/decorators.py +308 -0
  779. qiskit/test/ibmq_mock.py +45 -0
  780. qiskit/test/mock/__init__.py +40 -0
  781. qiskit/test/mock/backends/__init__.py +32 -0
  782. qiskit/test/mock/backends/almaden/__init__.py +32 -0
  783. qiskit/test/mock/backends/armonk/__init__.py +32 -0
  784. qiskit/test/mock/backends/athens/__init__.py +32 -0
  785. qiskit/test/mock/backends/belem/__init__.py +32 -0
  786. qiskit/test/mock/backends/boeblingen/__init__.py +32 -0
  787. qiskit/test/mock/backends/bogota/__init__.py +32 -0
  788. qiskit/test/mock/backends/brooklyn/__init__.py +32 -0
  789. qiskit/test/mock/backends/burlington/__init__.py +32 -0
  790. qiskit/test/mock/backends/cairo/__init__.py +32 -0
  791. qiskit/test/mock/backends/cambridge/__init__.py +32 -0
  792. qiskit/test/mock/backends/casablanca/__init__.py +32 -0
  793. qiskit/test/mock/backends/essex/__init__.py +32 -0
  794. qiskit/test/mock/backends/guadalupe/__init__.py +32 -0
  795. qiskit/test/mock/backends/hanoi/__init__.py +32 -0
  796. qiskit/test/mock/backends/jakarta/__init__.py +32 -0
  797. qiskit/test/mock/backends/johannesburg/__init__.py +32 -0
  798. qiskit/test/mock/backends/kolkata/__init__.py +32 -0
  799. qiskit/test/mock/backends/lagos/__init__.py +32 -0
  800. qiskit/test/mock/backends/lima/__init__.py +32 -0
  801. qiskit/test/mock/backends/london/__init__.py +32 -0
  802. qiskit/test/mock/backends/manhattan/__init__.py +32 -0
  803. qiskit/test/mock/backends/manila/__init__.py +32 -0
  804. qiskit/test/mock/backends/melbourne/__init__.py +32 -0
  805. qiskit/test/mock/backends/montreal/__init__.py +32 -0
  806. qiskit/test/mock/backends/mumbai/__init__.py +32 -0
  807. qiskit/test/mock/backends/nairobi/__init__.py +32 -0
  808. qiskit/test/mock/backends/ourense/__init__.py +32 -0
  809. qiskit/test/mock/backends/paris/__init__.py +32 -0
  810. qiskit/test/mock/backends/poughkeepsie/__init__.py +32 -0
  811. qiskit/test/mock/backends/quito/__init__.py +32 -0
  812. qiskit/test/mock/backends/rochester/__init__.py +32 -0
  813. qiskit/test/mock/backends/rome/__init__.py +32 -0
  814. qiskit/test/mock/backends/rueschlikon/__init__.py +32 -0
  815. qiskit/test/mock/backends/santiago/__init__.py +32 -0
  816. qiskit/test/mock/backends/singapore/__init__.py +32 -0
  817. qiskit/test/mock/backends/sydney/__init__.py +32 -0
  818. qiskit/test/mock/backends/tenerife/__init__.py +32 -0
  819. qiskit/test/mock/backends/tokyo/__init__.py +32 -0
  820. qiskit/test/mock/backends/toronto/__init__.py +32 -0
  821. qiskit/test/mock/backends/valencia/__init__.py +32 -0
  822. qiskit/test/mock/backends/vigo/__init__.py +32 -0
  823. qiskit/test/mock/backends/washington/__init__.py +32 -0
  824. qiskit/test/mock/backends/yorktown/__init__.py +32 -0
  825. qiskit/test/providers/__init__.py +16 -0
  826. qiskit/test/providers/backend.py +75 -0
  827. qiskit/test/providers/provider.py +59 -0
  828. qiskit/test/reference_circuits.py +41 -0
  829. qiskit/test/testing_options.py +93 -0
  830. qiskit/test/utils.py +87 -0
  831. qiskit/tools/__init__.py +44 -0
  832. qiskit/tools/events/__init__.py +25 -0
  833. qiskit/tools/events/progressbar.py +195 -0
  834. qiskit/tools/events/pubsub.py +158 -0
  835. qiskit/tools/jupyter/__init__.py +138 -0
  836. qiskit/tools/jupyter/backend_monitor.py +588 -0
  837. qiskit/tools/jupyter/backend_overview.py +322 -0
  838. qiskit/tools/jupyter/copyright.py +42 -0
  839. qiskit/tools/jupyter/job_watcher.py +167 -0
  840. qiskit/tools/jupyter/job_widgets.py +160 -0
  841. qiskit/tools/jupyter/jupyter_magics.py +190 -0
  842. qiskit/tools/jupyter/library.py +189 -0
  843. qiskit/tools/jupyter/monospace.py +29 -0
  844. qiskit/tools/jupyter/progressbar.py +122 -0
  845. qiskit/tools/jupyter/version_table.py +67 -0
  846. qiskit/tools/jupyter/watcher_monitor.py +74 -0
  847. qiskit/tools/monitor/__init__.py +16 -0
  848. qiskit/tools/monitor/job_monitor.py +107 -0
  849. qiskit/tools/monitor/overview.py +247 -0
  850. qiskit/tools/parallel.py +198 -0
  851. qiskit/tools/visualization.py +16 -0
  852. qiskit/transpiler/__init__.py +1287 -0
  853. qiskit/transpiler/basepasses.py +221 -0
  854. qiskit/transpiler/coupling.py +500 -0
  855. qiskit/transpiler/exceptions.py +55 -0
  856. qiskit/transpiler/fencedobjs.py +78 -0
  857. qiskit/transpiler/instruction_durations.py +278 -0
  858. qiskit/transpiler/layout.py +658 -0
  859. qiskit/transpiler/passes/__init__.py +296 -0
  860. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  861. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  862. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  863. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  864. qiskit/transpiler/passes/analysis/depth.py +33 -0
  865. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  866. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  867. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  868. qiskit/transpiler/passes/analysis/size.py +36 -0
  869. qiskit/transpiler/passes/analysis/width.py +27 -0
  870. qiskit/transpiler/passes/basis/__init__.py +20 -0
  871. qiskit/transpiler/passes/basis/basis_translator.py +697 -0
  872. qiskit/transpiler/passes/basis/decompose.py +98 -0
  873. qiskit/transpiler/passes/basis/translate_parameterized.py +177 -0
  874. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +86 -0
  875. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +107 -0
  876. qiskit/transpiler/passes/basis/unroller.py +145 -0
  877. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  878. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  879. qiskit/transpiler/passes/calibration/builders.py +20 -0
  880. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  881. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  882. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  883. qiskit/transpiler/passes/calibration/rzx_builder.py +394 -0
  884. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  885. qiskit/transpiler/passes/layout/__init__.py +27 -0
  886. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  887. qiskit/transpiler/passes/layout/apply_layout.py +108 -0
  888. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  889. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  890. qiskit/transpiler/passes/layout/disjoint_utils.py +205 -0
  891. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  892. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  893. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  894. qiskit/transpiler/passes/layout/noise_adaptive_layout.py +311 -0
  895. qiskit/transpiler/passes/layout/sabre_layout.py +468 -0
  896. qiskit/transpiler/passes/layout/sabre_pre_layout.py +217 -0
  897. qiskit/transpiler/passes/layout/set_layout.py +64 -0
  898. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  899. qiskit/transpiler/passes/layout/vf2_layout.py +257 -0
  900. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  901. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  902. qiskit/transpiler/passes/optimization/__init__.py +38 -0
  903. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  904. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  905. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  906. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  907. qiskit/transpiler/passes/optimization/collect_cliffords.py +97 -0
  908. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  909. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  910. qiskit/transpiler/passes/optimization/commutation_analysis.py +93 -0
  911. qiskit/transpiler/passes/optimization/commutative_cancellation.py +207 -0
  912. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +97 -0
  913. qiskit/transpiler/passes/optimization/consolidate_blocks.py +219 -0
  914. qiskit/transpiler/passes/optimization/crosstalk_adaptive_schedule.py +732 -0
  915. qiskit/transpiler/passes/optimization/cx_cancellation.py +55 -0
  916. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  917. qiskit/transpiler/passes/optimization/hoare_opt.py +416 -0
  918. qiskit/transpiler/passes/optimization/inverse_cancellation.py +177 -0
  919. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  920. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  921. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +263 -0
  922. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  923. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  924. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  925. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +69 -0
  926. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  927. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  928. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  929. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  930. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +454 -0
  931. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  932. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  933. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +629 -0
  934. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  935. qiskit/transpiler/passes/routing/__init__.py +21 -0
  936. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  937. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  938. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  939. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  940. qiskit/transpiler/passes/routing/basic_swap.py +155 -0
  941. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  942. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  943. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +387 -0
  944. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +141 -0
  945. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  946. qiskit/transpiler/passes/routing/layout_transformation.py +118 -0
  947. qiskit/transpiler/passes/routing/lookahead_swap.py +384 -0
  948. qiskit/transpiler/passes/routing/sabre_swap.py +430 -0
  949. qiskit/transpiler/passes/routing/stochastic_swap.py +512 -0
  950. qiskit/transpiler/passes/routing/utils.py +35 -0
  951. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  952. qiskit/transpiler/passes/scheduling/alap.py +155 -0
  953. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  954. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +256 -0
  955. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +75 -0
  956. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +97 -0
  957. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +241 -0
  958. qiskit/transpiler/passes/scheduling/asap.py +177 -0
  959. qiskit/transpiler/passes/scheduling/base_scheduler.py +289 -0
  960. qiskit/transpiler/passes/scheduling/calibration_creators.py +27 -0
  961. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +285 -0
  962. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  963. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  964. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +408 -0
  965. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  966. qiskit/transpiler/passes/scheduling/rzx_templates.py +28 -0
  967. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  968. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  969. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  970. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +89 -0
  971. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  972. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +135 -0
  973. qiskit/transpiler/passes/synthesis/__init__.py +19 -0
  974. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +637 -0
  975. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +63 -0
  976. qiskit/transpiler/passes/synthesis/plugin.py +597 -0
  977. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +289 -0
  978. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +895 -0
  979. qiskit/transpiler/passes/utils/__init__.py +34 -0
  980. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  981. qiskit/transpiler/passes/utils/block_to_matrix.py +47 -0
  982. qiskit/transpiler/passes/utils/check_gate_direction.py +87 -0
  983. qiskit/transpiler/passes/utils/check_map.py +94 -0
  984. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  985. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  986. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +89 -0
  987. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  988. qiskit/transpiler/passes/utils/error.py +69 -0
  989. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  990. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  991. qiskit/transpiler/passes/utils/gate_direction.py +347 -0
  992. qiskit/transpiler/passes/utils/gates_basis.py +75 -0
  993. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  994. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  995. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  996. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  997. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  998. qiskit/transpiler/passmanager.py +617 -0
  999. qiskit/transpiler/passmanager_config.py +193 -0
  1000. qiskit/transpiler/preset_passmanagers/__init__.py +280 -0
  1001. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +971 -0
  1002. qiskit/transpiler/preset_passmanagers/common.py +651 -0
  1003. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  1004. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  1005. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  1006. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  1007. qiskit/transpiler/preset_passmanagers/plugin.py +345 -0
  1008. qiskit/transpiler/propertyset.py +19 -0
  1009. qiskit/transpiler/runningpassmanager.py +174 -0
  1010. qiskit/transpiler/synthesis/__init__.py +16 -0
  1011. qiskit/transpiler/synthesis/aqc/__init__.py +178 -0
  1012. qiskit/transpiler/synthesis/aqc/approximate.py +116 -0
  1013. qiskit/transpiler/synthesis/aqc/aqc.py +170 -0
  1014. qiskit/transpiler/synthesis/aqc/aqc_plugin.py +146 -0
  1015. qiskit/transpiler/synthesis/aqc/cnot_structures.py +299 -0
  1016. qiskit/transpiler/synthesis/aqc/cnot_unit_circuit.py +103 -0
  1017. qiskit/transpiler/synthesis/aqc/cnot_unit_objective.py +299 -0
  1018. qiskit/transpiler/synthesis/aqc/elementary_operations.py +108 -0
  1019. qiskit/transpiler/synthesis/aqc/fast_gradient/__init__.py +164 -0
  1020. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_grad_utils.py +237 -0
  1021. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_gradient.py +225 -0
  1022. qiskit/transpiler/synthesis/aqc/fast_gradient/layer.py +370 -0
  1023. qiskit/transpiler/synthesis/aqc/fast_gradient/pmatrix.py +312 -0
  1024. qiskit/transpiler/synthesis/graysynth.py +114 -0
  1025. qiskit/transpiler/target.py +1540 -0
  1026. qiskit/transpiler/timing_constraints.py +59 -0
  1027. qiskit/user_config.py +239 -0
  1028. qiskit/utils/__init__.py +66 -0
  1029. qiskit/utils/classtools.py +146 -0
  1030. qiskit/utils/deprecation.py +489 -0
  1031. qiskit/utils/lazy_tester.py +334 -0
  1032. qiskit/utils/multiprocessing.py +48 -0
  1033. qiskit/utils/optionals.py +320 -0
  1034. qiskit/utils/units.py +143 -0
  1035. qiskit/version.py +84 -0
  1036. qiskit/visualization/__init__.py +289 -0
  1037. qiskit/visualization/array.py +204 -0
  1038. qiskit/visualization/bloch.py +741 -0
  1039. qiskit/visualization/circuit/__init__.py +15 -0
  1040. qiskit/visualization/circuit/_utils.py +633 -0
  1041. qiskit/visualization/circuit/circuit_visualization.py +717 -0
  1042. qiskit/visualization/circuit/latex.py +659 -0
  1043. qiskit/visualization/circuit/matplotlib.py +1975 -0
  1044. qiskit/visualization/circuit/qcstyle.py +420 -0
  1045. qiskit/visualization/circuit/styles/bw.json +202 -0
  1046. qiskit/visualization/circuit/styles/clifford.json +202 -0
  1047. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  1048. qiskit/visualization/circuit/styles/iqp.json +214 -0
  1049. qiskit/visualization/circuit/styles/textbook.json +202 -0
  1050. qiskit/visualization/circuit/text.py +1802 -0
  1051. qiskit/visualization/circuit_visualization.py +19 -0
  1052. qiskit/visualization/counts_visualization.py +496 -0
  1053. qiskit/visualization/dag_visualization.py +224 -0
  1054. qiskit/visualization/exceptions.py +21 -0
  1055. qiskit/visualization/gate_map.py +1461 -0
  1056. qiskit/visualization/pass_manager_visualization.py +281 -0
  1057. qiskit/visualization/pulse_v2/__init__.py +21 -0
  1058. qiskit/visualization/pulse_v2/core.py +905 -0
  1059. qiskit/visualization/pulse_v2/device_info.py +146 -0
  1060. qiskit/visualization/pulse_v2/drawings.py +253 -0
  1061. qiskit/visualization/pulse_v2/events.py +254 -0
  1062. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  1063. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  1064. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  1065. qiskit/visualization/pulse_v2/generators/frame.py +437 -0
  1066. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  1067. qiskit/visualization/pulse_v2/generators/waveform.py +649 -0
  1068. qiskit/visualization/pulse_v2/interface.py +452 -0
  1069. qiskit/visualization/pulse_v2/layouts.py +395 -0
  1070. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  1071. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  1072. qiskit/visualization/pulse_v2/plotters/matplotlib.py +202 -0
  1073. qiskit/visualization/pulse_v2/stylesheet.py +322 -0
  1074. qiskit/visualization/pulse_v2/types.py +242 -0
  1075. qiskit/visualization/qcstyle.py +17 -0
  1076. qiskit/visualization/state_visualization.py +1518 -0
  1077. qiskit/visualization/timeline/__init__.py +21 -0
  1078. qiskit/visualization/timeline/core.py +457 -0
  1079. qiskit/visualization/timeline/drawings.py +260 -0
  1080. qiskit/visualization/timeline/generators.py +506 -0
  1081. qiskit/visualization/timeline/interface.py +414 -0
  1082. qiskit/visualization/timeline/layouts.py +115 -0
  1083. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  1084. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  1085. qiskit/visualization/timeline/plotters/matplotlib.py +193 -0
  1086. qiskit/visualization/timeline/stylesheet.py +311 -0
  1087. qiskit/visualization/timeline/types.py +148 -0
  1088. qiskit/visualization/transition_visualization.py +364 -0
  1089. qiskit/visualization/utils.py +49 -0
  1090. qiskit-1.0.0b1.dist-info/LICENSE.txt +203 -0
  1091. qiskit-1.0.0b1.dist-info/METADATA +430 -0
  1092. qiskit-1.0.0b1.dist-info/RECORD +1095 -0
  1093. qiskit-1.0.0b1.dist-info/WHEEL +6 -0
  1094. qiskit-1.0.0b1.dist-info/entry_points.txt +49 -0
  1095. qiskit-1.0.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1962 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2020.
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
+ # pylint: disable=invalid-name
14
+
15
+ """Symbolic waveform module.
16
+
17
+ These are pulses which are described by symbolic equations for their envelopes and for their
18
+ parameter constraints.
19
+ """
20
+ import functools
21
+ import warnings
22
+ from typing import Any, Dict, List, Optional, Union, Callable, Tuple
23
+ from copy import deepcopy
24
+
25
+ import numpy as np
26
+ import symengine as sym
27
+
28
+ from qiskit.circuit.parameterexpression import ParameterExpression, ParameterValueType
29
+ from qiskit.pulse.exceptions import PulseError
30
+ from qiskit.pulse.library.pulse import Pulse
31
+ from qiskit.pulse.library.waveform import Waveform
32
+ from qiskit.utils.deprecation import deprecate_arg
33
+
34
+
35
+ def _lifted_gaussian(
36
+ t: sym.Symbol,
37
+ center: Union[sym.Symbol, sym.Expr, complex],
38
+ t_zero: Union[sym.Symbol, sym.Expr, complex],
39
+ sigma: Union[sym.Symbol, sym.Expr, complex],
40
+ ) -> sym.Expr:
41
+ r"""Helper function that returns a lifted Gaussian symbolic equation.
42
+
43
+ For :math:`\sigma=` ``sigma`` the symbolic equation will be
44
+
45
+ .. math::
46
+
47
+ f(x) = \exp\left(-\frac12 \left(\frac{x - \mu}{\sigma}\right)^2 \right),
48
+
49
+ with the center :math:`\mu=` ``duration/2``.
50
+ Then, each output sample :math:`y` is modified according to:
51
+
52
+ .. math::
53
+
54
+ y \mapsto \frac{y-y^*}{1.0-y^*},
55
+
56
+ where :math:`y^*` is the value of the un-normalized Gaussian at the endpoints of the pulse.
57
+ This sets the endpoints to :math:`0` while preserving the amplitude at the center,
58
+ i.e. :math:`y` is set to :math:`1.0`.
59
+
60
+ Args:
61
+ t: Symbol object representing time.
62
+ center: Symbol or expression representing the middle point of the samples.
63
+ t_zero: The value of t at which the pulse is lowered to 0.
64
+ sigma: Symbol or expression representing Gaussian sigma.
65
+
66
+ Returns:
67
+ Symbolic equation.
68
+ """
69
+ # Sympy automatically does expand.
70
+ # This causes expression inconsistency after qpy round-trip serializing through sympy.
71
+ # See issue for details: https://github.com/symengine/symengine.py/issues/409
72
+ t_shifted = (t - center).expand()
73
+ t_offset = (t_zero - center).expand()
74
+
75
+ gauss = sym.exp(-((t_shifted / sigma) ** 2) / 2)
76
+ offset = sym.exp(-((t_offset / sigma) ** 2) / 2)
77
+
78
+ return (gauss - offset) / (1 - offset)
79
+
80
+
81
+ @functools.lru_cache(maxsize=None)
82
+ def _is_amplitude_valid(envelope_lam: Callable, time: Tuple[float, ...], *fargs: float) -> bool:
83
+ """A helper function to validate maximum amplitude limit.
84
+
85
+ Result is cached for better performance.
86
+
87
+ Args:
88
+ envelope_lam: The SymbolicPulse's lambdified envelope_lam expression.
89
+ time: The SymbolicPulse's time array, given as a tuple for hashability.
90
+ fargs: The arguments for the lambdified envelope_lam, as given by `_get_expression_args`,
91
+ except for the time array.
92
+
93
+ Returns:
94
+ Return True if no sample point exceeds 1.0 in absolute value.
95
+ """
96
+
97
+ time = np.asarray(time, dtype=float)
98
+ samples_norm = np.abs(envelope_lam(time, *fargs))
99
+ epsilon = 1e-7 # The value of epsilon mimics that of Waveform._clip()
100
+ return np.all(samples_norm < 1.0 + epsilon)
101
+
102
+
103
+ def _get_expression_args(expr: sym.Expr, params: Dict[str, float]) -> List[float]:
104
+ """A helper function to get argument to evaluate expression.
105
+
106
+ Args:
107
+ expr: Symbolic expression to evaluate.
108
+ params: Dictionary of parameter, which is a superset of expression arguments.
109
+
110
+ Returns:
111
+ Arguments passed to the lambdified expression.
112
+
113
+ Raises:
114
+ PulseError: When a free symbol value is not defined in the pulse instance parameters.
115
+ """
116
+ args = []
117
+ for symbol in sorted(expr.free_symbols, key=lambda s: s.name):
118
+ if symbol.name == "t":
119
+ # 't' is a special parameter to represent time vector.
120
+ # This should be place at first to broadcast other parameters
121
+ # in symengine lambdify function.
122
+ times = np.arange(0, params["duration"]) + 1 / 2
123
+ args.insert(0, times)
124
+ continue
125
+ try:
126
+ args.append(params[symbol.name])
127
+ except KeyError as ex:
128
+ raise PulseError(
129
+ f"Pulse parameter '{symbol.name}' is not defined for this instance. "
130
+ "Please check your waveform expression is correct."
131
+ ) from ex
132
+ return args
133
+
134
+
135
+ class LambdifiedExpression:
136
+ """Descriptor to lambdify symbolic expression with cache.
137
+
138
+ When a new symbolic expression is assigned for the first time, :class:`.LambdifiedExpression`
139
+ will internally lambdify the expressions and store the resulting callbacks in its cache.
140
+ The next time it encounters the same expression it will return the cached callbacks
141
+ thereby increasing the code's speed.
142
+
143
+ Note that this class is a python `Descriptor`_, and thus not intended to be
144
+ directly called by end-users. This class is designed to be attached to the
145
+ :class:`.SymbolicPulse` as attributes for symbolic expressions.
146
+
147
+ _`Descriptor`: https://docs.python.org/3/reference/datamodel.html#descriptors
148
+ """
149
+
150
+ def __init__(self, attribute: str):
151
+ """Create new descriptor.
152
+
153
+ Args:
154
+ attribute: Name of attribute of :class:`.SymbolicPulse` that returns
155
+ the target expression to evaluate.
156
+ """
157
+ self.attribute = attribute
158
+ self.lambda_funcs = {}
159
+
160
+ def __get__(self, instance, owner) -> Callable:
161
+ expr = getattr(instance, self.attribute, None)
162
+ if expr is None:
163
+ raise PulseError(f"'{self.attribute}' of '{instance.pulse_type}' is not assigned.")
164
+ key = hash(expr)
165
+ if key not in self.lambda_funcs:
166
+ self.__set__(instance, expr)
167
+
168
+ return self.lambda_funcs[key]
169
+
170
+ def __set__(self, instance, value):
171
+ key = hash(value)
172
+ if key not in self.lambda_funcs:
173
+ params = []
174
+ for p in sorted(value.free_symbols, key=lambda s: s.name):
175
+ if p.name == "t":
176
+ # Argument "t" must be placed at first. This is a vector.
177
+ params.insert(0, p)
178
+ continue
179
+ params.append(p)
180
+
181
+ try:
182
+ lamb = sym.lambdify(params, [value], real=False)
183
+
184
+ def _wrapped_lamb(*args):
185
+ if isinstance(args[0], np.ndarray):
186
+ # When the args[0] is a vector ("t"), tile other arguments args[1:]
187
+ # to prevent evaluation from looping over each element in t.
188
+ t = args[0]
189
+ args = np.hstack(
190
+ (
191
+ t.reshape(t.size, 1),
192
+ np.tile(args[1:], t.size).reshape(t.size, len(args) - 1),
193
+ )
194
+ )
195
+ return lamb(args)
196
+
197
+ func = _wrapped_lamb
198
+ except RuntimeError:
199
+ # Currently symengine doesn't support complex_double version for
200
+ # several functions such as comparison operator and piecewise.
201
+ # If expression contains these function, it fall back to sympy lambdify.
202
+ # See https://github.com/symengine/symengine.py/issues/406 for details.
203
+ import sympy
204
+
205
+ func = sympy.lambdify(params, value)
206
+
207
+ self.lambda_funcs[key] = func
208
+
209
+
210
+ class SymbolicPulse(Pulse):
211
+ r"""The pulse representation model with parameters and symbolic expressions.
212
+
213
+ A symbolic pulse instance can be defined with an envelope and parameter constraints.
214
+ Envelope and parameter constraints should be provided as symbolic expressions.
215
+ Rather than creating a subclass, different pulse shapes can be distinguished by
216
+ the instance attributes :attr:`SymbolicPulse.envelope` and :attr:`SymbolicPulse.pulse_type`.
217
+
218
+ The symbolic expressions must be defined either with SymPy_ or Symengine_.
219
+ Usually Symengine-based expression is much more performant for instantiation
220
+ of the :class:`SymbolicPulse`, however, it doesn't support every functions available in SymPy.
221
+ You may need to choose proper library depending on how you define your pulses.
222
+ Symengine works in the most envelopes and constraints, and thus it is recommended to use
223
+ this library especially when your program contains a lot of pulses.
224
+ Also note that Symengine has the limited platform support and may not be available
225
+ for your local system. Symengine is a required dependency for Qiskit on platforms
226
+ that support it will always be installed along with Qiskit on macOS ``x86_64`` and ``arm64``,
227
+ and Linux ``x86_64``, ``aarch64``, and ``ppc64le``.
228
+ For 64-bit Windows users they will need to manual install it.
229
+ For 32-bit platforms such as ``i686`` and ``armv7`` Linux, and on Linux ``s390x``
230
+ there are no pre-compiled packages available and to use symengine you'll need to
231
+ compile it from source. If Symengine is not available in your environment SymPy will be used.
232
+
233
+ .. _SymPy: https://www.sympy.org/en/index.html
234
+ .. _Symengine: https://symengine.org
235
+
236
+ .. _symbolic_pulse_envelope:
237
+
238
+ .. rubric:: Envelope function
239
+
240
+ The waveform at time :math:`t` is generated by the :meth:`get_waveform` according to
241
+
242
+ .. math::
243
+
244
+ F(t, \Theta) = \times F(t, {\rm duration}, \overline{\rm params})
245
+
246
+ where :math:`\Theta` is the set of full pulse parameters in the :attr:`SymbolicPulse.parameters`
247
+ dictionary which must include the :math:`\rm duration`.
248
+ Note that the :math:`F` is an envelope of the waveform, and a programmer must provide this
249
+ as a symbolic expression. :math:`\overline{\rm params}` can be arbitrary complex values
250
+ as long as they pass :meth:`.validate_parameters` and your quantum backend can accept.
251
+ The time :math:`t` and :math:`\rm duration` are in units of dt, i.e. sample time resolution,
252
+ and this function is sampled with a discrete time vector in :math:`[0, {\rm duration}]`
253
+ sampling the pulse envelope at every 0.5 dt (middle sampling strategy) when
254
+ the :meth:`SymbolicPulse.get_waveform` method is called.
255
+ The sample data is not generated until this method is called
256
+ thus a symbolic pulse instance only stores parameter values and waveform shape,
257
+ which greatly reduces memory footprint during the program generation.
258
+
259
+
260
+ .. _symbolic_pulse_validation:
261
+
262
+ .. rubric:: Pulse validation
263
+
264
+ When a symbolic pulse is instantiated, the method :meth:`.validate_parameters` is called,
265
+ and performs validation of the pulse. The validation process involves testing the constraint
266
+ functions and the maximal amplitude of the pulse (see below). While the validation process
267
+ will improve code stability, it will reduce performance and might create
268
+ compatibility issues (particularly with JAX). Therefore, it is possible to disable the
269
+ validation by setting the class attribute :attr:`.disable_validation` to ``True``.
270
+
271
+ .. _symbolic_pulse_constraints:
272
+
273
+ .. rubric:: Constraint functions
274
+
275
+ Constraints on the parameters are defined with an instance attribute
276
+ :attr:`SymbolicPulse.constraints` which can be provided through the constructor.
277
+ The constraints value must be a symbolic expression, which is a
278
+ function of parameters to be validated and must return a boolean value
279
+ being ``True`` when parameters are valid.
280
+ If there are multiple conditions to be evaluated, these conditions can be
281
+ concatenated with logical expressions such as ``And`` and ``Or`` in SymPy or Symengine.
282
+ The symbolic pulse instance can be played only when the constraint function returns ``True``.
283
+ The constraint is evaluated when :meth:`.validate_parameters` is called.
284
+
285
+
286
+ .. _symbolic_pulse_eval_condition:
287
+
288
+ .. rubric:: Maximum amplitude validation
289
+
290
+ When you play a pulse in a quantum backend, you might face the restriction on the power
291
+ that your waveform generator can handle. Usually, the pulse amplitude is normalized
292
+ by this maximum power, namely :math:`\max |F| \leq 1`. This condition is
293
+ evaluated along with above constraints when you set ``limit_amplitude = True`` in the constructor.
294
+ To evaluate maximum amplitude of the waveform, we need to call :meth:`get_waveform`.
295
+ However, this introduces a significant overhead in the validation, and this cannot be ignored
296
+ when you repeatedly instantiate symbolic pulse instances.
297
+ :attr:`SymbolicPulse.valid_amp_conditions` provides a condition to skip this waveform validation,
298
+ and the waveform is not generated as long as this condition returns ``True``,
299
+ so that `healthy` symbolic pulses are created very quick.
300
+ For example, for a simple pulse shape like ``amp * cos(f * t)``, we know that
301
+ pulse amplitude is valid as long as ``amp`` remains less than magnitude 1.0.
302
+ So ``abs(amp) <= 1`` could be passed as :attr:`SymbolicPulse.valid_amp_conditions` to skip
303
+ doing a full waveform evaluation for amplitude validation.
304
+ This expression is provided through the constructor. If this is not provided,
305
+ the waveform is generated everytime when :meth:`.validate_parameters` is called.
306
+
307
+
308
+ .. rubric:: Examples
309
+
310
+ This is how a user can instantiate a symbolic pulse instance.
311
+ In this example, we instantiate a custom `Sawtooth` envelope.
312
+
313
+ .. code-block::
314
+
315
+ from qiskit.pulse.library import SymbolicPulse
316
+
317
+ my_pulse = SymbolicPulse(
318
+ pulse_type="Sawtooth",
319
+ duration=100,
320
+ parameters={"amp": 0.1, "freq": 0.05},
321
+ name="pulse1",
322
+ )
323
+
324
+ Note that :class:`SymbolicPulse` can be instantiated without providing
325
+ the envelope and constraints. However, this instance cannot generate waveforms
326
+ without knowing the envelope definition. Now you need to provide the envelope.
327
+
328
+ .. plot::
329
+ :include-source:
330
+
331
+ import sympy
332
+ from qiskit.pulse.library import SymbolicPulse
333
+
334
+ t, amp, freq = sympy.symbols("t, amp, freq")
335
+ envelope = 2 * amp * (freq * t - sympy.floor(1 / 2 + freq * t))
336
+
337
+ my_pulse = SymbolicPulse(
338
+ pulse_type="Sawtooth",
339
+ duration=100,
340
+ parameters={"amp": 0.1, "freq": 0.05},
341
+ envelope=envelope,
342
+ name="pulse1",
343
+ )
344
+
345
+ my_pulse.draw()
346
+
347
+ Likewise, you can define :attr:`SymbolicPulse.constraints` for ``my_pulse``.
348
+ After providing the envelope definition, you can generate the waveform data.
349
+ Note that it would be convenient to define a factory function that automatically
350
+ accomplishes this procedure.
351
+
352
+ .. code-block:: python
353
+
354
+ def Sawtooth(duration, amp, freq, name):
355
+ t, amp, freq = sympy.symbols("t, amp, freq")
356
+
357
+ instance = SymbolicPulse(
358
+ pulse_type="Sawtooth",
359
+ duration=duration,
360
+ parameters={"amp": amp, "freq": freq},
361
+ envelope=2 * amp * (freq * t - sympy.floor(1 / 2 + freq * t)),
362
+ name=name,
363
+ )
364
+
365
+ return instance
366
+
367
+ You can also provide a :class:`Parameter` object in the ``parameters`` dictionary,
368
+ or define ``duration`` with a :class:`Parameter` object when you instantiate
369
+ the symbolic pulse instance.
370
+ A waveform cannot be generated until you assign all unbounded parameters.
371
+ Note that parameters will be assigned through the schedule playing the pulse.
372
+
373
+
374
+ .. _symbolic_pulse_serialize:
375
+
376
+ .. rubric:: Serialization
377
+
378
+ The :class:`~SymbolicPulse` subclass can be serialized along with the
379
+ symbolic expressions through :mod:`qiskit.qpy`.
380
+ A user can therefore create a custom pulse subclass with a novel envelope and constraints,
381
+ and then one can instantiate the class with certain parameters to run on a backend.
382
+ This pulse instance can be saved in the QPY binary, which can be loaded afterwards
383
+ even within the environment not having original class definition loaded.
384
+ This mechanism also allows us to easily share a pulse program including
385
+ custom pulse instructions with collaborators.
386
+ """
387
+
388
+ __slots__ = (
389
+ "_pulse_type",
390
+ "_params",
391
+ "_envelope",
392
+ "_constraints",
393
+ "_valid_amp_conditions",
394
+ )
395
+
396
+ disable_validation = False
397
+
398
+ # Lambdify caches keyed on sympy expressions. Returns the corresponding callable.
399
+ _envelope_lam = LambdifiedExpression("_envelope")
400
+ _constraints_lam = LambdifiedExpression("_constraints")
401
+ _valid_amp_conditions_lam = LambdifiedExpression("_valid_amp_conditions")
402
+
403
+ def __init__(
404
+ self,
405
+ pulse_type: str,
406
+ duration: Union[ParameterExpression, int],
407
+ parameters: Optional[Dict[str, Union[ParameterExpression, complex]]] = None,
408
+ name: Optional[str] = None,
409
+ limit_amplitude: Optional[bool] = None,
410
+ envelope: Optional[sym.Expr] = None,
411
+ constraints: Optional[sym.Expr] = None,
412
+ valid_amp_conditions: Optional[sym.Expr] = None,
413
+ ):
414
+ """Create a parametric pulse.
415
+
416
+ Args:
417
+ pulse_type: Display name of this pulse shape.
418
+ duration: Duration of pulse.
419
+ parameters: Dictionary of pulse parameters that defines the pulse envelope.
420
+ name: Display name for this particular pulse envelope.
421
+ limit_amplitude: If ``True``, then limit the absolute value of the amplitude of the
422
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
423
+ envelope: Pulse envelope expression.
424
+ constraints: Pulse parameter constraint expression.
425
+ valid_amp_conditions: Extra conditions to skip a full-waveform check for the
426
+ amplitude limit. If this condition is not met, then the validation routine
427
+ will investigate the full-waveform and raise an error when the amplitude norm
428
+ of any data point exceeds 1.0. If not provided, the validation always
429
+ creates a full-waveform.
430
+
431
+ Raises:
432
+ PulseError: When not all parameters are listed in the attribute :attr:`PARAM_DEF`.
433
+ """
434
+ super().__init__(
435
+ duration=duration,
436
+ name=name,
437
+ limit_amplitude=limit_amplitude,
438
+ )
439
+ if parameters is None:
440
+ parameters = {}
441
+
442
+ self._pulse_type = pulse_type
443
+ self._params = parameters
444
+
445
+ self._envelope = envelope
446
+ self._constraints = constraints
447
+ self._valid_amp_conditions = valid_amp_conditions
448
+ if not self.__class__.disable_validation:
449
+ self.validate_parameters()
450
+
451
+ def __getattr__(self, item):
452
+ # Get pulse parameters with attribute-like access.
453
+ params = object.__getattribute__(self, "_params")
454
+ if item not in params:
455
+ raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{item}'")
456
+ return params[item]
457
+
458
+ @property
459
+ def pulse_type(self) -> str:
460
+ """Return display name of the pulse shape."""
461
+ return self._pulse_type
462
+
463
+ @property
464
+ def envelope(self) -> sym.Expr:
465
+ """Return symbolic expression for the pulse envelope."""
466
+ return self._envelope
467
+
468
+ @property
469
+ def constraints(self) -> sym.Expr:
470
+ """Return symbolic expression for the pulse parameter constraints."""
471
+ return self._constraints
472
+
473
+ @property
474
+ def valid_amp_conditions(self) -> sym.Expr:
475
+ """Return symbolic expression for the pulse amplitude constraints."""
476
+ return self._valid_amp_conditions
477
+
478
+ def get_waveform(self) -> Waveform:
479
+ r"""Return a Waveform with samples filled according to the formula that the pulse
480
+ represents and the parameter values it contains.
481
+
482
+ Since the returned array is a discretized time series of the continuous function,
483
+ this method uses a midpoint sampler. For ``duration``, return:
484
+
485
+ .. math::
486
+
487
+ \{f(t+0.5) \in \mathbb{C} | t \in \mathbb{Z} \wedge 0<=t<\texttt{duration}\}
488
+
489
+ Returns:
490
+ A waveform representation of this pulse.
491
+
492
+ Raises:
493
+ PulseError: When parameters are not assigned.
494
+ PulseError: When expression for pulse envelope is not assigned.
495
+ """
496
+ if self.is_parameterized():
497
+ raise PulseError("Unassigned parameter exists. All parameters must be assigned.")
498
+
499
+ if self._envelope is None:
500
+ raise PulseError("Pulse envelope expression is not assigned.")
501
+
502
+ fargs = _get_expression_args(self._envelope, self.parameters)
503
+ return Waveform(samples=self._envelope_lam(*fargs), name=self.name)
504
+
505
+ def validate_parameters(self) -> None:
506
+ """Validate parameters.
507
+
508
+ Raises:
509
+ PulseError: If the parameters passed are not valid.
510
+ """
511
+ if self.is_parameterized():
512
+ return
513
+
514
+ if self._constraints is not None:
515
+ fargs = _get_expression_args(self._constraints, self.parameters)
516
+ if not bool(self._constraints_lam(*fargs)):
517
+ param_repr = ", ".join(f"{p}={v}" for p, v in self.parameters.items())
518
+ const_repr = str(self._constraints)
519
+ raise PulseError(
520
+ f"Assigned parameters {param_repr} violate following constraint: {const_repr}."
521
+ )
522
+
523
+ if self._limit_amplitude:
524
+ if self._valid_amp_conditions is not None:
525
+ fargs = _get_expression_args(self._valid_amp_conditions, self.parameters)
526
+ check_full_waveform = not bool(self._valid_amp_conditions_lam(*fargs))
527
+ else:
528
+ check_full_waveform = True
529
+
530
+ if check_full_waveform:
531
+ # Check full waveform only when the condition is satisified or
532
+ # evaluation condition is not provided.
533
+ # This operation is slower due to overhead of 'get_waveform'.
534
+ fargs = _get_expression_args(self._envelope, self.parameters)
535
+
536
+ if not _is_amplitude_valid(self._envelope_lam, tuple(fargs.pop(0)), *fargs):
537
+ param_repr = ", ".join(f"{p}={v}" for p, v in self.parameters.items())
538
+ raise PulseError(
539
+ f"Maximum pulse amplitude norm exceeds 1.0 with parameters {param_repr}."
540
+ "This can be overruled by setting Pulse.limit_amplitude."
541
+ )
542
+
543
+ def is_parameterized(self) -> bool:
544
+ """Return True iff the instruction is parameterized."""
545
+ return any(isinstance(val, ParameterExpression) for val in self.parameters.values())
546
+
547
+ @property
548
+ def parameters(self) -> Dict[str, Any]:
549
+ params = {"duration": self.duration}
550
+ params.update(self._params)
551
+ return params
552
+
553
+ def __eq__(self, other: "SymbolicPulse") -> bool:
554
+
555
+ if not isinstance(other, SymbolicPulse):
556
+ return NotImplemented
557
+
558
+ if self._pulse_type != other._pulse_type:
559
+ return False
560
+
561
+ if self._envelope != other._envelope:
562
+ return False
563
+
564
+ if self.parameters != other.parameters:
565
+ return False
566
+
567
+ return True
568
+
569
+ def __repr__(self) -> str:
570
+ param_repr = ", ".join(f"{p}={v}" for p, v in self.parameters.items())
571
+ return "{}({}{})".format(
572
+ self._pulse_type,
573
+ param_repr,
574
+ f", name='{self.name}'" if self.name is not None else "",
575
+ )
576
+
577
+ __hash__ = None
578
+
579
+
580
+ class ScalableSymbolicPulse(SymbolicPulse):
581
+ r"""Subclass of :class:`SymbolicPulse` for pulses with scalable envelope.
582
+
583
+ Instance of :class:`ScalableSymbolicPulse` behaves the same as an instance of
584
+ :class:`SymbolicPulse`, but its envelope is assumed to have a scalable form
585
+ :math:`\text{amp}\times\exp\left(i\times\text{angle}\right)\times\text{F}
586
+ \left(t,\text{parameters}\right)`,
587
+ where :math:`\text{F}` is some function describing the rest of the envelope,
588
+ and both `amp` and `angle` are real (float). Note that both `amp` and `angle` are
589
+ stored in the :attr:`parameters` dictionary of the :class:`ScalableSymbolicPulse`
590
+ instance.
591
+
592
+ When two :class:`ScalableSymbolicPulse` objects are equated, instead of comparing
593
+ `amp` and `angle` individually, only the complex amplitude
594
+ :math:'\text{amp}\times\exp\left(i\times\text{angle}\right)' is compared.
595
+ """
596
+
597
+ @deprecate_arg(
598
+ "amp",
599
+ deprecation_description=(
600
+ "Setting ``amp`` to a complex in the ScalableSymbolicPulse constructor"
601
+ ),
602
+ additional_msg=(
603
+ "Instead, use a float for ``amp`` (for the magnitude) and a float for ``angle``"
604
+ ),
605
+ since="0.25.0",
606
+ package_name="qiskit-terra",
607
+ pending=False,
608
+ predicate=lambda amp: isinstance(amp, complex),
609
+ )
610
+ def __init__(
611
+ self,
612
+ pulse_type: str,
613
+ duration: Union[ParameterExpression, int],
614
+ amp: ParameterValueType,
615
+ angle: ParameterValueType,
616
+ parameters: Optional[Dict[str, Union[ParameterExpression, complex]]] = None,
617
+ name: Optional[str] = None,
618
+ limit_amplitude: Optional[bool] = None,
619
+ envelope: Optional[sym.Expr] = None,
620
+ constraints: Optional[sym.Expr] = None,
621
+ valid_amp_conditions: Optional[sym.Expr] = None,
622
+ ):
623
+ """Create a scalable symbolic pulse.
624
+
625
+ Args:
626
+ pulse_type: Display name of this pulse shape.
627
+ duration: Duration of pulse.
628
+ amp: The magnitude of the complex amplitude of the pulse.
629
+ angle: The phase of the complex amplitude of the pulse.
630
+ parameters: Dictionary of pulse parameters that defines the pulse envelope.
631
+ name: Display name for this particular pulse envelope.
632
+ limit_amplitude: If ``True``, then limit the absolute value of the amplitude of the
633
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
634
+ envelope: Pulse envelope expression.
635
+ constraints: Pulse parameter constraint expression.
636
+ valid_amp_conditions: Extra conditions to skip a full-waveform check for the
637
+ amplitude limit. If this condition is not met, then the validation routine
638
+ will investigate the full-waveform and raise an error when the amplitude norm
639
+ of any data point exceeds 1.0. If not provided, the validation always
640
+ creates a full-waveform.
641
+
642
+ Raises:
643
+ PulseError: If both `amp` is complex and `angle` is not `None` or 0.
644
+ """
645
+ # This should be removed once complex amp support is removed.
646
+ if isinstance(amp, complex) and angle is not None and angle != 0:
647
+ raise PulseError("amp can't be complex with angle not None or 0")
648
+
649
+ if angle is None:
650
+ angle = 0
651
+
652
+ if not isinstance(parameters, Dict):
653
+ parameters = {"amp": amp, "angle": angle}
654
+ else:
655
+ parameters = deepcopy(parameters)
656
+ parameters["amp"] = amp
657
+ parameters["angle"] = angle
658
+
659
+ super().__init__(
660
+ pulse_type=pulse_type,
661
+ duration=duration,
662
+ parameters=parameters,
663
+ name=name,
664
+ limit_amplitude=limit_amplitude,
665
+ envelope=envelope,
666
+ constraints=constraints,
667
+ valid_amp_conditions=valid_amp_conditions,
668
+ )
669
+
670
+ # pylint: disable=too-many-return-statements
671
+ def __eq__(self, other: "ScalableSymbolicPulse") -> bool:
672
+ if not isinstance(other, ScalableSymbolicPulse):
673
+ return NotImplemented
674
+
675
+ if self._pulse_type != other._pulse_type:
676
+ return False
677
+
678
+ if self._envelope != other._envelope:
679
+ return False
680
+
681
+ complex_amp1 = self.amp * np.exp(1j * self.angle)
682
+ complex_amp2 = other.amp * np.exp(1j * other.angle)
683
+
684
+ if isinstance(complex_amp1, ParameterExpression) or isinstance(
685
+ complex_amp2, ParameterExpression
686
+ ):
687
+ if complex_amp1 != complex_amp2:
688
+ return False
689
+ else:
690
+ if not np.isclose(complex_amp1, complex_amp2):
691
+ return False
692
+
693
+ for key in self.parameters:
694
+ if key not in ["amp", "angle"] and self.parameters[key] != other.parameters[key]:
695
+ return False
696
+
697
+ return True
698
+
699
+
700
+ class _PulseType(type):
701
+ """Metaclass to warn at isinstance check."""
702
+
703
+ def __instancecheck__(cls, instance):
704
+ cls_alias = getattr(cls, "alias", None)
705
+
706
+ # TODO promote this to Deprecation warning in future.
707
+ # Once type information usage is removed from user code,
708
+ # we will convert pulse classes into functions.
709
+ warnings.warn(
710
+ "Typechecking with the symbolic pulse subclass will be deprecated. "
711
+ f"'{cls_alias}' subclass instance is turned into SymbolicPulse instance. "
712
+ f"Use self.pulse_type == '{cls_alias}' instead.",
713
+ PendingDeprecationWarning,
714
+ )
715
+
716
+ if not isinstance(instance, SymbolicPulse):
717
+ return False
718
+ return instance.pulse_type == cls_alias
719
+
720
+ def __getattr__(cls, item):
721
+ # For pylint. A SymbolicPulse subclass must implement several methods
722
+ # such as .get_waveform and .validate_parameters.
723
+ # In addition, they conventionally offer attribute-like access to the pulse parameters,
724
+ # for example, instance.amp returns instance._params["amp"].
725
+ # If pulse classes are directly instantiated, pylint yells no-member
726
+ # since the pulse class itself implements nothing. These classes just
727
+ # behave like a factory by internally instantiating the SymbolicPulse and return it.
728
+ # It is not realistic to write disable=no-member across qiskit packages.
729
+ return NotImplemented
730
+
731
+
732
+ class Gaussian(metaclass=_PulseType):
733
+ r"""A lifted and truncated pulse envelope shaped according to the Gaussian function whose
734
+ mean is centered at the center of the pulse (duration / 2):
735
+
736
+ .. math::
737
+
738
+ f'(x) &= \exp\Bigl( -\frac12 \frac{{(x - \text{duration}/2)}^2}{\text{sigma}^2} \Bigr)\\
739
+ f(x) &= \text{A} \times \frac{f'(x) - f'(-1)}{1-f'(-1)}, \quad 0 \le x < \text{duration}
740
+
741
+ where :math:`f'(x)` is the gaussian waveform without lifting or amplitude scaling, and
742
+ :math:`\text{A} = \text{amp} \times \exp\left(i\times\text{angle}\right)`.
743
+ """
744
+
745
+ alias = "Gaussian"
746
+
747
+ def __new__(
748
+ cls,
749
+ duration: Union[int, ParameterExpression],
750
+ amp: ParameterValueType,
751
+ sigma: ParameterValueType,
752
+ angle: Optional[ParameterValueType] = None,
753
+ name: Optional[str] = None,
754
+ limit_amplitude: Optional[bool] = None,
755
+ ) -> ScalableSymbolicPulse:
756
+ """Create new pulse instance.
757
+
758
+ Args:
759
+ duration: Pulse length in terms of the sampling period `dt`.
760
+ amp: The magnitude of the amplitude of the Gaussian envelope.
761
+ Complex amp support is deprecated.
762
+ sigma: A measure of how wide or narrow the Gaussian peak is; described mathematically
763
+ in the class docstring.
764
+ angle: The angle of the complex amplitude of the Gaussian envelope. Default value 0.
765
+ name: Display name for this pulse envelope.
766
+ limit_amplitude: If ``True``, then limit the amplitude of the
767
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
768
+
769
+ Returns:
770
+ ScalableSymbolicPulse instance.
771
+ """
772
+ parameters = {"sigma": sigma}
773
+
774
+ # Prepare symbolic expressions
775
+ _t, _duration, _amp, _sigma, _angle = sym.symbols("t, duration, amp, sigma, angle")
776
+ _center = _duration / 2
777
+
778
+ envelope_expr = (
779
+ _amp * sym.exp(sym.I * _angle) * _lifted_gaussian(_t, _center, _duration + 1, _sigma)
780
+ )
781
+
782
+ consts_expr = _sigma > 0
783
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
784
+
785
+ return ScalableSymbolicPulse(
786
+ pulse_type=cls.alias,
787
+ duration=duration,
788
+ amp=amp,
789
+ angle=angle,
790
+ parameters=parameters,
791
+ name=name,
792
+ limit_amplitude=limit_amplitude,
793
+ envelope=envelope_expr,
794
+ constraints=consts_expr,
795
+ valid_amp_conditions=valid_amp_conditions_expr,
796
+ )
797
+
798
+
799
+ class GaussianSquare(metaclass=_PulseType):
800
+ """A square pulse with a Gaussian shaped risefall on both sides lifted such that
801
+ its first sample is zero.
802
+
803
+ Exactly one of the ``risefall_sigma_ratio`` and ``width`` parameters has to be specified.
804
+
805
+ If ``risefall_sigma_ratio`` is not None and ``width`` is None:
806
+
807
+ .. math::
808
+
809
+ \\text{risefall} &= \\text{risefall_sigma_ratio} \\times \\text{sigma}\\\\
810
+ \\text{width} &= \\text{duration} - 2 \\times \\text{risefall}
811
+
812
+ If ``width`` is not None and ``risefall_sigma_ratio`` is None:
813
+
814
+ .. math:: \\text{risefall} = \\frac{\\text{duration} - \\text{width}}{2}
815
+
816
+ In both cases, the lifted gaussian square pulse :math:`f'(x)` is defined as:
817
+
818
+ .. math::
819
+
820
+ f'(x) &= \\begin{cases}\
821
+ \\exp\\biggl(-\\frac12 \\frac{(x - \\text{risefall})^2}{\\text{sigma}^2}\\biggr)\
822
+ & x < \\text{risefall}\\\\
823
+ 1\
824
+ & \\text{risefall} \\le x < \\text{risefall} + \\text{width}\\\\
825
+ \\exp\\biggl(-\\frac12\
826
+ \\frac{{\\bigl(x - (\\text{risefall} + \\text{width})\\bigr)}^2}\
827
+ {\\text{sigma}^2}\
828
+ \\biggr)\
829
+ & \\text{risefall} + \\text{width} \\le x\
830
+ \\end{cases}\\\\
831
+ f(x) &= \\text{A} \\times \\frac{f'(x) - f'(-1)}{1-f'(-1)},\
832
+ \\quad 0 \\le x < \\text{duration}
833
+
834
+ where :math:`f'(x)` is the gaussian square waveform without lifting or amplitude scaling, and
835
+ :math:`\\text{A} = \\text{amp} \\times \\exp\\left(i\\times\\text{angle}\\right)`.
836
+ """
837
+
838
+ alias = "GaussianSquare"
839
+
840
+ def __new__(
841
+ cls,
842
+ duration: Union[int, ParameterExpression],
843
+ amp: ParameterValueType,
844
+ sigma: ParameterValueType,
845
+ width: Optional[ParameterValueType] = None,
846
+ angle: Optional[ParameterValueType] = None,
847
+ risefall_sigma_ratio: Optional[ParameterValueType] = None,
848
+ name: Optional[str] = None,
849
+ limit_amplitude: Optional[bool] = None,
850
+ ) -> ScalableSymbolicPulse:
851
+ """Create new pulse instance.
852
+
853
+ Args:
854
+ duration: Pulse length in terms of the sampling period `dt`.
855
+ amp: The magnitude of the amplitude of the Gaussian and square pulse.
856
+ Complex amp support is deprecated.
857
+ sigma: A measure of how wide or narrow the Gaussian risefall is; see the class
858
+ docstring for more details.
859
+ width: The duration of the embedded square pulse.
860
+ angle: The angle of the complex amplitude of the pulse. Default value 0.
861
+ risefall_sigma_ratio: The ratio of each risefall duration to sigma.
862
+ name: Display name for this pulse envelope.
863
+ limit_amplitude: If ``True``, then limit the amplitude of the
864
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
865
+
866
+ Returns:
867
+ ScalableSymbolicPulse instance.
868
+
869
+ Raises:
870
+ PulseError: When width and risefall_sigma_ratio are both empty or both non-empty.
871
+ """
872
+ # Convert risefall_sigma_ratio into width which is defined in OpenPulse spec
873
+ if width is None and risefall_sigma_ratio is None:
874
+ raise PulseError(
875
+ "Either the pulse width or the risefall_sigma_ratio parameter must be specified."
876
+ )
877
+ if width is not None and risefall_sigma_ratio is not None:
878
+ raise PulseError(
879
+ "Either the pulse width or the risefall_sigma_ratio parameter can be specified"
880
+ " but not both."
881
+ )
882
+ if width is None and risefall_sigma_ratio is not None:
883
+ width = duration - 2.0 * risefall_sigma_ratio * sigma
884
+
885
+ parameters = {"sigma": sigma, "width": width}
886
+
887
+ # Prepare symbolic expressions
888
+ _t, _duration, _amp, _sigma, _width, _angle = sym.symbols(
889
+ "t, duration, amp, sigma, width, angle"
890
+ )
891
+ _center = _duration / 2
892
+
893
+ _sq_t0 = _center - _width / 2
894
+ _sq_t1 = _center + _width / 2
895
+
896
+ _gaussian_ledge = _lifted_gaussian(_t, _sq_t0, -1, _sigma)
897
+ _gaussian_redge = _lifted_gaussian(_t, _sq_t1, _duration + 1, _sigma)
898
+
899
+ envelope_expr = (
900
+ _amp
901
+ * sym.exp(sym.I * _angle)
902
+ * sym.Piecewise(
903
+ (_gaussian_ledge, _t <= _sq_t0), (_gaussian_redge, _t >= _sq_t1), (1, True)
904
+ )
905
+ )
906
+
907
+ consts_expr = sym.And(_sigma > 0, _width >= 0, _duration >= _width)
908
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
909
+
910
+ return ScalableSymbolicPulse(
911
+ pulse_type=cls.alias,
912
+ duration=duration,
913
+ amp=amp,
914
+ angle=angle,
915
+ parameters=parameters,
916
+ name=name,
917
+ limit_amplitude=limit_amplitude,
918
+ envelope=envelope_expr,
919
+ constraints=consts_expr,
920
+ valid_amp_conditions=valid_amp_conditions_expr,
921
+ )
922
+
923
+
924
+ def GaussianSquareDrag(
925
+ duration: Union[int, ParameterExpression],
926
+ amp: Union[float, ParameterExpression],
927
+ sigma: Union[float, ParameterExpression],
928
+ beta: Union[float, ParameterExpression],
929
+ width: Optional[Union[float, ParameterExpression]] = None,
930
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
931
+ risefall_sigma_ratio: Optional[Union[float, ParameterExpression]] = None,
932
+ name: Optional[str] = None,
933
+ limit_amplitude: Optional[bool] = None,
934
+ ) -> ScalableSymbolicPulse:
935
+ """A square pulse with a Drag shaped rise and fall
936
+
937
+ This pulse shape is similar to :class:`~.GaussianSquare` but uses
938
+ :class:`~.Drag` for its rise and fall instead of :class:`~.Gaussian`. The
939
+ addition of the DRAG component of the rise and fall is sometimes helpful in
940
+ suppressing the spectral content of the pulse at frequencies near to, but
941
+ slightly offset from, the fundamental frequency of the drive. When there is
942
+ a spectator qubit close in frequency to the fundamental frequency,
943
+ suppressing the drive at the spectator's frequency can help avoid unwanted
944
+ excitation of the spectator.
945
+
946
+ Exactly one of the ``risefall_sigma_ratio`` and ``width`` parameters has to be specified.
947
+
948
+ If ``risefall_sigma_ratio`` is not ``None`` and ``width`` is ``None``:
949
+
950
+ .. math::
951
+
952
+ \\text{risefall} &= \\text{risefall_sigma_ratio} \\times \\text{sigma}\\\\
953
+ \\text{width} &= \\text{duration} - 2 \\times \\text{risefall}
954
+
955
+ If ``width`` is not None and ``risefall_sigma_ratio`` is None:
956
+
957
+ .. math:: \\text{risefall} = \\frac{\\text{duration} - \\text{width}}{2}
958
+
959
+ Gaussian :math:`g(x, c, σ)` and lifted gaussian :math:`g'(x, c, σ)` curves
960
+ can be written as:
961
+
962
+ .. math::
963
+
964
+ g(x, c, σ) &= \\exp\\Bigl(-\\frac12 \\frac{(x - c)^2}{σ^2}\\Bigr)\\\\
965
+ g'(x, c, σ) &= \\frac{g(x, c, σ)-g(-1, c, σ)}{1-g(-1, c, σ)}
966
+
967
+ From these, the lifted DRAG curve :math:`d'(x, c, σ, β)` can be written as
968
+
969
+ .. math::
970
+
971
+ d'(x, c, σ, β) = g'(x, c, σ) \\times \\Bigl(1 + 1j \\times β \\times\
972
+ \\Bigl(-\\frac{x - c}{σ^2}\\Bigr)\\Bigr)
973
+
974
+ The lifted gaussian square drag pulse :math:`f'(x)` is defined as:
975
+
976
+ .. math::
977
+
978
+ f'(x) &= \\begin{cases}\
979
+ \\text{A} \\times d'(x, \\text{risefall}, \\text{sigma}, \\text{beta})\
980
+ & x < \\text{risefall}\\\\
981
+ \\text{A}\
982
+ & \\text{risefall} \\le x < \\text{risefall} + \\text{width}\\\\
983
+ \\text{A} \\times \\times d'(\
984
+ x - (\\text{risefall} + \\text{width}),\
985
+ \\text{risefall},\
986
+ \\text{sigma},\
987
+ \\text{beta}\
988
+ )\
989
+ & \\text{risefall} + \\text{width} \\le x\
990
+ \\end{cases}\\\\
991
+
992
+ where :math:`\\text{A} = \\text{amp} \\times
993
+ \\exp\\left(i\\times\\text{angle}\\right)`.
994
+
995
+ Args:
996
+ duration: Pulse length in terms of the sampling period `dt`.
997
+ amp: The amplitude of the DRAG rise and fall and of the square pulse.
998
+ sigma: A measure of how wide or narrow the DRAG risefall is; see the class
999
+ docstring for more details.
1000
+ beta: The DRAG correction amplitude.
1001
+ width: The duration of the embedded square pulse.
1002
+ angle: The angle in radians of the complex phase factor uniformly
1003
+ scaling the pulse. Default value 0.
1004
+ risefall_sigma_ratio: The ratio of each risefall duration to sigma.
1005
+ name: Display name for this pulse envelope.
1006
+ limit_amplitude: If ``True``, then limit the amplitude of the
1007
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1008
+
1009
+ Returns:
1010
+ ScalableSymbolicPulse instance.
1011
+
1012
+ Raises:
1013
+ PulseError: When width and risefall_sigma_ratio are both empty or both non-empty.
1014
+ """
1015
+ # Convert risefall_sigma_ratio into width which is defined in OpenPulse spec
1016
+ if width is None and risefall_sigma_ratio is None:
1017
+ raise PulseError(
1018
+ "Either the pulse width or the risefall_sigma_ratio parameter must be specified."
1019
+ )
1020
+ if width is not None and risefall_sigma_ratio is not None:
1021
+ raise PulseError(
1022
+ "Either the pulse width or the risefall_sigma_ratio parameter can be specified"
1023
+ " but not both."
1024
+ )
1025
+ if width is None and risefall_sigma_ratio is not None:
1026
+ width = duration - 2.0 * risefall_sigma_ratio * sigma
1027
+
1028
+ parameters = {"sigma": sigma, "width": width, "beta": beta}
1029
+
1030
+ # Prepare symbolic expressions
1031
+ _t, _duration, _amp, _sigma, _beta, _width, _angle = sym.symbols(
1032
+ "t, duration, amp, sigma, beta, width, angle"
1033
+ )
1034
+ _center = _duration / 2
1035
+
1036
+ _sq_t0 = _center - _width / 2
1037
+ _sq_t1 = _center + _width / 2
1038
+
1039
+ _gaussian_ledge = _lifted_gaussian(_t, _sq_t0, -1, _sigma)
1040
+ _gaussian_redge = _lifted_gaussian(_t, _sq_t1, _duration + 1, _sigma)
1041
+ _deriv_ledge = -(_t - _sq_t0) / (_sigma**2) * _gaussian_ledge
1042
+ _deriv_redge = -(_t - _sq_t1) / (_sigma**2) * _gaussian_redge
1043
+
1044
+ envelope_expr = (
1045
+ _amp
1046
+ * sym.exp(sym.I * _angle)
1047
+ * sym.Piecewise(
1048
+ (_gaussian_ledge + sym.I * _beta * _deriv_ledge, _t <= _sq_t0),
1049
+ (_gaussian_redge + sym.I * _beta * _deriv_redge, _t >= _sq_t1),
1050
+ (1, True),
1051
+ )
1052
+ )
1053
+ consts_expr = sym.And(_sigma > 0, _width >= 0, _duration >= _width)
1054
+ valid_amp_conditions_expr = sym.And(sym.Abs(_amp) <= 1.0, sym.Abs(_beta) < _sigma)
1055
+
1056
+ return ScalableSymbolicPulse(
1057
+ pulse_type="GaussianSquareDrag",
1058
+ duration=duration,
1059
+ amp=amp,
1060
+ angle=angle,
1061
+ parameters=parameters,
1062
+ name=name,
1063
+ limit_amplitude=limit_amplitude,
1064
+ envelope=envelope_expr,
1065
+ constraints=consts_expr,
1066
+ valid_amp_conditions=valid_amp_conditions_expr,
1067
+ )
1068
+
1069
+
1070
+ def gaussian_square_echo(
1071
+ duration: Union[int, ParameterExpression],
1072
+ amp: Union[float, ParameterExpression],
1073
+ sigma: Union[float, ParameterExpression],
1074
+ width: Optional[Union[float, ParameterExpression]] = None,
1075
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1076
+ active_amp: Optional[Union[float, ParameterExpression]] = 0.0,
1077
+ active_angle: Optional[Union[float, ParameterExpression]] = 0.0,
1078
+ risefall_sigma_ratio: Optional[Union[float, ParameterExpression]] = None,
1079
+ name: Optional[str] = None,
1080
+ limit_amplitude: Optional[bool] = None,
1081
+ ) -> SymbolicPulse:
1082
+ """An echoed Gaussian square pulse with an active tone overlaid on it.
1083
+
1084
+ The Gaussian Square Echo pulse is composed of three pulses. First, a Gaussian Square pulse
1085
+ :math:`f_{echo}(x)` with amplitude ``amp`` and phase ``angle`` playing for half duration,
1086
+ followed by a second Gaussian Square pulse :math:`-f_{echo}(x)` with opposite amplitude
1087
+ and same phase playing for the rest of the duration. Third a Gaussian Square pulse
1088
+ :math:`f_{active}(x)` with amplitude ``active_amp`` and phase ``active_angle``
1089
+ playing for the entire duration. The Gaussian Square Echo pulse :math:`g_e()`
1090
+ can be written as:
1091
+
1092
+ .. math::
1093
+
1094
+ g_e(x) &= \\begin{cases}\
1095
+ f_{\\text{active}} + f_{\\text{echo}}(x)\
1096
+ & x < \\frac{\\text{duration}}{2}\\\\
1097
+ f_{\\text{active}} - f_{\\text{echo}}(x)\
1098
+ & \\frac{\\text{duration}}{2} < x\
1099
+ \\end{cases}\\\\
1100
+
1101
+ One case where this pulse can be used is when implementing a direct CNOT gate with
1102
+ a cross-resonance superconducting qubit architecture. When applying this pulse to
1103
+ the target qubit, the active portion can be used to cancel IX terms from the
1104
+ cross-resonance drive while the echo portion can reduce the impact of a static ZZ coupling.
1105
+
1106
+ Exactly one of the ``risefall_sigma_ratio`` and ``width`` parameters has to be specified.
1107
+
1108
+ If ``risefall_sigma_ratio`` is not ``None`` and ``width`` is ``None``:
1109
+
1110
+ .. math::
1111
+
1112
+ \\text{risefall} &= \\text{risefall_sigma_ratio} \\times \\text{sigma}\\\\
1113
+ \\text{width} &= \\text{duration} - 2 \\times \\text{risefall}
1114
+
1115
+ If ``width`` is not None and ``risefall_sigma_ratio`` is None:
1116
+
1117
+ .. math:: \\text{risefall} = \\frac{\\text{duration} - \\text{width}}{2}
1118
+
1119
+ References:
1120
+ 1. |citation1|_
1121
+
1122
+ .. _citation1: https://iopscience.iop.org/article/10.1088/2058-9565/abe519
1123
+
1124
+ .. |citation1| replace:: *Jurcevic, P., Javadi-Abhari, A., Bishop, L. S.,
1125
+ Lauer, I., Bogorin, D. F., Brink, M., Capelluto, L., G{\"u}nl{\"u}k, O.,
1126
+ Itoko, T., Kanazawa, N. & others
1127
+ Demonstration of quantum volume 64 on a superconducting quantum
1128
+ computing system. (Section V)*
1129
+ Args:
1130
+ duration: Pulse length in terms of the sampling period `dt`.
1131
+ amp: The amplitude of the rise and fall and of the echoed pulse.
1132
+ sigma: A measure of how wide or narrow the risefall is; see the class
1133
+ docstring for more details.
1134
+ width: The duration of the embedded square pulse.
1135
+ angle: The angle in radians of the complex phase factor uniformly
1136
+ scaling the echoed pulse. Default value 0.
1137
+ active_amp: The amplitude of the active pulse.
1138
+ active_angle: The angle in radian of the complex phase factor uniformly
1139
+ scaling the active pulse. Default value 0.
1140
+ risefall_sigma_ratio: The ratio of each risefall duration to sigma.
1141
+ name: Display name for this pulse envelope.
1142
+ limit_amplitude: If ``True``, then limit the amplitude of the
1143
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1144
+
1145
+ Returns:
1146
+ ScalableSymbolicPulse instance.
1147
+ Raises:
1148
+ PulseError: When width and risefall_sigma_ratio are both empty or both non-empty.
1149
+ """
1150
+ # Convert risefall_sigma_ratio into width which is defined in OpenPulse spec
1151
+ if width is None and risefall_sigma_ratio is None:
1152
+ raise PulseError(
1153
+ "Either the pulse width or the risefall_sigma_ratio parameter must be specified."
1154
+ )
1155
+ if width is not None and risefall_sigma_ratio is not None:
1156
+ raise PulseError(
1157
+ "Either the pulse width or the risefall_sigma_ratio parameter can be specified"
1158
+ " but not both."
1159
+ )
1160
+
1161
+ if width is None and risefall_sigma_ratio is not None:
1162
+ width = duration - 2.0 * risefall_sigma_ratio * sigma
1163
+
1164
+ parameters = {
1165
+ "amp": amp,
1166
+ "angle": angle,
1167
+ "sigma": sigma,
1168
+ "width": width,
1169
+ "active_amp": active_amp,
1170
+ "active_angle": active_angle,
1171
+ }
1172
+
1173
+ # Prepare symbolic expressions
1174
+ (
1175
+ _t,
1176
+ _duration,
1177
+ _amp,
1178
+ _sigma,
1179
+ _active_amp,
1180
+ _width,
1181
+ _angle,
1182
+ _active_angle,
1183
+ ) = sym.symbols("t, duration, amp, sigma, active_amp, width, angle, active_angle")
1184
+
1185
+ # gaussian square echo for rotary tone
1186
+ _center = _duration / 4
1187
+
1188
+ _width_echo = (_duration - 2 * (_duration - _width)) / 2
1189
+
1190
+ _sq_t0 = _center - _width_echo / 2
1191
+ _sq_t1 = _center + _width_echo / 2
1192
+
1193
+ _gaussian_ledge = _lifted_gaussian(_t, _sq_t0, -1, _sigma)
1194
+ _gaussian_redge = _lifted_gaussian(_t, _sq_t1, _duration / 2 + 1, _sigma)
1195
+
1196
+ envelope_expr_p = (
1197
+ _amp
1198
+ * sym.exp(sym.I * _angle)
1199
+ * sym.Piecewise(
1200
+ (_gaussian_ledge, _t <= _sq_t0),
1201
+ (_gaussian_redge, _t >= _sq_t1),
1202
+ (1, True),
1203
+ )
1204
+ )
1205
+
1206
+ _center_echo = _duration / 2 + _duration / 4
1207
+
1208
+ _sq_t0_echo = _center_echo - _width_echo / 2
1209
+ _sq_t1_echo = _center_echo + _width_echo / 2
1210
+
1211
+ _gaussian_ledge_echo = _lifted_gaussian(_t, _sq_t0_echo, _duration / 2 - 1, _sigma)
1212
+ _gaussian_redge_echo = _lifted_gaussian(_t, _sq_t1_echo, _duration + 1, _sigma)
1213
+
1214
+ envelope_expr_echo = (
1215
+ -1
1216
+ * _amp
1217
+ * sym.exp(sym.I * _angle)
1218
+ * sym.Piecewise(
1219
+ (_gaussian_ledge_echo, _t <= _sq_t0_echo),
1220
+ (_gaussian_redge_echo, _t >= _sq_t1_echo),
1221
+ (1, True),
1222
+ )
1223
+ )
1224
+
1225
+ envelope_expr = sym.Piecewise(
1226
+ (envelope_expr_p, _t <= _duration / 2), (envelope_expr_echo, _t >= _duration / 2), (0, True)
1227
+ )
1228
+
1229
+ # gaussian square for active cancellation tone
1230
+ _center_active = _duration / 2
1231
+
1232
+ _sq_t0_active = _center_active - _width / 2
1233
+ _sq_t1_active = _center_active + _width / 2
1234
+
1235
+ _gaussian_ledge_active = _lifted_gaussian(_t, _sq_t0_active, -1, _sigma)
1236
+ _gaussian_redge_active = _lifted_gaussian(_t, _sq_t1_active, _duration + 1, _sigma)
1237
+
1238
+ envelope_expr_active = (
1239
+ _active_amp
1240
+ * sym.exp(sym.I * _active_angle)
1241
+ * sym.Piecewise(
1242
+ (_gaussian_ledge_active, _t <= _sq_t0_active),
1243
+ (_gaussian_redge_active, _t >= _sq_t1_active),
1244
+ (1, True),
1245
+ )
1246
+ )
1247
+
1248
+ envelop_expr_total = envelope_expr + envelope_expr_active
1249
+
1250
+ consts_expr = sym.And(
1251
+ _sigma > 0, _width >= 0, _duration >= _width, _duration / 2 >= _width_echo
1252
+ )
1253
+
1254
+ # Check validity of amplitudes
1255
+ valid_amp_conditions_expr = sym.And(sym.Abs(_amp) + sym.Abs(_active_amp) <= 1.0)
1256
+
1257
+ return SymbolicPulse(
1258
+ pulse_type="gaussian_square_echo",
1259
+ duration=duration,
1260
+ parameters=parameters,
1261
+ name=name,
1262
+ limit_amplitude=limit_amplitude,
1263
+ envelope=envelop_expr_total,
1264
+ constraints=consts_expr,
1265
+ valid_amp_conditions=valid_amp_conditions_expr,
1266
+ )
1267
+
1268
+
1269
+ def GaussianDeriv(
1270
+ duration: Union[int, ParameterExpression],
1271
+ amp: Union[float, ParameterExpression],
1272
+ sigma: Union[float, ParameterExpression],
1273
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1274
+ name: Optional[str] = None,
1275
+ limit_amplitude: Optional[bool] = None,
1276
+ ) -> ScalableSymbolicPulse:
1277
+ """An unnormalized Gaussian derivative pulse.
1278
+
1279
+ The Gaussian function is centered around the halfway point of the pulse,
1280
+ and the envelope of the pulse is given by:
1281
+
1282
+ .. math::
1283
+
1284
+ f(x) = -\\text{A}\\frac{x-\\mu}{\\text{sigma}^{2}}\\exp
1285
+ \\left[-\\left(\\frac{x-\\mu}{2\\text{sigma}}\\right)^{2}\\right] , 0 <= x < duration
1286
+
1287
+ where :math:`\\text{A} = \\text{amp} \\times\\exp\\left(i\\times\\text{angle}\\right)`,
1288
+ and :math:`\\mu=\\text{duration}/2`.
1289
+
1290
+ Args:
1291
+ duration: Pulse length in terms of the sampling period `dt`.
1292
+ amp: The magnitude of the amplitude of the pulse
1293
+ (the value of the corresponding Gaussian at the midpoint `duration`/2).
1294
+ sigma: A measure of how wide or narrow the corresponding Gaussian peak is in terms of `dt`;
1295
+ described mathematically in the class docstring.
1296
+ angle: The angle in radians of the complex phase factor uniformly
1297
+ scaling the pulse. Default value 0.
1298
+ name: Display name for this pulse envelope.
1299
+ limit_amplitude: If ``True``, then limit the amplitude of the
1300
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1301
+
1302
+ Returns:
1303
+ ScalableSymbolicPulse instance.
1304
+ """
1305
+ parameters = {"sigma": sigma}
1306
+
1307
+ # Prepare symbolic expressions
1308
+ _t, _duration, _amp, _angle, _sigma = sym.symbols("t, duration, amp, angle, sigma")
1309
+ envelope_expr = (
1310
+ -_amp
1311
+ * sym.exp(sym.I * _angle)
1312
+ * ((_t - (_duration / 2)) / _sigma**2)
1313
+ * sym.exp(-(1 / 2) * ((_t - (_duration / 2)) / _sigma) ** 2)
1314
+ )
1315
+ consts_expr = _sigma > 0
1316
+ valid_amp_conditions_expr = sym.Abs(_amp / _sigma) <= sym.exp(1 / 2)
1317
+
1318
+ return ScalableSymbolicPulse(
1319
+ pulse_type="GaussianDeriv",
1320
+ duration=duration,
1321
+ amp=amp,
1322
+ angle=angle,
1323
+ parameters=parameters,
1324
+ name=name,
1325
+ limit_amplitude=limit_amplitude,
1326
+ envelope=envelope_expr,
1327
+ constraints=consts_expr,
1328
+ valid_amp_conditions=valid_amp_conditions_expr,
1329
+ )
1330
+
1331
+
1332
+ class Drag(metaclass=_PulseType):
1333
+ """The Derivative Removal by Adiabatic Gate (DRAG) pulse is a standard Gaussian pulse
1334
+ with an additional Gaussian derivative component and lifting applied.
1335
+
1336
+ It can be calibrated either to reduce the phase error due to virtual population of the
1337
+ :math:`|2\\rangle` state during the pulse or to reduce the frequency spectrum of a
1338
+ standard Gaussian pulse near the :math:`|1\\rangle\\leftrightarrow|2\\rangle` transition,
1339
+ reducing the chance of leakage to the :math:`|2\\rangle` state.
1340
+
1341
+ .. math::
1342
+
1343
+ g(x) &= \\exp\\Bigl(-\\frac12 \\frac{(x - \\text{duration}/2)^2}{\\text{sigma}^2}\\Bigr)\\\\
1344
+ g'(x) &= \\text{A}\\times\\frac{g(x)-g(-1)}{1-g(-1)}\\\\
1345
+ f(x) &= g'(x) \\times \\Bigl(1 + 1j \\times \\text{beta} \\times\
1346
+ \\Bigl(-\\frac{x - \\text{duration}/2}{\\text{sigma}^2}\\Bigr) \\Bigr),
1347
+ \\quad 0 \\le x < \\text{duration}
1348
+
1349
+ where :math:`g(x)` is a standard unlifted Gaussian waveform, :math:`g'(x)` is the lifted
1350
+ :class:`~qiskit.pulse.library.Gaussian` waveform, and
1351
+ :math:`\\text{A} = \\text{amp} \\times \\exp\\left(i\\times\\text{angle}\\right)`.
1352
+
1353
+ References:
1354
+ 1. |citation1|_
1355
+
1356
+ .. _citation1: https://link.aps.org/doi/10.1103/PhysRevA.83.012308
1357
+
1358
+ .. |citation1| replace:: *Gambetta, J. M., Motzoi, F., Merkel, S. T. & Wilhelm, F. K.
1359
+ Analytic control methods for high-fidelity unitary operations
1360
+ in a weakly nonlinear oscillator. Phys. Rev. A 83, 012308 (2011).*
1361
+
1362
+ 2. |citation2|_
1363
+
1364
+ .. _citation2: https://link.aps.org/doi/10.1103/PhysRevLett.103.110501
1365
+
1366
+ .. |citation2| replace:: *F. Motzoi, J. M. Gambetta, P. Rebentrost, and F. K. Wilhelm
1367
+ Phys. Rev. Lett. 103, 110501 – Published 8 September 2009.*
1368
+ """
1369
+
1370
+ alias = "Drag"
1371
+
1372
+ def __new__(
1373
+ cls,
1374
+ duration: Union[int, ParameterExpression],
1375
+ amp: ParameterValueType,
1376
+ sigma: ParameterValueType,
1377
+ beta: ParameterValueType,
1378
+ angle: Optional[ParameterValueType] = None,
1379
+ name: Optional[str] = None,
1380
+ limit_amplitude: Optional[bool] = None,
1381
+ ) -> ScalableSymbolicPulse:
1382
+ """Create new pulse instance.
1383
+
1384
+ Args:
1385
+ duration: Pulse length in terms of the sampling period `dt`.
1386
+ amp: The magnitude of the amplitude of the DRAG envelope.
1387
+ Complex amp support is deprecated.
1388
+ sigma: A measure of how wide or narrow the Gaussian peak is; described mathematically
1389
+ in the class docstring.
1390
+ beta: The correction amplitude.
1391
+ angle: The angle of the complex amplitude of the DRAG envelope. Default value 0.
1392
+ name: Display name for this pulse envelope.
1393
+ limit_amplitude: If ``True``, then limit the amplitude of the
1394
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1395
+
1396
+ Returns:
1397
+ ScalableSymbolicPulse instance.
1398
+ """
1399
+ parameters = {"sigma": sigma, "beta": beta}
1400
+
1401
+ # Prepare symbolic expressions
1402
+ _t, _duration, _amp, _sigma, _beta, _angle = sym.symbols(
1403
+ "t, duration, amp, sigma, beta, angle"
1404
+ )
1405
+ _center = _duration / 2
1406
+
1407
+ _gauss = _lifted_gaussian(_t, _center, _duration + 1, _sigma)
1408
+ _deriv = -(_t - _center) / (_sigma**2) * _gauss
1409
+
1410
+ envelope_expr = _amp * sym.exp(sym.I * _angle) * (_gauss + sym.I * _beta * _deriv)
1411
+
1412
+ consts_expr = _sigma > 0
1413
+ valid_amp_conditions_expr = sym.And(sym.Abs(_amp) <= 1.0, sym.Abs(_beta) < _sigma)
1414
+
1415
+ return ScalableSymbolicPulse(
1416
+ pulse_type="Drag",
1417
+ duration=duration,
1418
+ amp=amp,
1419
+ angle=angle,
1420
+ parameters=parameters,
1421
+ name=name,
1422
+ limit_amplitude=limit_amplitude,
1423
+ envelope=envelope_expr,
1424
+ constraints=consts_expr,
1425
+ valid_amp_conditions=valid_amp_conditions_expr,
1426
+ )
1427
+
1428
+
1429
+ class Constant(metaclass=_PulseType):
1430
+ """A simple constant pulse, with an amplitude value and a duration:
1431
+
1432
+ .. math::
1433
+
1434
+ f(x) = \\text{amp}\\times\\exp\\left(i\\text{angle}\\right) , 0 <= x < duration
1435
+ f(x) = 0 , elsewhere
1436
+ """
1437
+
1438
+ alias = "Constant"
1439
+
1440
+ def __new__(
1441
+ cls,
1442
+ duration: Union[int, ParameterExpression],
1443
+ amp: ParameterValueType,
1444
+ angle: Optional[ParameterValueType] = None,
1445
+ name: Optional[str] = None,
1446
+ limit_amplitude: Optional[bool] = None,
1447
+ ) -> ScalableSymbolicPulse:
1448
+ """Create new pulse instance.
1449
+
1450
+ Args:
1451
+ duration: Pulse length in terms of the sampling period `dt`.
1452
+ amp: The magnitude of the amplitude of the square envelope.
1453
+ Complex amp support is deprecated.
1454
+ angle: The angle of the complex amplitude of the square envelope. Default value 0.
1455
+ name: Display name for this pulse envelope.
1456
+ limit_amplitude: If ``True``, then limit the amplitude of the
1457
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1458
+
1459
+ Returns:
1460
+ ScalableSymbolicPulse instance.
1461
+ """
1462
+ # Prepare symbolic expressions
1463
+ _t, _amp, _duration, _angle = sym.symbols("t, amp, duration, angle")
1464
+
1465
+ # Note this is implemented using Piecewise instead of just returning amp
1466
+ # directly because otherwise the expression has no t dependence and sympy's
1467
+ # lambdify will produce a function f that for an array t returns amp
1468
+ # instead of amp * np.ones(t.shape). This does not work well with
1469
+ # ParametricPulse.get_waveform().
1470
+ #
1471
+ # See: https://github.com/sympy/sympy/issues/5642
1472
+ envelope_expr = (
1473
+ _amp
1474
+ * sym.exp(sym.I * _angle)
1475
+ * sym.Piecewise((1, sym.And(_t >= 0, _t <= _duration)), (0, True))
1476
+ )
1477
+
1478
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
1479
+
1480
+ return ScalableSymbolicPulse(
1481
+ pulse_type="Constant",
1482
+ duration=duration,
1483
+ amp=amp,
1484
+ angle=angle,
1485
+ name=name,
1486
+ limit_amplitude=limit_amplitude,
1487
+ envelope=envelope_expr,
1488
+ valid_amp_conditions=valid_amp_conditions_expr,
1489
+ )
1490
+
1491
+
1492
+ def Sin(
1493
+ duration: Union[int, ParameterExpression],
1494
+ amp: Union[float, ParameterExpression],
1495
+ phase: Union[float, ParameterExpression],
1496
+ freq: Optional[Union[float, ParameterExpression]] = None,
1497
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1498
+ name: Optional[str] = None,
1499
+ limit_amplitude: Optional[bool] = None,
1500
+ ) -> ScalableSymbolicPulse:
1501
+ """A sinusoidal pulse.
1502
+
1503
+ The envelope of the pulse is given by:
1504
+
1505
+ .. math::
1506
+
1507
+ f(x) = \\text{A}\\sin\\left(2\\pi\\text{freq}x+\\text{phase}\\right) , 0 <= x < duration
1508
+
1509
+ where :math:`\\text{A} = \\text{amp} \\times\\exp\\left(i\\times\\text{angle}\\right)`.
1510
+
1511
+ Args:
1512
+ duration: Pulse length in terms of the sampling period `dt`.
1513
+ amp: The magnitude of the amplitude of the sinusoidal wave. Wave range is [-`amp`,`amp`].
1514
+ phase: The phase of the sinusoidal wave (note that this is not equivalent to the angle of
1515
+ the complex amplitude)
1516
+ freq: The frequency of the sinusoidal wave, in terms of 1 over sampling period.
1517
+ If not provided defaults to a single cycle (i.e :math:'\\frac{1}{\\text{duration}}').
1518
+ The frequency is limited to the range :math:`\\left(0,0.5\\right]` (the Nyquist frequency).
1519
+ angle: The angle in radians of the complex phase factor uniformly
1520
+ scaling the pulse. Default value 0.
1521
+ name: Display name for this pulse envelope.
1522
+ limit_amplitude: If ``True``, then limit the amplitude of the
1523
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1524
+
1525
+ Returns:
1526
+ ScalableSymbolicPulse instance.
1527
+ """
1528
+ if freq is None:
1529
+ freq = 1 / duration
1530
+ parameters = {"freq": freq, "phase": phase}
1531
+
1532
+ # Prepare symbolic expressions
1533
+ _t, _duration, _amp, _angle, _freq, _phase = sym.symbols("t, duration, amp, angle, freq, phase")
1534
+
1535
+ envelope_expr = _amp * sym.exp(sym.I * _angle) * sym.sin(2 * sym.pi * _freq * _t + _phase)
1536
+
1537
+ consts_expr = sym.And(_freq > 0, _freq < 0.5)
1538
+
1539
+ # This might fail for waves shorter than a single cycle
1540
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
1541
+
1542
+ return ScalableSymbolicPulse(
1543
+ pulse_type="Sin",
1544
+ duration=duration,
1545
+ amp=amp,
1546
+ angle=angle,
1547
+ parameters=parameters,
1548
+ name=name,
1549
+ limit_amplitude=limit_amplitude,
1550
+ envelope=envelope_expr,
1551
+ constraints=consts_expr,
1552
+ valid_amp_conditions=valid_amp_conditions_expr,
1553
+ )
1554
+
1555
+
1556
+ def Cos(
1557
+ duration: Union[int, ParameterExpression],
1558
+ amp: Union[float, ParameterExpression],
1559
+ phase: Union[float, ParameterExpression],
1560
+ freq: Optional[Union[float, ParameterExpression]] = None,
1561
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1562
+ name: Optional[str] = None,
1563
+ limit_amplitude: Optional[bool] = None,
1564
+ ) -> ScalableSymbolicPulse:
1565
+ """A cosine pulse.
1566
+
1567
+ The envelope of the pulse is given by:
1568
+
1569
+ .. math::
1570
+
1571
+ f(x) = \\text{A}\\cos\\left(2\\pi\\text{freq}x+\\text{phase}\\right) , 0 <= x < duration
1572
+
1573
+ where :math:`\\text{A} = \\text{amp} \\times\\exp\\left(i\\times\\text{angle}\\right)`.
1574
+
1575
+ Args:
1576
+ duration: Pulse length in terms of the sampling period `dt`.
1577
+ amp: The magnitude of the amplitude of the cosine wave. Wave range is [-`amp`,`amp`].
1578
+ phase: The phase of the cosine wave (note that this is not equivalent to the angle
1579
+ of the complex amplitude).
1580
+ freq: The frequency of the cosine wave, in terms of 1 over sampling period.
1581
+ If not provided defaults to a single cycle (i.e :math:'\\frac{1}{\\text{duration}}').
1582
+ The frequency is limited to the range :math:`\\left(0,0.5\\right]` (the Nyquist frequency).
1583
+ angle: The angle in radians of the complex phase factor uniformly
1584
+ scaling the pulse. Default value 0.
1585
+ name: Display name for this pulse envelope.
1586
+ limit_amplitude: If ``True``, then limit the amplitude of the
1587
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1588
+
1589
+ Returns:
1590
+ ScalableSymbolicPulse instance.
1591
+ """
1592
+ if freq is None:
1593
+ freq = 1 / duration
1594
+ parameters = {"freq": freq, "phase": phase}
1595
+
1596
+ # Prepare symbolic expressions
1597
+ _t, _duration, _amp, _angle, _freq, _phase = sym.symbols("t, duration, amp, angle, freq, phase")
1598
+
1599
+ envelope_expr = _amp * sym.exp(sym.I * _angle) * sym.cos(2 * sym.pi * _freq * _t + _phase)
1600
+
1601
+ consts_expr = sym.And(_freq > 0, _freq < 0.5)
1602
+
1603
+ # This might fail for waves shorter than a single cycle
1604
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
1605
+
1606
+ return ScalableSymbolicPulse(
1607
+ pulse_type="Cos",
1608
+ duration=duration,
1609
+ amp=amp,
1610
+ angle=angle,
1611
+ parameters=parameters,
1612
+ name=name,
1613
+ limit_amplitude=limit_amplitude,
1614
+ envelope=envelope_expr,
1615
+ constraints=consts_expr,
1616
+ valid_amp_conditions=valid_amp_conditions_expr,
1617
+ )
1618
+
1619
+
1620
+ def Sawtooth(
1621
+ duration: Union[int, ParameterExpression],
1622
+ amp: Union[float, ParameterExpression],
1623
+ phase: Union[float, ParameterExpression],
1624
+ freq: Optional[Union[float, ParameterExpression]] = None,
1625
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1626
+ name: Optional[str] = None,
1627
+ limit_amplitude: Optional[bool] = None,
1628
+ ) -> ScalableSymbolicPulse:
1629
+ """A sawtooth pulse.
1630
+
1631
+ The envelope of the pulse is given by:
1632
+
1633
+ .. math::
1634
+
1635
+ f(x) = 2\\text{A}\\left[g\\left(x\\right)-
1636
+ \\lfloor g\\left(x\\right)+\\frac{1}{2}\\rfloor\\right]
1637
+
1638
+ where :math:`\\text{A} = \\text{amp} \\times\\exp\\left(i\\times\\text{angle}\\right)`,
1639
+ :math:`g\\left(x\\right)=x\\times\\text{freq}+\\frac{\\text{phase}}{2\\pi}`,
1640
+ and :math:`\\lfloor ...\\rfloor` is the floor operation.
1641
+
1642
+ Args:
1643
+ duration: Pulse length in terms of the sampling period `dt`.
1644
+ amp: The magnitude of the amplitude of the sawtooth wave. Wave range is [-`amp`,`amp`].
1645
+ phase: The phase of the sawtooth wave (note that this is not equivalent to the angle
1646
+ of the complex amplitude)
1647
+ freq: The frequency of the sawtooth wave, in terms of 1 over sampling period.
1648
+ If not provided defaults to a single cycle (i.e :math:'\\frac{1}{\\text{duration}}').
1649
+ The frequency is limited to the range :math:`\\left(0,0.5\\right]` (the Nyquist frequency).
1650
+ angle: The angle in radians of the complex phase factor uniformly
1651
+ scaling the pulse. Default value 0.
1652
+ name: Display name for this pulse envelope.
1653
+ limit_amplitude: If ``True``, then limit the amplitude of the
1654
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1655
+
1656
+ Returns:
1657
+ ScalableSymbolicPulse instance.
1658
+ """
1659
+ if freq is None:
1660
+ freq = 1 / duration
1661
+ parameters = {"freq": freq, "phase": phase}
1662
+
1663
+ # Prepare symbolic expressions
1664
+ _t, _duration, _amp, _angle, _freq, _phase = sym.symbols("t, duration, amp, angle, freq, phase")
1665
+ lin_expr = _t * _freq + _phase / (2 * sym.pi)
1666
+
1667
+ envelope_expr = 2 * _amp * sym.exp(sym.I * _angle) * (lin_expr - sym.floor(lin_expr + 1 / 2))
1668
+
1669
+ consts_expr = sym.And(_freq > 0, _freq < 0.5)
1670
+
1671
+ # This might fail for waves shorter than a single cycle
1672
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
1673
+
1674
+ return ScalableSymbolicPulse(
1675
+ pulse_type="Sawtooth",
1676
+ duration=duration,
1677
+ amp=amp,
1678
+ angle=angle,
1679
+ parameters=parameters,
1680
+ name=name,
1681
+ limit_amplitude=limit_amplitude,
1682
+ envelope=envelope_expr,
1683
+ constraints=consts_expr,
1684
+ valid_amp_conditions=valid_amp_conditions_expr,
1685
+ )
1686
+
1687
+
1688
+ def Triangle(
1689
+ duration: Union[int, ParameterExpression],
1690
+ amp: Union[float, ParameterExpression],
1691
+ phase: Union[float, ParameterExpression],
1692
+ freq: Optional[Union[float, ParameterExpression]] = None,
1693
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1694
+ name: Optional[str] = None,
1695
+ limit_amplitude: Optional[bool] = None,
1696
+ ) -> ScalableSymbolicPulse:
1697
+ """A triangle wave pulse.
1698
+
1699
+ The envelope of the pulse is given by:
1700
+
1701
+ .. math::
1702
+
1703
+ f(x) = \\text{A}\\left[\\text{sawtooth}\\left(x\\right)\\right] , 0 <= x < duration
1704
+
1705
+ where :math:`\\text{A} = \\text{amp} \\times\\exp\\left(i\\times\\text{angle}\\right)`,
1706
+ and :math:`\\text{sawtooth}\\left(x\\right)` is a sawtooth wave with the same frequency
1707
+ as the triangle wave, but a phase shifted by :math:`\\frac{\\pi}{2}`.
1708
+
1709
+ Args:
1710
+ duration: Pulse length in terms of the sampling period `dt`.
1711
+ amp: The magnitude of the amplitude of the triangle wave. Wave range is [-`amp`,`amp`].
1712
+ phase: The phase of the triangle wave (note that this is not equivalent to the angle
1713
+ of the complex amplitude)
1714
+ freq: The frequency of the triangle wave, in terms of 1 over sampling period.
1715
+ If not provided defaults to a single cycle (i.e :math:'\\frac{1}{\\text{duration}}').
1716
+ The frequency is limited to the range :math:`\\left(0,0.5\\right]` (the Nyquist frequency).
1717
+ angle: The angle in radians of the complex phase factor uniformly
1718
+ scaling the pulse. Default value 0.
1719
+ name: Display name for this pulse envelope.
1720
+ limit_amplitude: If ``True``, then limit the amplitude of the
1721
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1722
+
1723
+ Returns:
1724
+ ScalableSymbolicPulse instance.
1725
+ """
1726
+ if freq is None:
1727
+ freq = 1 / duration
1728
+ parameters = {"freq": freq, "phase": phase}
1729
+
1730
+ # Prepare symbolic expressions
1731
+ _t, _duration, _amp, _angle, _freq, _phase = sym.symbols("t, duration, amp, angle, freq, phase")
1732
+ lin_expr = _t * _freq + _phase / (2 * sym.pi) - 0.25
1733
+ sawtooth_expr = 2 * (lin_expr - sym.floor(lin_expr + 1 / 2))
1734
+
1735
+ envelope_expr = _amp * sym.exp(sym.I * _angle) * (-2 * sym.Abs(sawtooth_expr) + 1)
1736
+
1737
+ consts_expr = sym.And(_freq > 0, _freq < 0.5)
1738
+
1739
+ # This might fail for waves shorter than a single cycle
1740
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
1741
+
1742
+ return ScalableSymbolicPulse(
1743
+ pulse_type="Triangle",
1744
+ duration=duration,
1745
+ amp=amp,
1746
+ angle=angle,
1747
+ parameters=parameters,
1748
+ name=name,
1749
+ limit_amplitude=limit_amplitude,
1750
+ envelope=envelope_expr,
1751
+ constraints=consts_expr,
1752
+ valid_amp_conditions=valid_amp_conditions_expr,
1753
+ )
1754
+
1755
+
1756
+ def Square(
1757
+ duration: Union[int, ParameterExpression],
1758
+ amp: Union[float, ParameterExpression],
1759
+ phase: Union[float, ParameterExpression],
1760
+ freq: Optional[Union[float, ParameterExpression]] = None,
1761
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1762
+ name: Optional[str] = None,
1763
+ limit_amplitude: Optional[bool] = None,
1764
+ ) -> ScalableSymbolicPulse:
1765
+ """A square wave pulse.
1766
+
1767
+ The envelope of the pulse is given by:
1768
+
1769
+ .. math::
1770
+
1771
+ f(x) = \\text{A}\\text{sign}\\left[\\sin
1772
+ \\left(2\\pi x\\times\\text{freq}+\\text{phase}\\right)\\right] , 0 <= x < duration
1773
+
1774
+ where :math:`\\text{A} = \\text{amp} \\times\\exp\\left(i\\times\\text{angle}\\right)`,
1775
+ and :math:`\\text{sign}`
1776
+ is the sign function with the convention :math:`\\text{sign}\\left(0\\right)=1`.
1777
+
1778
+ Args:
1779
+ duration: Pulse length in terms of the sampling period `dt`.
1780
+ amp: The magnitude of the amplitude of the square wave. Wave range is [-`amp`,`amp`].
1781
+ phase: The phase of the square wave (note that this is not equivalent to the angle of
1782
+ the complex amplitude).
1783
+ freq: The frequency of the square wave, in terms of 1 over sampling period.
1784
+ If not provided defaults to a single cycle (i.e :math:'\\frac{1}{\\text{duration}}').
1785
+ The frequency is limited to the range :math:`\\left(0,0.5\\right]` (the Nyquist frequency).
1786
+ angle: The angle in radians of the complex phase factor uniformly
1787
+ scaling the pulse. Default value 0.
1788
+ name: Display name for this pulse envelope.
1789
+ limit_amplitude: If ``True``, then limit the amplitude of the
1790
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1791
+
1792
+ Returns:
1793
+ ScalableSymbolicPulse instance.
1794
+ """
1795
+ if freq is None:
1796
+ freq = 1 / duration
1797
+ parameters = {"freq": freq, "phase": phase}
1798
+
1799
+ # Prepare symbolic expressions
1800
+ _t, _duration, _amp, _angle, _freq, _phase = sym.symbols("t, duration, amp, angle, freq, phase")
1801
+ _x = _freq * _t + _phase / (2 * sym.pi)
1802
+
1803
+ envelope_expr = (
1804
+ _amp * sym.exp(sym.I * _angle) * (2 * (2 * sym.floor(_x) - sym.floor(2 * _x)) + 1)
1805
+ )
1806
+
1807
+ consts_expr = sym.And(_freq > 0, _freq < 0.5)
1808
+
1809
+ # This might fail for waves shorter than a single cycle
1810
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
1811
+
1812
+ return ScalableSymbolicPulse(
1813
+ pulse_type="Square",
1814
+ duration=duration,
1815
+ amp=amp,
1816
+ angle=angle,
1817
+ parameters=parameters,
1818
+ name=name,
1819
+ limit_amplitude=limit_amplitude,
1820
+ envelope=envelope_expr,
1821
+ constraints=consts_expr,
1822
+ valid_amp_conditions=valid_amp_conditions_expr,
1823
+ )
1824
+
1825
+
1826
+ def Sech(
1827
+ duration: Union[int, ParameterExpression],
1828
+ amp: Union[float, ParameterExpression],
1829
+ sigma: Union[float, ParameterExpression],
1830
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1831
+ name: Optional[str] = None,
1832
+ zero_ends: Optional[bool] = True,
1833
+ limit_amplitude: Optional[bool] = None,
1834
+ ) -> ScalableSymbolicPulse:
1835
+ """An unnormalized sech pulse.
1836
+
1837
+ The sech function is centered around the halfway point of the pulse,
1838
+ and the envelope of the pulse is given by:
1839
+
1840
+ .. math::
1841
+
1842
+ f(x) = \\text{A}\\text{sech}\\left(
1843
+ \\frac{x-\\mu}{\\text{sigma}}\\right) , 0 <= x < duration
1844
+
1845
+ where :math:`\\text{A} = \\text{amp} \\times\\exp\\left(i\\times\\text{angle}\\right)`,
1846
+ and :math:`\\mu=\\text{duration}/2`.
1847
+
1848
+ If `zero_ends` is set to `True`, the output `y` is modified:
1849
+ .. math::
1850
+
1851
+ y\\left(x\\right) \\mapsto \\text{A}\\frac{y-y^{*}}{\\text{A}-y^{*}},
1852
+
1853
+ where :math:`y^{*}` is the value of :math:`y` at the endpoints (at :math:`x=-1
1854
+ and :math:`x=\\text{duration}+1`). This shifts the endpoints value to zero, while also
1855
+ rescaling to preserve the amplitude at `:math:`\\text{duration}/2``.
1856
+
1857
+ Args:
1858
+ duration: Pulse length in terms of the sampling period `dt`.
1859
+ amp: The magnitude of the amplitude of the pulse (the value at the midpoint `duration`/2).
1860
+ sigma: A measure of how wide or narrow the sech peak is in terms of `dt`;
1861
+ described mathematically in the class docstring.
1862
+ angle: The angle in radians of the complex phase factor uniformly
1863
+ scaling the pulse. Default value 0.
1864
+ name: Display name for this pulse envelope.
1865
+ zero_ends: If True, zeros the ends at x = -1, x = `duration` + 1,
1866
+ but rescales to preserve `amp`. Default value True.
1867
+ limit_amplitude: If ``True``, then limit the amplitude of the
1868
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1869
+
1870
+ Returns:
1871
+ ScalableSymbolicPulse instance.
1872
+ """
1873
+ parameters = {"sigma": sigma}
1874
+
1875
+ # Prepare symbolic expressions
1876
+ _t, _duration, _amp, _angle, _sigma = sym.symbols("t, duration, amp, angle, sigma")
1877
+ complex_amp = _amp * sym.exp(sym.I * _angle)
1878
+ envelope_expr = complex_amp * sym.sech((_t - (_duration / 2)) / _sigma)
1879
+
1880
+ if zero_ends:
1881
+ shift_val = complex_amp * sym.sech((-1 - (_duration / 2)) / _sigma)
1882
+ envelope_expr = complex_amp * (envelope_expr - shift_val) / (complex_amp - shift_val)
1883
+
1884
+ consts_expr = _sigma > 0
1885
+
1886
+ valid_amp_conditions_expr = sym.Abs(_amp) <= 1.0
1887
+
1888
+ return ScalableSymbolicPulse(
1889
+ pulse_type="Sech",
1890
+ duration=duration,
1891
+ amp=amp,
1892
+ angle=angle,
1893
+ parameters=parameters,
1894
+ name=name,
1895
+ limit_amplitude=limit_amplitude,
1896
+ envelope=envelope_expr,
1897
+ constraints=consts_expr,
1898
+ valid_amp_conditions=valid_amp_conditions_expr,
1899
+ )
1900
+
1901
+
1902
+ def SechDeriv(
1903
+ duration: Union[int, ParameterExpression],
1904
+ amp: Union[float, ParameterExpression],
1905
+ sigma: Union[float, ParameterExpression],
1906
+ angle: Optional[Union[float, ParameterExpression]] = 0.0,
1907
+ name: Optional[str] = None,
1908
+ limit_amplitude: Optional[bool] = None,
1909
+ ) -> ScalableSymbolicPulse:
1910
+ """An unnormalized sech derivative pulse.
1911
+
1912
+ The sech function is centered around the halfway point of the pulse, and the envelope of the
1913
+ pulse is given by:
1914
+
1915
+ .. math::
1916
+
1917
+ f(x) = \\text{A}\\frac{d}{dx}\\left[\\text{sech}
1918
+ \\left(\\frac{x-\\mu}{\\text{sigma}}\\right)\\right] , 0 <= x < duration
1919
+
1920
+ where :math:`\\text{A} = \\text{amp} \\times\\exp\\left(i\\times\\text{angle}\\right)`,
1921
+ :math:`\\mu=\\text{duration}/2`, and :math:`d/dx` is a derivative with respect to `x`.
1922
+
1923
+ Args:
1924
+ duration: Pulse length in terms of the sampling period `dt`.
1925
+ amp: The magnitude of the amplitude of the pulse (the value of the corresponding sech
1926
+ function at the midpoint `duration`/2).
1927
+ sigma: A measure of how wide or narrow the corresponding sech peak is, in terms of `dt`;
1928
+ described mathematically in the class docstring.
1929
+ angle: The angle in radians of the complex phase factor uniformly
1930
+ scaling the pulse. Default value 0.
1931
+ name: Display name for this pulse envelope.
1932
+ limit_amplitude: If ``True``, then limit the amplitude of the
1933
+ waveform to 1. The default is ``True`` and the amplitude is constrained to 1.
1934
+
1935
+ Returns:
1936
+ ScalableSymbolicPulse instance.
1937
+ """
1938
+ parameters = {"sigma": sigma}
1939
+
1940
+ # Prepare symbolic expressions
1941
+ _t, _duration, _amp, _angle, _sigma = sym.symbols("t, duration, amp, angle, sigma")
1942
+ time_argument = (_t - (_duration / 2)) / _sigma
1943
+ sech_deriv = -sym.tanh(time_argument) * sym.sech(time_argument) / _sigma
1944
+
1945
+ envelope_expr = _amp * sym.exp(sym.I * _angle) * sech_deriv
1946
+
1947
+ consts_expr = _sigma > 0
1948
+
1949
+ valid_amp_conditions_expr = sym.Abs(_amp) / _sigma <= 2.0
1950
+
1951
+ return ScalableSymbolicPulse(
1952
+ pulse_type="SechDeriv",
1953
+ duration=duration,
1954
+ amp=amp,
1955
+ angle=angle,
1956
+ parameters=parameters,
1957
+ name=name,
1958
+ limit_amplitude=limit_amplitude,
1959
+ envelope=envelope_expr,
1960
+ constraints=consts_expr,
1961
+ valid_amp_conditions=valid_amp_conditions_expr,
1962
+ )