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,1044 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 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
+ """The n-local circuit class."""
14
+
15
+ from __future__ import annotations
16
+ import typing
17
+ from collections.abc import Callable, Mapping, Sequence
18
+
19
+ from itertools import combinations
20
+
21
+ import numpy
22
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
23
+ from qiskit.circuit.quantumregister import QuantumRegister
24
+ from qiskit.circuit import Instruction, Parameter, ParameterVector, ParameterExpression
25
+ from qiskit.exceptions import QiskitError
26
+
27
+ from ..blueprintcircuit import BlueprintCircuit
28
+
29
+ if typing.TYPE_CHECKING:
30
+ import qiskit # pylint: disable=cyclic-import
31
+
32
+
33
+ class NLocal(BlueprintCircuit):
34
+ """The n-local circuit class.
35
+
36
+ The structure of the n-local circuit are alternating rotation and entanglement layers.
37
+ In both layers, parameterized circuit-blocks act on the circuit in a defined way.
38
+ In the rotation layer, the blocks are applied stacked on top of each other, while in the
39
+ entanglement layer according to the ``entanglement`` strategy.
40
+ The circuit blocks can have arbitrary sizes (smaller equal to the number of qubits in the
41
+ circuit). Each layer is repeated ``reps`` times, and by default a final rotation layer is
42
+ appended.
43
+
44
+ For instance, a rotation block on 2 qubits and an entanglement block on 4 qubits using
45
+ ``'linear'`` entanglement yields the following circuit.
46
+
47
+ .. parsed-literal::
48
+
49
+ ┌──────┐ ░ ┌──────┐ ░ ┌──────┐
50
+ ┤0 ├─░─┤0 ├──────────────── ... ─░─┤0 ├
51
+ │ Rot │ ░ │ │┌──────┐ ░ │ Rot │
52
+ ┤1 ├─░─┤1 ├┤0 ├──────── ... ─░─┤1 ├
53
+ ├──────┤ ░ │ Ent ││ │┌──────┐ ░ ├──────┤
54
+ ┤0 ├─░─┤2 ├┤1 ├┤0 ├ ... ─░─┤0 ├
55
+ │ Rot │ ░ │ ││ Ent ││ │ ░ │ Rot │
56
+ ┤1 ├─░─┤3 ├┤2 ├┤1 ├ ... ─░─┤1 ├
57
+ ├──────┤ ░ └──────┘│ ││ Ent │ ░ ├──────┤
58
+ ┤0 ├─░─────────┤3 ├┤2 ├ ... ─░─┤0 ├
59
+ │ Rot │ ░ └──────┘│ │ ░ │ Rot │
60
+ ┤1 ├─░─────────────────┤3 ├ ... ─░─┤1 ├
61
+ └──────┘ ░ └──────┘ ░ └──────┘
62
+
63
+ | |
64
+ +---------------------------------+
65
+ repeated reps times
66
+
67
+ If specified, barriers can be inserted in between every block.
68
+ If an initial state object is provided, it is added in front of the NLocal.
69
+ """
70
+
71
+ def __init__(
72
+ self,
73
+ num_qubits: int | None = None,
74
+ rotation_blocks: QuantumCircuit
75
+ | list[QuantumCircuit]
76
+ | qiskit.circuit.Instruction
77
+ | list[qiskit.circuit.Instruction]
78
+ | None = None,
79
+ entanglement_blocks: QuantumCircuit
80
+ | list[QuantumCircuit]
81
+ | qiskit.circuit.Instruction
82
+ | list[qiskit.circuit.Instruction]
83
+ | None = None,
84
+ entanglement: list[int] | list[list[int]] | None = None,
85
+ reps: int = 1,
86
+ insert_barriers: bool = False,
87
+ parameter_prefix: str = "θ",
88
+ overwrite_block_parameters: bool | list[list[Parameter]] = True,
89
+ skip_final_rotation_layer: bool = False,
90
+ skip_unentangled_qubits: bool = False,
91
+ initial_state: QuantumCircuit | None = None,
92
+ name: str | None = "nlocal",
93
+ flatten: bool | None = None,
94
+ ) -> None:
95
+ """
96
+ Args:
97
+ num_qubits: The number of qubits of the circuit.
98
+ rotation_blocks: The blocks used in the rotation layers. If multiple are passed,
99
+ these will be applied one after another (like new sub-layers).
100
+ entanglement_blocks: The blocks used in the entanglement layers. If multiple are passed,
101
+ these will be applied one after another. To use different entanglements for
102
+ the sub-layers, see :meth:`get_entangler_map`.
103
+ entanglement: The indices specifying on which qubits the input blocks act. If ``None``, the
104
+ entanglement blocks are applied at the top of the circuit.
105
+ reps: Specifies how often the rotation blocks and entanglement blocks are repeated.
106
+ insert_barriers: If ``True``, barriers are inserted in between each layer. If ``False``,
107
+ no barriers are inserted.
108
+ parameter_prefix: The prefix used if default parameters are generated.
109
+ overwrite_block_parameters: If the parameters in the added blocks should be overwritten.
110
+ If ``False``, the parameters in the blocks are not changed.
111
+ skip_final_rotation_layer: Whether a final rotation layer is added to the circuit.
112
+ skip_unentangled_qubits: If ``True``, the rotation gates act only on qubits that
113
+ are entangled. If ``False``, the rotation gates act on all qubits.
114
+ initial_state: A :class:`.QuantumCircuit` object which can be used to describe an initial
115
+ state prepended to the NLocal circuit.
116
+ name: The name of the circuit.
117
+ flatten: Set this to ``True`` to output a flat circuit instead of nesting it inside multiple
118
+ layers of gate objects. By default currently the contents of
119
+ the output circuit will be wrapped in nested objects for
120
+ cleaner visualization. However, if you're using this circuit
121
+ for anything besides visualization its **strongly** recommended
122
+ to set this flag to ``True`` to avoid a large performance
123
+ overhead for parameter binding.
124
+
125
+ Raises:
126
+ ValueError: If ``reps`` parameter is less than or equal to 0.
127
+ TypeError: If ``reps`` parameter is not an int value.
128
+ """
129
+ super().__init__(name=name)
130
+
131
+ self._num_qubits: int | None = None
132
+ self._insert_barriers = insert_barriers
133
+ self._reps = reps
134
+ self._entanglement_blocks: list[QuantumCircuit] = []
135
+ self._rotation_blocks: list[QuantumCircuit] = []
136
+ self._prepended_blocks: list[QuantumCircuit] = []
137
+ self._prepended_entanglement: list[list[list[int]] | str] = []
138
+ self._appended_blocks: list[QuantumCircuit] = []
139
+ self._appended_entanglement: list[list[list[int]] | str] = []
140
+ self._entanglement = None
141
+ self._entangler_maps = None
142
+ self._ordered_parameters: ParameterVector | list[Parameter] = ParameterVector(
143
+ name=parameter_prefix
144
+ )
145
+ self._overwrite_block_parameters = overwrite_block_parameters
146
+ self._skip_final_rotation_layer = skip_final_rotation_layer
147
+ self._skip_unentangled_qubits = skip_unentangled_qubits
148
+ self._initial_state: QuantumCircuit | None = None
149
+ self._initial_state_circuit: QuantumCircuit | None = None
150
+ self._bounds: list[tuple[float | None, float | None]] | None = None
151
+ self._flatten = flatten
152
+
153
+ if int(reps) != reps:
154
+ raise TypeError("The value of reps should be int")
155
+
156
+ if reps < 0:
157
+ raise ValueError("The value of reps should be larger than or equal to 0")
158
+
159
+ if num_qubits is not None:
160
+ self.num_qubits = num_qubits
161
+
162
+ if entanglement_blocks is not None:
163
+ self.entanglement_blocks = entanglement_blocks
164
+
165
+ if rotation_blocks is not None:
166
+ self.rotation_blocks = rotation_blocks
167
+
168
+ if entanglement is not None:
169
+ self.entanglement = entanglement
170
+
171
+ if initial_state is not None:
172
+ self.initial_state = initial_state
173
+
174
+ @property
175
+ def num_qubits(self) -> int:
176
+ """Returns the number of qubits in this circuit.
177
+
178
+ Returns:
179
+ The number of qubits.
180
+ """
181
+ return self._num_qubits if self._num_qubits is not None else 0
182
+
183
+ @num_qubits.setter
184
+ def num_qubits(self, num_qubits: int) -> None:
185
+ """Set the number of qubits for the n-local circuit.
186
+
187
+ Args:
188
+ The new number of qubits.
189
+ """
190
+ if self._num_qubits != num_qubits:
191
+ # invalidate the circuit
192
+ self._invalidate()
193
+ self._num_qubits = num_qubits
194
+ self.qregs = [QuantumRegister(num_qubits, name="q")]
195
+
196
+ @property
197
+ def flatten(self) -> bool:
198
+ """Returns whether the circuit is wrapped in nested gates/instructions or flattened."""
199
+ return bool(self._flatten)
200
+
201
+ @flatten.setter
202
+ def flatten(self, flatten: bool) -> None:
203
+ self._invalidate()
204
+ self._flatten = flatten
205
+
206
+ def _convert_to_block(self, layer: typing.Any) -> QuantumCircuit:
207
+ """Try to convert ``layer`` to a QuantumCircuit.
208
+
209
+ Args:
210
+ layer: The object to be converted to an NLocal block / Instruction.
211
+
212
+ Returns:
213
+ The layer converted to a circuit.
214
+
215
+ Raises:
216
+ TypeError: If the input cannot be converted to a circuit.
217
+ """
218
+ if isinstance(layer, QuantumCircuit):
219
+ return layer
220
+
221
+ if isinstance(layer, Instruction):
222
+ circuit = QuantumCircuit(layer.num_qubits)
223
+ circuit.append(layer, list(range(layer.num_qubits)))
224
+ return circuit
225
+
226
+ try:
227
+ circuit = QuantumCircuit(layer.num_qubits)
228
+ circuit.append(layer.to_instruction(), list(range(layer.num_qubits)))
229
+ return circuit
230
+ except AttributeError:
231
+ pass
232
+
233
+ raise TypeError(f"Adding a {type(layer)} to an NLocal is not supported.")
234
+
235
+ @property
236
+ def rotation_blocks(self) -> list[QuantumCircuit]:
237
+ """The blocks in the rotation layers.
238
+
239
+ Returns:
240
+ The blocks in the rotation layers.
241
+ """
242
+ return self._rotation_blocks
243
+
244
+ @rotation_blocks.setter
245
+ def rotation_blocks(
246
+ self, blocks: QuantumCircuit | list[QuantumCircuit] | Instruction | list[Instruction]
247
+ ) -> None:
248
+ """Set the blocks in the rotation layers.
249
+
250
+ Args:
251
+ blocks: The new blocks for the rotation layers.
252
+ """
253
+ # cannot check for the attribute ``'__len__'`` because a circuit also has this attribute
254
+ if not isinstance(blocks, (list, numpy.ndarray)):
255
+ blocks = [blocks]
256
+
257
+ self._invalidate()
258
+ self._rotation_blocks = [self._convert_to_block(block) for block in blocks]
259
+
260
+ @property
261
+ def entanglement_blocks(self) -> list[QuantumCircuit]:
262
+ """The blocks in the entanglement layers.
263
+
264
+ Returns:
265
+ The blocks in the entanglement layers.
266
+ """
267
+ return self._entanglement_blocks
268
+
269
+ @entanglement_blocks.setter
270
+ def entanglement_blocks(
271
+ self, blocks: QuantumCircuit | list[QuantumCircuit] | Instruction | list[Instruction]
272
+ ) -> None:
273
+ """Set the blocks in the entanglement layers.
274
+
275
+ Args:
276
+ blocks: The new blocks for the entanglement layers.
277
+ """
278
+ # cannot check for the attribute ``'__len__'`` because a circuit also has this attribute
279
+ if not isinstance(blocks, (list, numpy.ndarray)):
280
+ blocks = [blocks]
281
+
282
+ self._invalidate()
283
+ self._entanglement_blocks = [self._convert_to_block(block) for block in blocks]
284
+
285
+ @property
286
+ def entanglement(
287
+ self,
288
+ ) -> str | list[str] | list[list[str]] | list[int] | list[list[int]] | list[
289
+ list[list[int]]
290
+ ] | list[list[list[list[int]]]] | Callable[[int], str] | Callable[[int], list[list[int]]]:
291
+ """Get the entanglement strategy.
292
+
293
+ Returns:
294
+ The entanglement strategy, see :meth:`get_entangler_map` for more detail on how the
295
+ format is interpreted.
296
+ """
297
+ return self._entanglement
298
+
299
+ @entanglement.setter
300
+ def entanglement(
301
+ self,
302
+ entanglement: str
303
+ | list[str]
304
+ | list[list[str]]
305
+ | list[int]
306
+ | list[list[int]]
307
+ | list[list[list[int]]]
308
+ | list[list[list[list[int]]]]
309
+ | Callable[[int], str]
310
+ | Callable[[int], list[list[int]]]
311
+ | None,
312
+ ) -> None:
313
+ """Set the entanglement strategy.
314
+
315
+ Args:
316
+ entanglement: The entanglement strategy. See :meth:`get_entangler_map` for more detail
317
+ on the supported formats.
318
+ """
319
+ self._invalidate()
320
+ self._entanglement = entanglement
321
+
322
+ @property
323
+ def num_layers(self) -> int:
324
+ """Return the number of layers in the n-local circuit.
325
+
326
+ Returns:
327
+ The number of layers in the circuit.
328
+ """
329
+ return 2 * self._reps + int(not self._skip_final_rotation_layer)
330
+
331
+ def _check_configuration(self, raise_on_failure: bool = True) -> bool:
332
+ """Check if the configuration of the NLocal class is valid.
333
+
334
+ Args:
335
+ raise_on_failure: Whether to raise on failure.
336
+
337
+ Returns:
338
+ True, if the configuration is valid and the circuit can be constructed. Otherwise
339
+ an ValueError is raised.
340
+
341
+ Raises:
342
+ ValueError: If the blocks are not set.
343
+ ValueError: If the number of repetitions is not set.
344
+ ValueError: If the qubit indices are not set.
345
+ ValueError: If the number of qubit indices does not match the number of blocks.
346
+ ValueError: If an index in the repetitions list exceeds the number of blocks.
347
+ ValueError: If the number of repetitions does not match the number of block-wise
348
+ parameters.
349
+ ValueError: If a specified qubit index is larger than the (manually set) number of
350
+ qubits.
351
+ """
352
+ valid = True
353
+ if self.num_qubits is None:
354
+ valid = False
355
+ if raise_on_failure:
356
+ raise ValueError("No number of qubits specified.")
357
+
358
+ # check no needed parameters are None
359
+ if self.entanglement_blocks is None and self.rotation_blocks is None:
360
+ valid = False
361
+ if raise_on_failure:
362
+ raise ValueError("The blocks are not set.")
363
+
364
+ return valid
365
+
366
+ @property
367
+ def ordered_parameters(self) -> list[Parameter]:
368
+ """The parameters used in the underlying circuit.
369
+
370
+ This includes float values and duplicates.
371
+
372
+ Examples:
373
+
374
+ >>> # prepare circuit ...
375
+ >>> print(nlocal)
376
+ ┌───────┐┌──────────┐┌──────────┐┌──────────┐
377
+ q_0: ┤ Ry(1) ├┤ Ry(θ[1]) ├┤ Ry(θ[1]) ├┤ Ry(θ[3]) ├
378
+ └───────┘└──────────┘└──────────┘└──────────┘
379
+ >>> nlocal.parameters
380
+ {Parameter(θ[1]), Parameter(θ[3])}
381
+ >>> nlocal.ordered_parameters
382
+ [1, Parameter(θ[1]), Parameter(θ[1]), Parameter(θ[3])]
383
+
384
+ Returns:
385
+ The parameters objects used in the circuit.
386
+ """
387
+ if isinstance(self._ordered_parameters, ParameterVector):
388
+ self._ordered_parameters.resize(self.num_parameters_settable)
389
+ return list(self._ordered_parameters)
390
+
391
+ return self._ordered_parameters
392
+
393
+ @ordered_parameters.setter
394
+ def ordered_parameters(self, parameters: ParameterVector | list[Parameter]) -> None:
395
+ """Set the parameters used in the underlying circuit.
396
+
397
+ Args:
398
+ The parameters to be used in the underlying circuit.
399
+
400
+ Raises:
401
+ ValueError: If the length of ordered parameters does not match the number of
402
+ parameters in the circuit and they are not a ``ParameterVector`` (which could
403
+ be resized to fit the number of parameters).
404
+ """
405
+ if (
406
+ not isinstance(parameters, ParameterVector)
407
+ and len(parameters) != self.num_parameters_settable
408
+ ):
409
+ raise ValueError(
410
+ "The length of ordered parameters must be equal to the number of "
411
+ "settable parameters in the circuit ({}), but is {}".format(
412
+ self.num_parameters_settable, len(parameters)
413
+ )
414
+ )
415
+ self._ordered_parameters = parameters
416
+ self._invalidate()
417
+
418
+ @property
419
+ def insert_barriers(self) -> bool:
420
+ """If barriers are inserted in between the layers or not.
421
+
422
+ Returns:
423
+ ``True``, if barriers are inserted in between the layers, ``False`` if not.
424
+ """
425
+ return self._insert_barriers
426
+
427
+ @insert_barriers.setter
428
+ def insert_barriers(self, insert_barriers: bool) -> None:
429
+ """Specify whether barriers should be inserted in between the layers or not.
430
+
431
+ Args:
432
+ insert_barriers: If True, barriers are inserted, if False not.
433
+ """
434
+ # if insert_barriers changes, we have to invalidate the circuit definition,
435
+ # if it is the same as before we can leave the NLocal instance as it is
436
+ if insert_barriers is not self._insert_barriers:
437
+ self._invalidate()
438
+ self._insert_barriers = insert_barriers
439
+
440
+ def get_unentangled_qubits(self) -> set[int]:
441
+ """Get the indices of unentangled qubits in a set.
442
+
443
+ Returns:
444
+ The unentangled qubits.
445
+ """
446
+ entangled_qubits = set()
447
+ for i in range(self._reps):
448
+ for j, block in enumerate(self.entanglement_blocks):
449
+ entangler_map = self.get_entangler_map(i, j, block.num_qubits)
450
+ entangled_qubits.update([idx for indices in entangler_map for idx in indices])
451
+ unentangled_qubits = set(range(self.num_qubits)) - entangled_qubits
452
+
453
+ return unentangled_qubits
454
+
455
+ @property
456
+ def num_parameters_settable(self) -> int:
457
+ """The number of total parameters that can be set to distinct values.
458
+
459
+ This does not change when the parameters are bound or exchanged for same parameters,
460
+ and therefore is different from ``num_parameters`` which counts the number of unique
461
+ :class:`~qiskit.circuit.Parameter` objects currently in the circuit.
462
+
463
+ Returns:
464
+ The number of parameters originally available in the circuit.
465
+
466
+ Note:
467
+ This quantity does not require the circuit to be built yet.
468
+ """
469
+ num = 0
470
+
471
+ for i in range(self._reps):
472
+ for j, block in enumerate(self.entanglement_blocks):
473
+ entangler_map = self.get_entangler_map(i, j, block.num_qubits)
474
+ num += len(entangler_map) * len(get_parameters(block))
475
+
476
+ if self._skip_unentangled_qubits:
477
+ unentangled_qubits = self.get_unentangled_qubits()
478
+
479
+ num_rot = 0
480
+ for block in self.rotation_blocks:
481
+ block_indices = [
482
+ list(range(j * block.num_qubits, (j + 1) * block.num_qubits))
483
+ for j in range(self.num_qubits // block.num_qubits)
484
+ ]
485
+ if self._skip_unentangled_qubits:
486
+ block_indices = [
487
+ indices
488
+ for indices in block_indices
489
+ if set(indices).isdisjoint(unentangled_qubits)
490
+ ]
491
+ num_rot += len(block_indices) * len(get_parameters(block))
492
+
493
+ num += num_rot * (self._reps + int(not self._skip_final_rotation_layer))
494
+
495
+ return num
496
+
497
+ @property
498
+ def reps(self) -> int:
499
+ """The number of times rotation and entanglement block are repeated.
500
+
501
+ Returns:
502
+ The number of repetitions.
503
+ """
504
+ return self._reps
505
+
506
+ @reps.setter
507
+ def reps(self, repetitions: int) -> None:
508
+ """Set the repetitions.
509
+
510
+ If the repetitions are `0`, only one rotation layer with no entanglement
511
+ layers is applied (unless ``self.skip_final_rotation_layer`` is set to ``True``).
512
+
513
+ Args:
514
+ repetitions: The new repetitions.
515
+
516
+ Raises:
517
+ ValueError: If reps setter has parameter repetitions < 0.
518
+ """
519
+ if repetitions < 0:
520
+ raise ValueError("The repetitions should be larger than or equal to 0")
521
+ if repetitions != self._reps:
522
+ self._invalidate()
523
+ self._reps = repetitions
524
+
525
+ def print_settings(self) -> str:
526
+ """Returns information about the setting.
527
+
528
+ Returns:
529
+ The class name and the attributes/parameters of the instance as ``str``.
530
+ """
531
+ ret = f"NLocal: {self.__class__.__name__}\n"
532
+ params = ""
533
+ for key, value in self.__dict__.items():
534
+ if key[0] == "_":
535
+ params += f"-- {key[1:]}: {value}\n"
536
+ ret += f"{params}"
537
+ return ret
538
+
539
+ @property
540
+ def preferred_init_points(self) -> list[float] | None:
541
+ """The initial points for the parameters. Can be stored as initial guess in optimization.
542
+
543
+ Returns:
544
+ The initial values for the parameters, or None, if none have been set.
545
+ """
546
+ return None
547
+
548
+ # pylint: disable=too-many-return-statements
549
+ def get_entangler_map(
550
+ self, rep_num: int, block_num: int, num_block_qubits: int
551
+ ) -> Sequence[Sequence[int]]:
552
+ """Get the entangler map for in the repetition ``rep_num`` and the block ``block_num``.
553
+
554
+ The entangler map for the current block is derived from the value of ``self.entanglement``.
555
+ Below the different cases are listed, where ``i`` and ``j`` denote the repetition number
556
+ and the block number, respectively, and ``n`` the number of qubits in the block.
557
+
558
+ =================================== ========================================================
559
+ entanglement type entangler map
560
+ =================================== ========================================================
561
+ ``None`` ``[[0, ..., n - 1]]``
562
+ ``str`` (e.g ``'full'``) the specified connectivity on ``n`` qubits
563
+ ``List[int]`` [``entanglement``]
564
+ ``List[List[int]]`` ``entanglement``
565
+ ``List[List[List[int]]]`` ``entanglement[i]``
566
+ ``List[List[List[List[int]]]]`` ``entanglement[i][j]``
567
+ ``List[str]`` the connectivity specified in ``entanglement[i]``
568
+ ``List[List[str]]`` the connectivity specified in ``entanglement[i][j]``
569
+ ``Callable[int, str]`` same as ``List[str]``
570
+ ``Callable[int, List[List[int]]]`` same as ``List[List[List[int]]]``
571
+ =================================== ========================================================
572
+
573
+
574
+ Note that all indices are to be taken modulo the length of the array they act on, i.e.
575
+ no out-of-bounds index error will be raised but we re-iterate from the beginning of the
576
+ list.
577
+
578
+ Args:
579
+ rep_num: The current repetition we are in.
580
+ block_num: The block number within the entanglement layers.
581
+ num_block_qubits: The number of qubits in the block.
582
+
583
+ Returns:
584
+ The entangler map for the current block in the current repetition.
585
+
586
+ Raises:
587
+ ValueError: If the value of ``entanglement`` could not be cast to a corresponding
588
+ entangler map.
589
+ """
590
+ i, j, n = rep_num, block_num, num_block_qubits
591
+ entanglement = self._entanglement
592
+
593
+ # entanglement is None
594
+ if entanglement is None:
595
+ return [list(range(n))]
596
+
597
+ # entanglement is callable
598
+ if callable(entanglement):
599
+ entanglement = entanglement(i)
600
+
601
+ # entanglement is str
602
+ if isinstance(entanglement, str):
603
+ return get_entangler_map(n, self.num_qubits, entanglement, offset=i)
604
+
605
+ # check if entanglement is list of something
606
+ if not isinstance(entanglement, (tuple, list)):
607
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
608
+ num_i = len(entanglement)
609
+
610
+ # entanglement is List[str]
611
+ if all(isinstance(en, str) for en in entanglement):
612
+ return get_entangler_map(n, self.num_qubits, entanglement[i % num_i], offset=i)
613
+
614
+ # entanglement is List[int]
615
+ if all(isinstance(en, (int, numpy.integer)) for en in entanglement):
616
+ return [[int(en) for en in entanglement]]
617
+
618
+ # check if entanglement is List[List]
619
+ if not all(isinstance(en, (tuple, list)) for en in entanglement):
620
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
621
+ num_j = len(entanglement[i % num_i])
622
+
623
+ # entanglement is List[List[str]]
624
+ if all(isinstance(e2, str) for en in entanglement for e2 in en):
625
+ return get_entangler_map(
626
+ n, self.num_qubits, entanglement[i % num_i][j % num_j], offset=i
627
+ )
628
+
629
+ # entanglement is List[List[int]]
630
+ if all(isinstance(e2, (int, numpy.int32, numpy.int64)) for en in entanglement for e2 in en):
631
+ for ind, en in enumerate(entanglement):
632
+ entanglement[ind] = tuple(map(int, en))
633
+ return entanglement
634
+
635
+ # check if entanglement is List[List[List]]
636
+ if not all(isinstance(e2, (tuple, list)) for en in entanglement for e2 in en):
637
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
638
+
639
+ # entanglement is List[List[List[int]]]
640
+ if all(
641
+ isinstance(e3, (int, numpy.int32, numpy.int64))
642
+ for en in entanglement
643
+ for e2 in en
644
+ for e3 in e2
645
+ ):
646
+ for en in entanglement:
647
+ for ind, e2 in enumerate(en):
648
+ en[ind] = tuple(map(int, e2))
649
+ return entanglement[i % num_i]
650
+
651
+ # check if entanglement is List[List[List[List]]]
652
+ if not all(isinstance(e3, (tuple, list)) for en in entanglement for e2 in en for e3 in e2):
653
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
654
+
655
+ # entanglement is List[List[List[List[int]]]]
656
+ if all(
657
+ isinstance(e4, (int, numpy.int32, numpy.int64))
658
+ for en in entanglement
659
+ for e2 in en
660
+ for e3 in e2
661
+ for e4 in e3
662
+ ):
663
+ for en in entanglement:
664
+ for e2 in en:
665
+ for ind, e3 in enumerate(e2):
666
+ e2[ind] = tuple(map(int, e3))
667
+ return entanglement[i % num_i][j % num_j]
668
+
669
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
670
+
671
+ @property
672
+ def initial_state(self) -> QuantumCircuit:
673
+ """Return the initial state that is added in front of the n-local circuit.
674
+
675
+ Returns:
676
+ The initial state.
677
+ """
678
+ return self._initial_state
679
+
680
+ @initial_state.setter
681
+ def initial_state(self, initial_state: QuantumCircuit) -> None:
682
+ """Set the initial state.
683
+
684
+ Args:
685
+ initial_state: The new initial state.
686
+
687
+ Raises:
688
+ ValueError: If the number of qubits has been set before and the initial state
689
+ does not match the number of qubits.
690
+ """
691
+ self._initial_state = initial_state
692
+ self._invalidate()
693
+
694
+ @property
695
+ def parameter_bounds(self) -> list[tuple[float, float]] | None:
696
+ """The parameter bounds for the unbound parameters in the circuit.
697
+
698
+ Returns:
699
+ A list of pairs indicating the bounds, as (lower, upper). None indicates an unbounded
700
+ parameter in the corresponding direction. If ``None`` is returned, problem is fully
701
+ unbounded.
702
+ """
703
+ if not self._is_built:
704
+ self._build()
705
+ return self._bounds
706
+
707
+ @parameter_bounds.setter
708
+ def parameter_bounds(self, bounds: list[tuple[float, float]]) -> None:
709
+ """Set the parameter bounds.
710
+
711
+ Args:
712
+ bounds: The new parameter bounds.
713
+ """
714
+ self._bounds = bounds
715
+
716
+ def add_layer(
717
+ self,
718
+ other: QuantumCircuit | qiskit.circuit.Instruction,
719
+ entanglement: list[int] | str | list[list[int]] | None = None,
720
+ front: bool = False,
721
+ ) -> "NLocal":
722
+ """Append another layer to the NLocal.
723
+
724
+ Args:
725
+ other: The layer to compose, can be another NLocal, an Instruction or Gate,
726
+ or a QuantumCircuit.
727
+ entanglement: The entanglement or qubit indices.
728
+ front: If True, ``other`` is appended to the front, else to the back.
729
+
730
+ Returns:
731
+ self, such that chained composes are possible.
732
+
733
+ Raises:
734
+ TypeError: If `other` is not compatible, i.e. is no Instruction and does not have a
735
+ `to_instruction` method.
736
+ """
737
+ block = self._convert_to_block(other)
738
+
739
+ if entanglement is None:
740
+ entanglement = [list(range(block.num_qubits))]
741
+ elif isinstance(entanglement, list) and not isinstance(entanglement[0], list):
742
+ entanglement = [entanglement]
743
+ if front:
744
+ self._prepended_blocks += [block]
745
+ self._prepended_entanglement += [entanglement]
746
+ else:
747
+ self._appended_blocks += [block]
748
+ self._appended_entanglement += [entanglement]
749
+
750
+ if isinstance(entanglement, list):
751
+ num_qubits = 1 + max(max(indices) for indices in entanglement)
752
+ if num_qubits > self.num_qubits:
753
+ self._invalidate() # rebuild circuit
754
+ self.num_qubits = num_qubits
755
+
756
+ # modify the circuit accordingly
757
+ if front is False and self._is_built:
758
+ if self._insert_barriers and len(self.data) > 0:
759
+ self.barrier()
760
+
761
+ if isinstance(entanglement, str):
762
+ entangler_map: Sequence[Sequence[int]] = get_entangler_map(
763
+ block.num_qubits, self.num_qubits, entanglement
764
+ )
765
+ else:
766
+ entangler_map = entanglement
767
+
768
+ layer = QuantumCircuit(self.num_qubits)
769
+ for i in entangler_map:
770
+ params = self.ordered_parameters[-len(get_parameters(block)) :]
771
+ parameterized_block = self._parameterize_block(block, params=params)
772
+ layer.compose(parameterized_block, i, inplace=True)
773
+
774
+ self.compose(layer, inplace=True)
775
+ else:
776
+ # cannot prepend a block currently, just rebuild
777
+ self._invalidate()
778
+
779
+ return self
780
+
781
+ def assign_parameters(
782
+ self,
783
+ parameters: Mapping[Parameter, ParameterExpression | float]
784
+ | Sequence[ParameterExpression | float],
785
+ inplace: bool = False,
786
+ **kwargs,
787
+ ) -> QuantumCircuit | None:
788
+ """Assign parameters to the n-local circuit.
789
+
790
+ This method also supports passing a list instead of a dictionary. If a list
791
+ is passed, the list must have the same length as the number of unbound parameters in
792
+ the circuit. The parameters are assigned in the order of the parameters in
793
+ :meth:`ordered_parameters`.
794
+
795
+ Returns:
796
+ A copy of the NLocal circuit with the specified parameters.
797
+
798
+ Raises:
799
+ AttributeError: If the parameters are given as list and do not match the number
800
+ of parameters.
801
+ """
802
+ if parameters is None or len(parameters) == 0:
803
+ return self
804
+
805
+ if not self._is_built:
806
+ self._build()
807
+
808
+ return super().assign_parameters(parameters, inplace=inplace, **kwargs)
809
+
810
+ def _parameterize_block(
811
+ self, block, param_iter=None, rep_num=None, block_num=None, indices=None, params=None
812
+ ):
813
+ """Convert ``block`` to a circuit of correct width and parameterized using the iterator."""
814
+ if self._overwrite_block_parameters:
815
+ # check if special parameters should be used
816
+ # pylint: disable=assignment-from-none
817
+ if params is None:
818
+ params = self._parameter_generator(rep_num, block_num, indices)
819
+ if params is None:
820
+ params = [next(param_iter) for _ in range(len(get_parameters(block)))]
821
+
822
+ update = dict(zip(block.parameters, params))
823
+ return block.assign_parameters(update)
824
+
825
+ return block.copy()
826
+
827
+ def _build_rotation_layer(self, circuit, param_iter, i):
828
+ """Build a rotation layer."""
829
+ # if the unentangled qubits are skipped, compute the set of qubits that are not entangled
830
+ if self._skip_unentangled_qubits:
831
+ unentangled_qubits = self.get_unentangled_qubits()
832
+
833
+ # iterate over all rotation blocks
834
+ for j, block in enumerate(self.rotation_blocks):
835
+ # create a new layer
836
+ layer = QuantumCircuit(*self.qregs)
837
+
838
+ # we apply the rotation gates stacked on top of each other, i.e.
839
+ # if we have 4 qubits and a rotation block of width 2, we apply two instances
840
+ block_indices = [
841
+ list(range(k * block.num_qubits, (k + 1) * block.num_qubits))
842
+ for k in range(self.num_qubits // block.num_qubits)
843
+ ]
844
+
845
+ # if unentangled qubits should not be acted on, remove all operations that
846
+ # touch an unentangled qubit
847
+ if self._skip_unentangled_qubits:
848
+ block_indices = [
849
+ indices
850
+ for indices in block_indices
851
+ if set(indices).isdisjoint(unentangled_qubits)
852
+ ]
853
+
854
+ # apply the operations in the layer
855
+ for indices in block_indices:
856
+ parameterized_block = self._parameterize_block(block, param_iter, i, j, indices)
857
+ layer.compose(parameterized_block, indices, inplace=True)
858
+
859
+ # add the layer to the circuit
860
+ circuit.compose(layer, inplace=True)
861
+
862
+ def _build_entanglement_layer(self, circuit, param_iter, i):
863
+ """Build an entanglement layer."""
864
+ # iterate over all entanglement blocks
865
+ for j, block in enumerate(self.entanglement_blocks):
866
+ # create a new layer and get the entangler map for this block
867
+ layer = QuantumCircuit(*self.qregs)
868
+ entangler_map = self.get_entangler_map(i, j, block.num_qubits)
869
+
870
+ # apply the operations in the layer
871
+ for indices in entangler_map:
872
+ parameterized_block = self._parameterize_block(block, param_iter, i, j, indices)
873
+ layer.compose(parameterized_block, indices, inplace=True)
874
+
875
+ # add the layer to the circuit
876
+ circuit.compose(layer, inplace=True)
877
+
878
+ def _build_additional_layers(self, circuit, which):
879
+ if which == "appended":
880
+ blocks = self._appended_blocks
881
+ entanglements = self._appended_entanglement
882
+ elif which == "prepended":
883
+ blocks = reversed(self._prepended_blocks)
884
+ entanglements = reversed(self._prepended_entanglement)
885
+ else:
886
+ raise ValueError("`which` must be either `appended` or `prepended`.")
887
+
888
+ for block, ent in zip(blocks, entanglements):
889
+ layer = QuantumCircuit(*self.qregs)
890
+ if isinstance(ent, str):
891
+ ent = get_entangler_map(block.num_qubits, self.num_qubits, ent)
892
+ for indices in ent:
893
+ layer.compose(block, indices, inplace=True)
894
+
895
+ circuit.compose(layer, inplace=True)
896
+
897
+ def _build(self) -> None:
898
+ """If not already built, build the circuit."""
899
+ if self._is_built:
900
+ return
901
+
902
+ super()._build()
903
+
904
+ if self.num_qubits == 0:
905
+ return
906
+
907
+ if not self._flatten:
908
+ circuit = QuantumCircuit(*self.qregs, name=self.name)
909
+ else:
910
+ circuit = self
911
+
912
+ # use the initial state as starting circuit, if it is set
913
+ if self.initial_state:
914
+ circuit.compose(self.initial_state.copy(), inplace=True)
915
+
916
+ param_iter = iter(self.ordered_parameters)
917
+
918
+ # build the prepended layers
919
+ self._build_additional_layers(circuit, "prepended")
920
+
921
+ # main loop to build the entanglement and rotation layers
922
+ for i in range(self.reps):
923
+ # insert barrier if specified and there is a preceding layer
924
+ if self._insert_barriers and (i > 0 or len(self._prepended_blocks) > 0):
925
+ circuit.barrier()
926
+
927
+ # build the rotation layer
928
+ self._build_rotation_layer(circuit, param_iter, i)
929
+
930
+ # barrier in between rotation and entanglement layer
931
+ if self._insert_barriers and len(self._rotation_blocks) > 0:
932
+ circuit.barrier()
933
+
934
+ # build the entanglement layer
935
+ self._build_entanglement_layer(circuit, param_iter, i)
936
+
937
+ # add the final rotation layer
938
+ if not self._skip_final_rotation_layer:
939
+ if self.insert_barriers and self.reps > 0:
940
+ circuit.barrier()
941
+ self._build_rotation_layer(circuit, param_iter, self.reps)
942
+
943
+ # add the appended layers
944
+ self._build_additional_layers(circuit, "appended")
945
+
946
+ # cast global phase to float if it has no free parameters
947
+ if isinstance(circuit.global_phase, ParameterExpression):
948
+ try:
949
+ circuit.global_phase = float(circuit.global_phase)
950
+ except TypeError:
951
+ # expression contains free parameters
952
+ pass
953
+
954
+ if not self._flatten:
955
+ try:
956
+ block = circuit.to_gate()
957
+ except QiskitError:
958
+ block = circuit.to_instruction()
959
+
960
+ self.append(block, self.qubits)
961
+
962
+ # pylint: disable=unused-argument
963
+ def _parameter_generator(self, rep: int, block: int, indices: list[int]) -> Parameter | None:
964
+ """If certain blocks should use certain parameters this method can be overridden."""
965
+ return None
966
+
967
+
968
+ def get_parameters(block: QuantumCircuit | Instruction) -> list[Parameter]:
969
+ """Return the list of Parameters objects inside a circuit or instruction.
970
+
971
+ This is required since, in a standard gate the parameters are not necessarily Parameter
972
+ objects (e.g. U3Gate(0.1, 0.2, 0.3).params == [0.1, 0.2, 0.3]) and instructions and
973
+ circuits do not have the same interface for parameters.
974
+ """
975
+ if isinstance(block, QuantumCircuit):
976
+ return list(block.parameters)
977
+ else:
978
+ return [p for p in block.params if isinstance(p, ParameterExpression)]
979
+
980
+
981
+ def get_entangler_map(
982
+ num_block_qubits: int, num_circuit_qubits: int, entanglement: str, offset: int = 0
983
+ ) -> Sequence[tuple[int, ...]]:
984
+ """Get an entangler map for an arbitrary number of qubits.
985
+
986
+ Args:
987
+ num_block_qubits: The number of qubits of the entangling block.
988
+ num_circuit_qubits: The number of qubits of the circuit.
989
+ entanglement: The entanglement strategy.
990
+ offset: The block offset, can be used if the entanglements differ per block.
991
+ See mode ``sca`` for instance.
992
+
993
+ Returns:
994
+ The entangler map using mode ``entanglement`` to scatter a block of ``num_block_qubits``
995
+ qubits on ``num_circuit_qubits`` qubits.
996
+
997
+ Raises:
998
+ ValueError: If the entanglement mode ist not supported.
999
+ """
1000
+ n, m = num_circuit_qubits, num_block_qubits
1001
+ if m > n:
1002
+ raise ValueError(
1003
+ "The number of block qubits must be smaller or equal to the number of "
1004
+ "qubits in the circuit."
1005
+ )
1006
+
1007
+ if entanglement == "pairwise" and num_block_qubits > 2:
1008
+ raise ValueError("Pairwise entanglement is not defined for blocks with more than 2 qubits.")
1009
+
1010
+ if entanglement == "full":
1011
+ return list(combinations(list(range(n)), m))
1012
+ elif entanglement == "reverse_linear":
1013
+ # reverse linear connectivity. In the case of m=2 and the entanglement_block='cx'
1014
+ # then it's equivalent to 'full' entanglement
1015
+ reverse = [tuple(range(n - i - m, n - i)) for i in range(n - m + 1)]
1016
+ return reverse
1017
+ elif entanglement in ["linear", "circular", "sca", "pairwise"]:
1018
+ linear = [tuple(range(i, i + m)) for i in range(n - m + 1)]
1019
+ # if the number of block qubits is 1, we don't have to add the 'circular' part
1020
+ if entanglement == "linear" or m == 1:
1021
+ return linear
1022
+
1023
+ if entanglement == "pairwise":
1024
+ return linear[::2] + linear[1::2]
1025
+
1026
+ # circular equals linear plus top-bottom entanglement (if there's space for it)
1027
+ if n > m:
1028
+ circular = [tuple(range(n - m + 1, n)) + (0,)] + linear
1029
+ else:
1030
+ circular = linear
1031
+ if entanglement == "circular":
1032
+ return circular
1033
+
1034
+ # sca is circular plus shift and reverse
1035
+ shifted = circular[-offset:] + circular[:-offset]
1036
+ if offset % 2 == 1: # if odd, reverse the qubit indices
1037
+ sca = [ind[::-1] for ind in shifted]
1038
+ else:
1039
+ sca = shifted
1040
+
1041
+ return sca
1042
+
1043
+ else:
1044
+ raise ValueError(f"Unsupported entanglement type: {entanglement}")