qiskit 1.3.0b1__cp39-abi3-macosx_10_9_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (825) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +127 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +365 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1270 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3264 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +48 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +503 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +163 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +106 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +295 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +261 -0
  54. qiskit/circuit/instruction.py +676 -0
  55. qiskit/circuit/instructionset.py +177 -0
  56. qiskit/circuit/library/__init__.py +572 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +331 -0
  80. qiskit/circuit/library/blueprintcircuit.py +216 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +54 -0
  87. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  88. qiskit/circuit/library/data_preparation/pauli_feature_map.py +343 -0
  89. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  90. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  91. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  92. qiskit/circuit/library/fourier_checking.py +97 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +165 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +121 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +312 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +256 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +192 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +97 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +86 -0
  111. qiskit/circuit/library/grover_operator.py +311 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +98 -0
  114. qiskit/circuit/library/iqp.py +96 -0
  115. qiskit/circuit/library/n_local/__init__.py +33 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +164 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +256 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +173 -0
  119. qiskit/circuit/library/n_local/n_local.py +1071 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +141 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +287 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +186 -0
  123. qiskit/circuit/library/n_local/two_local.py +282 -0
  124. qiskit/circuit/library/overlap.py +117 -0
  125. qiskit/circuit/library/pauli_evolution.py +184 -0
  126. qiskit/circuit/library/phase_estimation.py +99 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +115 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +123 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +257 -0
  135. qiskit/circuit/library/standard_gates/i.py +75 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +433 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +302 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +297 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +318 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +314 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +395 -0
  152. qiskit/circuit/library/standard_gates/u1.py +451 -0
  153. qiskit/circuit/library/standard_gates/u2.py +146 -0
  154. qiskit/circuit/library/standard_gates/u3.py +408 -0
  155. qiskit/circuit/library/standard_gates/x.py +1527 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +261 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +33 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +174 -0
  238. qiskit/circuit/parameterexpression.py +559 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6793 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +604 -0
  249. qiskit/circuit/store.py +95 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/compiler/__init__.py +33 -0
  253. qiskit/compiler/assembler.py +668 -0
  254. qiskit/compiler/scheduler.py +107 -0
  255. qiskit/compiler/sequencer.py +69 -0
  256. qiskit/compiler/transpiler.py +478 -0
  257. qiskit/converters/__init__.py +74 -0
  258. qiskit/converters/circuit_to_dag.py +78 -0
  259. qiskit/converters/circuit_to_dagdependency.py +51 -0
  260. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  261. qiskit/converters/circuit_to_gate.py +107 -0
  262. qiskit/converters/circuit_to_instruction.py +155 -0
  263. qiskit/converters/dag_to_circuit.py +77 -0
  264. qiskit/converters/dag_to_dagdependency.py +55 -0
  265. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  266. qiskit/converters/dagdependency_to_circuit.py +42 -0
  267. qiskit/converters/dagdependency_to_dag.py +49 -0
  268. qiskit/dagcircuit/__init__.py +44 -0
  269. qiskit/dagcircuit/collect_blocks.py +391 -0
  270. qiskit/dagcircuit/dagcircuit.py +24 -0
  271. qiskit/dagcircuit/dagdependency.py +633 -0
  272. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  273. qiskit/dagcircuit/dagdepnode.py +160 -0
  274. qiskit/dagcircuit/dagnode.py +176 -0
  275. qiskit/dagcircuit/exceptions.py +42 -0
  276. qiskit/exceptions.py +153 -0
  277. qiskit/passmanager/__init__.py +240 -0
  278. qiskit/passmanager/base_tasks.py +230 -0
  279. qiskit/passmanager/compilation_status.py +74 -0
  280. qiskit/passmanager/exceptions.py +19 -0
  281. qiskit/passmanager/flow_controllers.py +116 -0
  282. qiskit/passmanager/passmanager.py +333 -0
  283. qiskit/primitives/__init__.py +481 -0
  284. qiskit/primitives/backend_estimator.py +483 -0
  285. qiskit/primitives/backend_estimator_v2.py +434 -0
  286. qiskit/primitives/backend_sampler.py +222 -0
  287. qiskit/primitives/backend_sampler_v2.py +296 -0
  288. qiskit/primitives/base/__init__.py +20 -0
  289. qiskit/primitives/base/base_estimator.py +252 -0
  290. qiskit/primitives/base/base_primitive.py +45 -0
  291. qiskit/primitives/base/base_primitive_job.py +78 -0
  292. qiskit/primitives/base/base_result.py +65 -0
  293. qiskit/primitives/base/base_sampler.py +204 -0
  294. qiskit/primitives/base/estimator_result.py +46 -0
  295. qiskit/primitives/base/sampler_result.py +45 -0
  296. qiskit/primitives/base/validation.py +231 -0
  297. qiskit/primitives/containers/__init__.py +26 -0
  298. qiskit/primitives/containers/bindings_array.py +389 -0
  299. qiskit/primitives/containers/bit_array.py +741 -0
  300. qiskit/primitives/containers/data_bin.py +165 -0
  301. qiskit/primitives/containers/estimator_pub.py +222 -0
  302. qiskit/primitives/containers/object_array.py +94 -0
  303. qiskit/primitives/containers/observables_array.py +279 -0
  304. qiskit/primitives/containers/primitive_result.py +53 -0
  305. qiskit/primitives/containers/pub_result.py +51 -0
  306. qiskit/primitives/containers/sampler_pub.py +193 -0
  307. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  308. qiskit/primitives/containers/shape.py +129 -0
  309. qiskit/primitives/estimator.py +172 -0
  310. qiskit/primitives/primitive_job.py +81 -0
  311. qiskit/primitives/sampler.py +162 -0
  312. qiskit/primitives/statevector_estimator.py +174 -0
  313. qiskit/primitives/statevector_sampler.py +292 -0
  314. qiskit/primitives/utils.py +247 -0
  315. qiskit/providers/__init__.py +803 -0
  316. qiskit/providers/backend.py +656 -0
  317. qiskit/providers/backend_compat.py +452 -0
  318. qiskit/providers/basic_provider/__init__.py +45 -0
  319. qiskit/providers/basic_provider/basic_provider.py +101 -0
  320. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  321. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  322. qiskit/providers/basic_provider/basic_simulator.py +811 -0
  323. qiskit/providers/basic_provider/exceptions.py +30 -0
  324. qiskit/providers/exceptions.py +45 -0
  325. qiskit/providers/fake_provider/__init__.py +105 -0
  326. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  350. qiskit/providers/fake_provider/fake_1q.py +91 -0
  351. qiskit/providers/fake_provider/fake_backend.py +165 -0
  352. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  353. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  354. qiskit/providers/fake_provider/fake_pulse_backend.py +44 -0
  355. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  356. qiskit/providers/fake_provider/generic_backend_v2.py +1019 -0
  357. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  358. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  359. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  360. qiskit/providers/job.py +147 -0
  361. qiskit/providers/jobstatus.py +30 -0
  362. qiskit/providers/models/__init__.py +89 -0
  363. qiskit/providers/models/backendconfiguration.py +1040 -0
  364. qiskit/providers/models/backendproperties.py +517 -0
  365. qiskit/providers/models/backendstatus.py +94 -0
  366. qiskit/providers/models/jobstatus.py +66 -0
  367. qiskit/providers/models/pulsedefaults.py +303 -0
  368. qiskit/providers/options.py +273 -0
  369. qiskit/providers/provider.py +95 -0
  370. qiskit/providers/providerutils.py +110 -0
  371. qiskit/pulse/__init__.py +158 -0
  372. qiskit/pulse/builder.py +2213 -0
  373. qiskit/pulse/calibration_entries.py +378 -0
  374. qiskit/pulse/channels.py +225 -0
  375. qiskit/pulse/configuration.py +245 -0
  376. qiskit/pulse/exceptions.py +43 -0
  377. qiskit/pulse/filters.py +309 -0
  378. qiskit/pulse/instruction_schedule_map.py +409 -0
  379. qiskit/pulse/instructions/__init__.py +67 -0
  380. qiskit/pulse/instructions/acquire.py +148 -0
  381. qiskit/pulse/instructions/delay.py +69 -0
  382. qiskit/pulse/instructions/directives.py +146 -0
  383. qiskit/pulse/instructions/frequency.py +132 -0
  384. qiskit/pulse/instructions/instruction.py +268 -0
  385. qiskit/pulse/instructions/phase.py +149 -0
  386. qiskit/pulse/instructions/play.py +97 -0
  387. qiskit/pulse/instructions/reference.py +98 -0
  388. qiskit/pulse/instructions/snapshot.py +80 -0
  389. qiskit/pulse/library/__init__.py +97 -0
  390. qiskit/pulse/library/continuous.py +430 -0
  391. qiskit/pulse/library/pulse.py +146 -0
  392. qiskit/pulse/library/samplers/__init__.py +15 -0
  393. qiskit/pulse/library/samplers/decorators.py +295 -0
  394. qiskit/pulse/library/samplers/strategies.py +71 -0
  395. qiskit/pulse/library/symbolic_pulses.py +1960 -0
  396. qiskit/pulse/library/waveform.py +134 -0
  397. qiskit/pulse/macros.py +262 -0
  398. qiskit/pulse/parameter_manager.py +445 -0
  399. qiskit/pulse/parser.py +314 -0
  400. qiskit/pulse/reference_manager.py +58 -0
  401. qiskit/pulse/schedule.py +1855 -0
  402. qiskit/pulse/transforms/__init__.py +106 -0
  403. qiskit/pulse/transforms/alignments.py +404 -0
  404. qiskit/pulse/transforms/base_transforms.py +71 -0
  405. qiskit/pulse/transforms/canonicalization.py +498 -0
  406. qiskit/pulse/transforms/dag.py +115 -0
  407. qiskit/pulse/utils.py +149 -0
  408. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  409. qiskit/qasm/libs/qelib1.inc +266 -0
  410. qiskit/qasm/libs/stdgates.inc +82 -0
  411. qiskit/qasm2/__init__.py +654 -0
  412. qiskit/qasm2/exceptions.py +27 -0
  413. qiskit/qasm2/export.py +370 -0
  414. qiskit/qasm2/parse.py +408 -0
  415. qiskit/qasm3/__init__.py +366 -0
  416. qiskit/qasm3/ast.py +630 -0
  417. qiskit/qasm3/exceptions.py +27 -0
  418. qiskit/qasm3/experimental.py +70 -0
  419. qiskit/qasm3/exporter.py +1273 -0
  420. qiskit/qasm3/printer.py +577 -0
  421. qiskit/qobj/__init__.py +75 -0
  422. qiskit/qobj/common.py +81 -0
  423. qiskit/qobj/converters/__init__.py +18 -0
  424. qiskit/qobj/converters/lo_config.py +177 -0
  425. qiskit/qobj/converters/pulse_instruction.py +895 -0
  426. qiskit/qobj/pulse_qobj.py +709 -0
  427. qiskit/qobj/qasm_qobj.py +708 -0
  428. qiskit/qobj/utils.py +46 -0
  429. qiskit/qpy/__init__.py +1641 -0
  430. qiskit/qpy/binary_io/__init__.py +36 -0
  431. qiskit/qpy/binary_io/circuits.py +1460 -0
  432. qiskit/qpy/binary_io/schedules.py +636 -0
  433. qiskit/qpy/binary_io/value.py +728 -0
  434. qiskit/qpy/common.py +306 -0
  435. qiskit/qpy/exceptions.py +53 -0
  436. qiskit/qpy/formats.py +394 -0
  437. qiskit/qpy/interface.py +341 -0
  438. qiskit/qpy/type_keys.py +572 -0
  439. qiskit/quantum_info/__init__.py +158 -0
  440. qiskit/quantum_info/analysis/__init__.py +17 -0
  441. qiskit/quantum_info/analysis/average.py +47 -0
  442. qiskit/quantum_info/analysis/distance.py +102 -0
  443. qiskit/quantum_info/analysis/make_observable.py +44 -0
  444. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  445. qiskit/quantum_info/operators/__init__.py +28 -0
  446. qiskit/quantum_info/operators/base_operator.py +145 -0
  447. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  448. qiskit/quantum_info/operators/channel/chi.py +191 -0
  449. qiskit/quantum_info/operators/channel/choi.py +218 -0
  450. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  451. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  452. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  453. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  454. qiskit/quantum_info/operators/channel/superop.py +377 -0
  455. qiskit/quantum_info/operators/channel/transformations.py +468 -0
  456. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  457. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  458. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  460. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  461. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  462. qiskit/quantum_info/operators/linear_op.py +25 -0
  463. qiskit/quantum_info/operators/measures.py +418 -0
  464. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  465. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  466. qiskit/quantum_info/operators/mixins/group.py +171 -0
  467. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  468. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  469. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  470. qiskit/quantum_info/operators/op_shape.py +525 -0
  471. qiskit/quantum_info/operators/operator.py +819 -0
  472. qiskit/quantum_info/operators/operator_utils.py +76 -0
  473. qiskit/quantum_info/operators/predicates.py +183 -0
  474. qiskit/quantum_info/operators/random.py +154 -0
  475. qiskit/quantum_info/operators/scalar_op.py +254 -0
  476. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  477. qiskit/quantum_info/operators/symplectic/base_pauli.py +727 -0
  478. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  479. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  480. qiskit/quantum_info/operators/symplectic/pauli.py +751 -0
  481. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  483. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  484. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1175 -0
  485. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  486. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  487. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  489. qiskit/quantum_info/quaternion.py +156 -0
  490. qiskit/quantum_info/random.py +26 -0
  491. qiskit/quantum_info/states/__init__.py +28 -0
  492. qiskit/quantum_info/states/densitymatrix.py +845 -0
  493. qiskit/quantum_info/states/measures.py +288 -0
  494. qiskit/quantum_info/states/quantum_state.py +503 -0
  495. qiskit/quantum_info/states/random.py +157 -0
  496. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  497. qiskit/quantum_info/states/statevector.py +958 -0
  498. qiskit/quantum_info/states/utils.py +247 -0
  499. qiskit/result/__init__.py +73 -0
  500. qiskit/result/counts.py +189 -0
  501. qiskit/result/distributions/__init__.py +17 -0
  502. qiskit/result/distributions/probability.py +100 -0
  503. qiskit/result/distributions/quasi.py +154 -0
  504. qiskit/result/exceptions.py +40 -0
  505. qiskit/result/mitigation/__init__.py +13 -0
  506. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  507. qiskit/result/mitigation/correlated_readout_mitigator.py +269 -0
  508. qiskit/result/mitigation/local_readout_mitigator.py +320 -0
  509. qiskit/result/mitigation/utils.py +160 -0
  510. qiskit/result/models.py +234 -0
  511. qiskit/result/postprocess.py +239 -0
  512. qiskit/result/result.py +392 -0
  513. qiskit/result/sampled_expval.py +75 -0
  514. qiskit/result/utils.py +295 -0
  515. qiskit/scheduler/__init__.py +40 -0
  516. qiskit/scheduler/config.py +35 -0
  517. qiskit/scheduler/lowering.py +187 -0
  518. qiskit/scheduler/methods/__init__.py +15 -0
  519. qiskit/scheduler/methods/basic.py +137 -0
  520. qiskit/scheduler/schedule_circuit.py +67 -0
  521. qiskit/scheduler/sequence.py +102 -0
  522. qiskit/synthesis/__init__.py +195 -0
  523. qiskit/synthesis/clifford/__init__.py +19 -0
  524. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  525. qiskit/synthesis/clifford/clifford_decompose_bm.py +47 -0
  526. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  527. qiskit/synthesis/clifford/clifford_decompose_greedy.py +57 -0
  528. qiskit/synthesis/clifford/clifford_decompose_layers.py +446 -0
  529. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  530. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  531. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  532. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  533. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  534. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  535. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  536. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  537. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  538. qiskit/synthesis/evolution/__init__.py +20 -0
  539. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  540. qiskit/synthesis/evolution/lie_trotter.py +143 -0
  541. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  542. qiskit/synthesis/evolution/product_formula.py +384 -0
  543. qiskit/synthesis/evolution/qdrift.py +131 -0
  544. qiskit/synthesis/evolution/suzuki_trotter.py +155 -0
  545. qiskit/synthesis/linear/__init__.py +26 -0
  546. qiskit/synthesis/linear/cnot_synth.py +69 -0
  547. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  548. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  549. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  550. qiskit/synthesis/linear_phase/__init__.py +17 -0
  551. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  552. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  553. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  554. qiskit/synthesis/multi_controlled/__init__.py +23 -0
  555. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  556. qiskit/synthesis/one_qubit/__init__.py +15 -0
  557. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  558. qiskit/synthesis/permutation/__init__.py +18 -0
  559. qiskit/synthesis/permutation/permutation_full.py +78 -0
  560. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  561. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  562. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  563. qiskit/synthesis/qft/__init__.py +16 -0
  564. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  565. qiskit/synthesis/qft/qft_decompose_lnn.py +78 -0
  566. qiskit/synthesis/stabilizer/__init__.py +16 -0
  567. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  568. qiskit/synthesis/stabilizer/stabilizer_decompose.py +193 -0
  569. qiskit/synthesis/two_qubit/__init__.py +19 -0
  570. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  571. qiskit/synthesis/two_qubit/two_qubit_decompose.py +759 -0
  572. qiskit/synthesis/two_qubit/weyl.py +97 -0
  573. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  574. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  575. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  576. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  577. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  578. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  579. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  580. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  581. qiskit/synthesis/unitary/__init__.py +13 -0
  582. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  583. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  584. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  585. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  586. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  587. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  588. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  589. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  590. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  591. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  592. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  593. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  594. qiskit/synthesis/unitary/qsd.py +288 -0
  595. qiskit/transpiler/__init__.py +1283 -0
  596. qiskit/transpiler/basepasses.py +221 -0
  597. qiskit/transpiler/coupling.py +500 -0
  598. qiskit/transpiler/exceptions.py +59 -0
  599. qiskit/transpiler/instruction_durations.py +281 -0
  600. qiskit/transpiler/layout.py +737 -0
  601. qiskit/transpiler/passes/__init__.py +310 -0
  602. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  603. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  604. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  605. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  606. qiskit/transpiler/passes/analysis/depth.py +33 -0
  607. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  608. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  609. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  610. qiskit/transpiler/passes/analysis/size.py +36 -0
  611. qiskit/transpiler/passes/analysis/width.py +27 -0
  612. qiskit/transpiler/passes/basis/__init__.py +19 -0
  613. qiskit/transpiler/passes/basis/basis_translator.py +693 -0
  614. qiskit/transpiler/passes/basis/decompose.py +98 -0
  615. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  616. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  617. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  618. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  619. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  620. qiskit/transpiler/passes/calibration/builders.py +20 -0
  621. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  622. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  623. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  624. qiskit/transpiler/passes/calibration/rzx_builder.py +395 -0
  625. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  626. qiskit/transpiler/passes/layout/__init__.py +26 -0
  627. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  628. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  629. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  630. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  631. qiskit/transpiler/passes/layout/disjoint_utils.py +217 -0
  632. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  633. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  634. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  635. qiskit/transpiler/passes/layout/sabre_layout.py +482 -0
  636. qiskit/transpiler/passes/layout/sabre_pre_layout.py +220 -0
  637. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  638. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  639. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  640. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  641. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  642. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  643. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  644. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  645. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  646. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  647. qiskit/transpiler/passes/optimization/collect_cliffords.py +88 -0
  648. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  649. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  650. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  651. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  652. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  653. qiskit/transpiler/passes/optimization/consolidate_blocks.py +232 -0
  654. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  655. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  656. qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
  657. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  658. qiskit/transpiler/passes/optimization/inverse_cancellation.py +93 -0
  659. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  660. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  661. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +260 -0
  662. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  663. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  664. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  665. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  666. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  667. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  668. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  669. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  670. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  671. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  672. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  673. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  674. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  675. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  676. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  677. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  678. qiskit/transpiler/passes/routing/__init__.py +22 -0
  679. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  680. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  681. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  682. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  683. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  684. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  685. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  686. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  687. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  688. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  689. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  690. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  691. qiskit/transpiler/passes/routing/sabre_swap.py +443 -0
  692. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  693. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  694. qiskit/transpiler/passes/routing/utils.py +35 -0
  695. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  696. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  697. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  698. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  699. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  700. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +105 -0
  701. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  702. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  703. qiskit/transpiler/passes/scheduling/base_scheduler.py +308 -0
  704. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +307 -0
  705. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  706. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  707. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +441 -0
  708. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  709. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  710. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  711. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  712. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +90 -0
  713. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  714. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +160 -0
  715. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  716. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  717. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +691 -0
  718. qiskit/transpiler/passes/synthesis/hls_plugins.py +928 -0
  719. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  720. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  721. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  722. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  723. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1055 -0
  724. qiskit/transpiler/passes/utils/__init__.py +33 -0
  725. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  726. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  727. qiskit/transpiler/passes/utils/check_map.py +78 -0
  728. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  729. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  730. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +88 -0
  731. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  732. qiskit/transpiler/passes/utils/error.py +69 -0
  733. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  734. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  735. qiskit/transpiler/passes/utils/gate_direction.py +349 -0
  736. qiskit/transpiler/passes/utils/gates_basis.py +74 -0
  737. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  738. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  739. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  740. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  741. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  742. qiskit/transpiler/passmanager.py +490 -0
  743. qiskit/transpiler/passmanager_config.py +198 -0
  744. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  745. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1019 -0
  746. qiskit/transpiler/preset_passmanagers/common.py +647 -0
  747. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +543 -0
  748. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  749. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  750. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  751. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  752. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  753. qiskit/transpiler/target.py +1261 -0
  754. qiskit/transpiler/timing_constraints.py +59 -0
  755. qiskit/user_config.py +262 -0
  756. qiskit/utils/__init__.py +89 -0
  757. qiskit/utils/classtools.py +146 -0
  758. qiskit/utils/deprecation.py +490 -0
  759. qiskit/utils/lazy_tester.py +363 -0
  760. qiskit/utils/multiprocessing.py +56 -0
  761. qiskit/utils/optionals.py +347 -0
  762. qiskit/utils/parallel.py +191 -0
  763. qiskit/utils/units.py +143 -0
  764. qiskit/version.py +84 -0
  765. qiskit/visualization/__init__.py +288 -0
  766. qiskit/visualization/array.py +204 -0
  767. qiskit/visualization/bloch.py +778 -0
  768. qiskit/visualization/circuit/__init__.py +15 -0
  769. qiskit/visualization/circuit/_utils.py +675 -0
  770. qiskit/visualization/circuit/circuit_visualization.py +726 -0
  771. qiskit/visualization/circuit/latex.py +661 -0
  772. qiskit/visualization/circuit/matplotlib.py +2029 -0
  773. qiskit/visualization/circuit/qcstyle.py +278 -0
  774. qiskit/visualization/circuit/styles/__init__.py +13 -0
  775. qiskit/visualization/circuit/styles/bw.json +202 -0
  776. qiskit/visualization/circuit/styles/clifford.json +202 -0
  777. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  778. qiskit/visualization/circuit/styles/iqp.json +214 -0
  779. qiskit/visualization/circuit/styles/textbook.json +202 -0
  780. qiskit/visualization/circuit/text.py +1844 -0
  781. qiskit/visualization/circuit_visualization.py +19 -0
  782. qiskit/visualization/counts_visualization.py +481 -0
  783. qiskit/visualization/dag_visualization.py +316 -0
  784. qiskit/visualization/exceptions.py +21 -0
  785. qiskit/visualization/gate_map.py +1485 -0
  786. qiskit/visualization/library.py +37 -0
  787. qiskit/visualization/pass_manager_visualization.py +319 -0
  788. qiskit/visualization/pulse_v2/__init__.py +21 -0
  789. qiskit/visualization/pulse_v2/core.py +901 -0
  790. qiskit/visualization/pulse_v2/device_info.py +173 -0
  791. qiskit/visualization/pulse_v2/drawings.py +253 -0
  792. qiskit/visualization/pulse_v2/events.py +254 -0
  793. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  794. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  795. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  796. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  797. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  798. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  799. qiskit/visualization/pulse_v2/interface.py +456 -0
  800. qiskit/visualization/pulse_v2/layouts.py +387 -0
  801. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  802. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  803. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  804. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  805. qiskit/visualization/pulse_v2/types.py +242 -0
  806. qiskit/visualization/state_visualization.py +1518 -0
  807. qiskit/visualization/timeline/__init__.py +21 -0
  808. qiskit/visualization/timeline/core.py +457 -0
  809. qiskit/visualization/timeline/drawings.py +260 -0
  810. qiskit/visualization/timeline/generators.py +506 -0
  811. qiskit/visualization/timeline/interface.py +424 -0
  812. qiskit/visualization/timeline/layouts.py +115 -0
  813. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  814. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  815. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  816. qiskit/visualization/timeline/stylesheet.py +301 -0
  817. qiskit/visualization/timeline/types.py +148 -0
  818. qiskit/visualization/transition_visualization.py +369 -0
  819. qiskit/visualization/utils.py +49 -0
  820. qiskit-1.3.0b1.dist-info/LICENSE.txt +203 -0
  821. qiskit-1.3.0b1.dist-info/METADATA +221 -0
  822. qiskit-1.3.0b1.dist-info/RECORD +825 -0
  823. qiskit-1.3.0b1.dist-info/WHEEL +5 -0
  824. qiskit-1.3.0b1.dist-info/entry_points.txt +57 -0
  825. qiskit-1.3.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1071 @@
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
+
17
+ import collections
18
+ import itertools
19
+ import typing
20
+ from collections.abc import Callable, Mapping, Sequence
21
+
22
+ import numpy
23
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
24
+ from qiskit.circuit.quantumregister import QuantumRegister
25
+ from qiskit.circuit import (
26
+ Instruction,
27
+ Parameter,
28
+ ParameterVector,
29
+ ParameterExpression,
30
+ CircuitInstruction,
31
+ )
32
+ from qiskit.exceptions import QiskitError
33
+ from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping
34
+ from qiskit._accelerate.circuit_library import get_entangler_map as fast_entangler_map
35
+
36
+ from ..blueprintcircuit import BlueprintCircuit
37
+
38
+
39
+ if typing.TYPE_CHECKING:
40
+ import qiskit # pylint: disable=cyclic-import
41
+
42
+
43
+ class NLocal(BlueprintCircuit):
44
+ """The n-local circuit class.
45
+
46
+ The structure of the n-local circuit are alternating rotation and entanglement layers.
47
+ In both layers, parameterized circuit-blocks act on the circuit in a defined way.
48
+ In the rotation layer, the blocks are applied stacked on top of each other, while in the
49
+ entanglement layer according to the ``entanglement`` strategy.
50
+ The circuit blocks can have arbitrary sizes (smaller equal to the number of qubits in the
51
+ circuit). Each layer is repeated ``reps`` times, and by default a final rotation layer is
52
+ appended.
53
+
54
+ For instance, a rotation block on 2 qubits and an entanglement block on 4 qubits using
55
+ ``'linear'`` entanglement yields the following circuit.
56
+
57
+ .. parsed-literal::
58
+
59
+ ┌──────┐ ░ ┌──────┐ ░ ┌──────┐
60
+ ┤0 ├─░─┤0 ├──────────────── ... ─░─┤0 ├
61
+ │ Rot │ ░ │ │┌──────┐ ░ │ Rot │
62
+ ┤1 ├─░─┤1 ├┤0 ├──────── ... ─░─┤1 ├
63
+ ├──────┤ ░ │ Ent ││ │┌──────┐ ░ ├──────┤
64
+ ┤0 ├─░─┤2 ├┤1 ├┤0 ├ ... ─░─┤0 ├
65
+ │ Rot │ ░ │ ││ Ent ││ │ ░ │ Rot │
66
+ ┤1 ├─░─┤3 ├┤2 ├┤1 ├ ... ─░─┤1 ├
67
+ ├──────┤ ░ └──────┘│ ││ Ent │ ░ ├──────┤
68
+ ┤0 ├─░─────────┤3 ├┤2 ├ ... ─░─┤0 ├
69
+ │ Rot │ ░ └──────┘│ │ ░ │ Rot │
70
+ ┤1 ├─░─────────────────┤3 ├ ... ─░─┤1 ├
71
+ └──────┘ ░ └──────┘ ░ └──────┘
72
+
73
+ | |
74
+ +---------------------------------+
75
+ repeated reps times
76
+
77
+ If specified, barriers can be inserted in between every block.
78
+ If an initial state object is provided, it is added in front of the NLocal.
79
+ """
80
+
81
+ def __init__(
82
+ self,
83
+ num_qubits: int | None = None,
84
+ rotation_blocks: (
85
+ QuantumCircuit
86
+ | list[QuantumCircuit]
87
+ | qiskit.circuit.Instruction
88
+ | list[qiskit.circuit.Instruction]
89
+ | None
90
+ ) = None,
91
+ entanglement_blocks: (
92
+ QuantumCircuit
93
+ | list[QuantumCircuit]
94
+ | qiskit.circuit.Instruction
95
+ | list[qiskit.circuit.Instruction]
96
+ | None
97
+ ) = None,
98
+ entanglement: list[int] | list[list[int]] | None = None,
99
+ reps: int = 1,
100
+ insert_barriers: bool = False,
101
+ parameter_prefix: str = "θ",
102
+ overwrite_block_parameters: bool | list[list[Parameter]] = True,
103
+ skip_final_rotation_layer: bool = False,
104
+ skip_unentangled_qubits: bool = False,
105
+ initial_state: QuantumCircuit | None = None,
106
+ name: str | None = "nlocal",
107
+ flatten: bool | None = None,
108
+ ) -> None:
109
+ """
110
+ Args:
111
+ num_qubits: The number of qubits of the circuit.
112
+ rotation_blocks: The blocks used in the rotation layers. If multiple are passed,
113
+ these will be applied one after another (like new sub-layers).
114
+ entanglement_blocks: The blocks used in the entanglement layers. If multiple are passed,
115
+ these will be applied one after another. To use different entanglements for
116
+ the sub-layers, see :meth:`get_entangler_map`.
117
+ entanglement: The indices specifying on which qubits the input blocks act. If ``None``, the
118
+ entanglement blocks are applied at the top of the circuit.
119
+ reps: Specifies how often the rotation blocks and entanglement blocks are repeated.
120
+ insert_barriers: If ``True``, barriers are inserted in between each layer. If ``False``,
121
+ no barriers are inserted.
122
+ parameter_prefix: The prefix used if default parameters are generated.
123
+ overwrite_block_parameters: If the parameters in the added blocks should be overwritten.
124
+ If ``False``, the parameters in the blocks are not changed.
125
+ skip_final_rotation_layer: Whether a final rotation layer is added to the circuit.
126
+ skip_unentangled_qubits: If ``True``, the rotation gates act only on qubits that
127
+ are entangled. If ``False``, the rotation gates act on all qubits.
128
+ initial_state: A :class:`.QuantumCircuit` object which can be used to describe an initial
129
+ state prepended to the NLocal circuit.
130
+ name: The name of the circuit.
131
+ flatten: Set this to ``True`` to output a flat circuit instead of nesting it inside multiple
132
+ layers of gate objects. By default currently the contents of
133
+ the output circuit will be wrapped in nested objects for
134
+ cleaner visualization. However, if you're using this circuit
135
+ for anything besides visualization its **strongly** recommended
136
+ to set this flag to ``True`` to avoid a large performance
137
+ overhead for parameter binding.
138
+
139
+ Raises:
140
+ ValueError: If ``reps`` parameter is less than or equal to 0.
141
+ TypeError: If ``reps`` parameter is not an int value.
142
+ """
143
+ super().__init__(name=name)
144
+
145
+ self._num_qubits: int | None = None
146
+ self._insert_barriers = insert_barriers
147
+ self._reps = reps
148
+ self._entanglement_blocks: list[QuantumCircuit] = []
149
+ self._rotation_blocks: list[QuantumCircuit] = []
150
+ self._prepended_blocks: list[QuantumCircuit] = []
151
+ self._prepended_entanglement: list[list[list[int]] | str] = []
152
+ self._appended_blocks: list[QuantumCircuit] = []
153
+ self._appended_entanglement: list[list[list[int]] | str] = []
154
+ self._entanglement = None
155
+ self._entangler_maps = None
156
+ self._ordered_parameters: ParameterVector | list[Parameter] = ParameterVector(
157
+ name=parameter_prefix
158
+ )
159
+ self._overwrite_block_parameters = overwrite_block_parameters
160
+ self._skip_final_rotation_layer = skip_final_rotation_layer
161
+ self._skip_unentangled_qubits = skip_unentangled_qubits
162
+ self._initial_state: QuantumCircuit | None = None
163
+ self._initial_state_circuit: QuantumCircuit | None = None
164
+ self._bounds: list[tuple[float | None, float | None]] | None = None
165
+ self._flatten = flatten
166
+
167
+ # During the build, if a subclass hasn't overridden our parametrization methods, we can use
168
+ # a newer fast-path method to parametrise the rotation and entanglement blocks if internally
169
+ # those are just simple stdlib gates that have been promoted to circuits. We don't
170
+ # precalculate the fast-path layers themselves because there's far too much that can be
171
+ # overridden between object construction and build, and far too many subclasses of `NLocal`
172
+ # that override bits and bobs of the internal private methods, so it'd be too hard to keep
173
+ # everything in sync.
174
+ self._allow_fast_path_parametrization = (
175
+ getattr(self._parameter_generator, "__func__", None) is NLocal._parameter_generator
176
+ )
177
+
178
+ if int(reps) != reps:
179
+ raise TypeError("The value of reps should be int")
180
+
181
+ if reps < 0:
182
+ raise ValueError("The value of reps should be larger than or equal to 0")
183
+
184
+ if num_qubits is not None:
185
+ self.num_qubits = num_qubits
186
+
187
+ if entanglement_blocks is not None:
188
+ self.entanglement_blocks = entanglement_blocks
189
+
190
+ if rotation_blocks is not None:
191
+ self.rotation_blocks = rotation_blocks
192
+
193
+ if entanglement is not None:
194
+ self.entanglement = entanglement
195
+
196
+ if initial_state is not None:
197
+ self.initial_state = initial_state
198
+
199
+ @property
200
+ def num_qubits(self) -> int:
201
+ """Returns the number of qubits in this circuit.
202
+
203
+ Returns:
204
+ The number of qubits.
205
+ """
206
+ return self._num_qubits if self._num_qubits is not None else 0
207
+
208
+ @num_qubits.setter
209
+ def num_qubits(self, num_qubits: int) -> None:
210
+ """Set the number of qubits for the n-local circuit.
211
+
212
+ Args:
213
+ The new number of qubits.
214
+ """
215
+ if self._num_qubits != num_qubits:
216
+ # invalidate the circuit
217
+ self._invalidate()
218
+ self._num_qubits = num_qubits
219
+ self.qregs = [QuantumRegister(num_qubits, name="q")]
220
+
221
+ @property
222
+ def flatten(self) -> bool:
223
+ """Returns whether the circuit is wrapped in nested gates/instructions or flattened."""
224
+ return bool(self._flatten)
225
+
226
+ @flatten.setter
227
+ def flatten(self, flatten: bool) -> None:
228
+ self._invalidate()
229
+ self._flatten = flatten
230
+
231
+ def _convert_to_block(self, layer: typing.Any) -> QuantumCircuit:
232
+ """Try to convert ``layer`` to a QuantumCircuit.
233
+
234
+ Args:
235
+ layer: The object to be converted to an NLocal block / Instruction.
236
+
237
+ Returns:
238
+ The layer converted to a circuit.
239
+
240
+ Raises:
241
+ TypeError: If the input cannot be converted to a circuit.
242
+ """
243
+ if isinstance(layer, QuantumCircuit):
244
+ return layer
245
+
246
+ if isinstance(layer, Instruction):
247
+ circuit = QuantumCircuit(layer.num_qubits)
248
+ circuit.append(layer, list(range(layer.num_qubits)))
249
+ return circuit
250
+
251
+ try:
252
+ circuit = QuantumCircuit(layer.num_qubits)
253
+ circuit.append(layer.to_instruction(), list(range(layer.num_qubits)))
254
+ return circuit
255
+ except AttributeError:
256
+ pass
257
+
258
+ raise TypeError(f"Adding a {type(layer)} to an NLocal is not supported.")
259
+
260
+ @property
261
+ def rotation_blocks(self) -> list[QuantumCircuit]:
262
+ """The blocks in the rotation layers.
263
+
264
+ Returns:
265
+ The blocks in the rotation layers.
266
+ """
267
+ return self._rotation_blocks
268
+
269
+ @rotation_blocks.setter
270
+ def rotation_blocks(
271
+ self, blocks: QuantumCircuit | list[QuantumCircuit] | Instruction | list[Instruction]
272
+ ) -> None:
273
+ """Set the blocks in the rotation layers.
274
+
275
+ Args:
276
+ blocks: The new blocks for the rotation 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._rotation_blocks = [self._convert_to_block(block) for block in blocks]
284
+
285
+ @property
286
+ def entanglement_blocks(self) -> list[QuantumCircuit]:
287
+ """The blocks in the entanglement layers.
288
+
289
+ Returns:
290
+ The blocks in the entanglement layers.
291
+ """
292
+ return self._entanglement_blocks
293
+
294
+ @entanglement_blocks.setter
295
+ def entanglement_blocks(
296
+ self, blocks: QuantumCircuit | list[QuantumCircuit] | Instruction | list[Instruction]
297
+ ) -> None:
298
+ """Set the blocks in the entanglement layers.
299
+
300
+ Args:
301
+ blocks: The new blocks for the entanglement layers.
302
+ """
303
+ # cannot check for the attribute ``'__len__'`` because a circuit also has this attribute
304
+ if not isinstance(blocks, (list, numpy.ndarray)):
305
+ blocks = [blocks]
306
+
307
+ self._invalidate()
308
+ self._entanglement_blocks = [self._convert_to_block(block) for block in blocks]
309
+
310
+ @property
311
+ def entanglement(
312
+ self,
313
+ ) -> (
314
+ str
315
+ | list[str]
316
+ | list[list[str]]
317
+ | list[int]
318
+ | list[list[int]]
319
+ | list[list[list[int]]]
320
+ | list[list[list[list[int]]]]
321
+ | Callable[[int], str]
322
+ | Callable[[int], list[list[int]]]
323
+ ):
324
+ """Get the entanglement strategy.
325
+
326
+ Returns:
327
+ The entanglement strategy, see :meth:`get_entangler_map` for more detail on how the
328
+ format is interpreted.
329
+ """
330
+ return self._entanglement
331
+
332
+ @entanglement.setter
333
+ def entanglement(
334
+ self,
335
+ entanglement: (
336
+ str
337
+ | list[str]
338
+ | list[list[str]]
339
+ | list[int]
340
+ | list[list[int]]
341
+ | list[list[list[int]]]
342
+ | list[list[list[list[int]]]]
343
+ | Callable[[int], str]
344
+ | Callable[[int], list[list[int]]]
345
+ | None
346
+ ),
347
+ ) -> None:
348
+ """Set the entanglement strategy.
349
+
350
+ Args:
351
+ entanglement: The entanglement strategy. See :meth:`get_entangler_map` for more detail
352
+ on the supported formats.
353
+ """
354
+ self._invalidate()
355
+ self._entanglement = entanglement
356
+
357
+ @property
358
+ def num_layers(self) -> int:
359
+ """Return the number of layers in the n-local circuit.
360
+
361
+ Returns:
362
+ The number of layers in the circuit.
363
+ """
364
+ return 2 * self._reps + int(not self._skip_final_rotation_layer)
365
+
366
+ def _check_configuration(self, raise_on_failure: bool = True) -> bool:
367
+ """Check if the configuration of the NLocal class is valid.
368
+
369
+ Args:
370
+ raise_on_failure: Whether to raise on failure.
371
+
372
+ Returns:
373
+ True, if the configuration is valid and the circuit can be constructed. Otherwise
374
+ an ValueError is raised.
375
+
376
+ Raises:
377
+ ValueError: If the blocks are not set.
378
+ ValueError: If the number of repetitions is not set.
379
+ ValueError: If the qubit indices are not set.
380
+ ValueError: If the number of qubit indices does not match the number of blocks.
381
+ ValueError: If an index in the repetitions list exceeds the number of blocks.
382
+ ValueError: If the number of repetitions does not match the number of block-wise
383
+ parameters.
384
+ ValueError: If a specified qubit index is larger than the (manually set) number of
385
+ qubits.
386
+ """
387
+ valid = True
388
+ if self.num_qubits is None:
389
+ valid = False
390
+ if raise_on_failure:
391
+ raise ValueError("No number of qubits specified.")
392
+
393
+ # check no needed parameters are None
394
+ if self.entanglement_blocks is None and self.rotation_blocks is None:
395
+ valid = False
396
+ if raise_on_failure:
397
+ raise ValueError("The blocks are not set.")
398
+
399
+ return valid
400
+
401
+ @property
402
+ def ordered_parameters(self) -> list[Parameter]:
403
+ """The parameters used in the underlying circuit.
404
+
405
+ This includes float values and duplicates.
406
+
407
+ Examples:
408
+
409
+ >>> # prepare circuit ...
410
+ >>> print(nlocal)
411
+ ┌───────┐┌──────────┐┌──────────┐┌──────────┐
412
+ q_0: ┤ Ry(1) ├┤ Ry(θ[1]) ├┤ Ry(θ[1]) ├┤ Ry(θ[3]) ├
413
+ └───────┘└──────────┘└──────────┘└──────────┘
414
+ >>> nlocal.parameters
415
+ {Parameter(θ[1]), Parameter(θ[3])}
416
+ >>> nlocal.ordered_parameters
417
+ [1, Parameter(θ[1]), Parameter(θ[1]), Parameter(θ[3])]
418
+
419
+ Returns:
420
+ The parameters objects used in the circuit.
421
+ """
422
+ if isinstance(self._ordered_parameters, ParameterVector):
423
+ self._ordered_parameters.resize(self.num_parameters_settable)
424
+ return list(self._ordered_parameters)
425
+
426
+ return self._ordered_parameters
427
+
428
+ @ordered_parameters.setter
429
+ def ordered_parameters(self, parameters: ParameterVector | list[Parameter]) -> None:
430
+ """Set the parameters used in the underlying circuit.
431
+
432
+ Args:
433
+ The parameters to be used in the underlying circuit.
434
+
435
+ Raises:
436
+ ValueError: If the length of ordered parameters does not match the number of
437
+ parameters in the circuit and they are not a ``ParameterVector`` (which could
438
+ be resized to fit the number of parameters).
439
+ """
440
+ if (
441
+ not isinstance(parameters, ParameterVector)
442
+ and len(parameters) != self.num_parameters_settable
443
+ ):
444
+ raise ValueError(
445
+ "The length of ordered parameters must be equal to the number of "
446
+ f"settable parameters in the circuit ({self.num_parameters_settable}),"
447
+ f" but is {len(parameters)}"
448
+ )
449
+ self._ordered_parameters = parameters
450
+ self._invalidate()
451
+
452
+ @property
453
+ def insert_barriers(self) -> bool:
454
+ """If barriers are inserted in between the layers or not.
455
+
456
+ Returns:
457
+ ``True``, if barriers are inserted in between the layers, ``False`` if not.
458
+ """
459
+ return self._insert_barriers
460
+
461
+ @insert_barriers.setter
462
+ def insert_barriers(self, insert_barriers: bool) -> None:
463
+ """Specify whether barriers should be inserted in between the layers or not.
464
+
465
+ Args:
466
+ insert_barriers: If True, barriers are inserted, if False not.
467
+ """
468
+ # if insert_barriers changes, we have to invalidate the circuit definition,
469
+ # if it is the same as before we can leave the NLocal instance as it is
470
+ if insert_barriers is not self._insert_barriers:
471
+ self._invalidate()
472
+ self._insert_barriers = insert_barriers
473
+
474
+ def get_unentangled_qubits(self) -> set[int]:
475
+ """Get the indices of unentangled qubits in a set.
476
+
477
+ Returns:
478
+ The unentangled qubits.
479
+ """
480
+ entangled_qubits = set()
481
+ for i in range(self._reps):
482
+ for j, block in enumerate(self.entanglement_blocks):
483
+ entangler_map = self.get_entangler_map(i, j, block.num_qubits)
484
+ entangled_qubits.update([idx for indices in entangler_map for idx in indices])
485
+ unentangled_qubits = set(range(self.num_qubits)) - entangled_qubits
486
+
487
+ return unentangled_qubits
488
+
489
+ @property
490
+ def num_parameters_settable(self) -> int:
491
+ """The number of total parameters that can be set to distinct values.
492
+
493
+ This does not change when the parameters are bound or exchanged for same parameters,
494
+ and therefore is different from ``num_parameters`` which counts the number of unique
495
+ :class:`~qiskit.circuit.Parameter` objects currently in the circuit.
496
+
497
+ Returns:
498
+ The number of parameters originally available in the circuit.
499
+
500
+ Note:
501
+ This quantity does not require the circuit to be built yet.
502
+ """
503
+ num = 0
504
+
505
+ for i in range(self._reps):
506
+ for j, block in enumerate(self.entanglement_blocks):
507
+ entangler_map = self.get_entangler_map(i, j, block.num_qubits)
508
+ num += len(entangler_map) * len(get_parameters(block))
509
+
510
+ if self._skip_unentangled_qubits:
511
+ unentangled_qubits = self.get_unentangled_qubits()
512
+
513
+ num_rot = 0
514
+ for block in self.rotation_blocks:
515
+ block_indices = [
516
+ list(range(j * block.num_qubits, (j + 1) * block.num_qubits))
517
+ for j in range(self.num_qubits // block.num_qubits)
518
+ ]
519
+ if self._skip_unentangled_qubits:
520
+ block_indices = [
521
+ indices
522
+ for indices in block_indices
523
+ if set(indices).isdisjoint(unentangled_qubits)
524
+ ]
525
+ num_rot += len(block_indices) * len(get_parameters(block))
526
+
527
+ num += num_rot * (self._reps + int(not self._skip_final_rotation_layer))
528
+
529
+ return num
530
+
531
+ @property
532
+ def reps(self) -> int:
533
+ """The number of times rotation and entanglement block are repeated.
534
+
535
+ Returns:
536
+ The number of repetitions.
537
+ """
538
+ return self._reps
539
+
540
+ @reps.setter
541
+ def reps(self, repetitions: int) -> None:
542
+ """Set the repetitions.
543
+
544
+ If the repetitions are `0`, only one rotation layer with no entanglement
545
+ layers is applied (unless ``self.skip_final_rotation_layer`` is set to ``True``).
546
+
547
+ Args:
548
+ repetitions: The new repetitions.
549
+
550
+ Raises:
551
+ ValueError: If reps setter has parameter repetitions < 0.
552
+ """
553
+ if repetitions < 0:
554
+ raise ValueError("The repetitions should be larger than or equal to 0")
555
+ if repetitions != self._reps:
556
+ self._invalidate()
557
+ self._reps = repetitions
558
+
559
+ def print_settings(self) -> str:
560
+ """Returns information about the setting.
561
+
562
+ Returns:
563
+ The class name and the attributes/parameters of the instance as ``str``.
564
+ """
565
+ ret = f"NLocal: {self.__class__.__name__}\n"
566
+ params = ""
567
+ for key, value in self.__dict__.items():
568
+ if key[0] == "_":
569
+ params += f"-- {key[1:]}: {value}\n"
570
+ ret += f"{params}"
571
+ return ret
572
+
573
+ @property
574
+ def preferred_init_points(self) -> list[float] | None:
575
+ """The initial points for the parameters. Can be stored as initial guess in optimization.
576
+
577
+ Returns:
578
+ The initial values for the parameters, or None, if none have been set.
579
+ """
580
+ return None
581
+
582
+ # pylint: disable=too-many-return-statements
583
+ def get_entangler_map(
584
+ self, rep_num: int, block_num: int, num_block_qubits: int
585
+ ) -> Sequence[Sequence[int]]:
586
+ """Get the entangler map for in the repetition ``rep_num`` and the block ``block_num``.
587
+
588
+ The entangler map for the current block is derived from the value of ``self.entanglement``.
589
+ Below the different cases are listed, where ``i`` and ``j`` denote the repetition number
590
+ and the block number, respectively, and ``n`` the number of qubits in the block.
591
+
592
+ =================================== ========================================================
593
+ entanglement type entangler map
594
+ =================================== ========================================================
595
+ ``None`` ``[[0, ..., n - 1]]``
596
+ ``str`` (e.g ``'full'``) the specified connectivity on ``n`` qubits
597
+ ``List[int]`` [``entanglement``]
598
+ ``List[List[int]]`` ``entanglement``
599
+ ``List[List[List[int]]]`` ``entanglement[i]``
600
+ ``List[List[List[List[int]]]]`` ``entanglement[i][j]``
601
+ ``List[str]`` the connectivity specified in ``entanglement[i]``
602
+ ``List[List[str]]`` the connectivity specified in ``entanglement[i][j]``
603
+ ``Callable[int, str]`` same as ``List[str]``
604
+ ``Callable[int, List[List[int]]]`` same as ``List[List[List[int]]]``
605
+ =================================== ========================================================
606
+
607
+
608
+ Note that all indices are to be taken modulo the length of the array they act on, i.e.
609
+ no out-of-bounds index error will be raised but we re-iterate from the beginning of the
610
+ list.
611
+
612
+ Args:
613
+ rep_num: The current repetition we are in.
614
+ block_num: The block number within the entanglement layers.
615
+ num_block_qubits: The number of qubits in the block.
616
+
617
+ Returns:
618
+ The entangler map for the current block in the current repetition.
619
+
620
+ Raises:
621
+ ValueError: If the value of ``entanglement`` could not be cast to a corresponding
622
+ entangler map.
623
+ """
624
+ i, j, n = rep_num, block_num, num_block_qubits
625
+ entanglement = self._entanglement
626
+
627
+ # entanglement is None
628
+ if entanglement is None:
629
+ return [list(range(n))]
630
+
631
+ # entanglement is callable
632
+ if callable(entanglement):
633
+ entanglement = entanglement(i)
634
+
635
+ # entanglement is str
636
+ if isinstance(entanglement, str):
637
+ return get_entangler_map(n, self.num_qubits, entanglement, offset=i)
638
+
639
+ # check if entanglement is list of something
640
+ if not isinstance(entanglement, (tuple, list)):
641
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
642
+ num_i = len(entanglement)
643
+
644
+ # entanglement is List[str]
645
+ if all(isinstance(en, str) for en in entanglement):
646
+ return get_entangler_map(n, self.num_qubits, entanglement[i % num_i], offset=i)
647
+
648
+ # entanglement is List[int]
649
+ if all(isinstance(en, (int, numpy.integer)) for en in entanglement):
650
+ return [[int(en) for en in entanglement]]
651
+
652
+ # check if entanglement is List[List]
653
+ if not all(isinstance(en, (tuple, list)) for en in entanglement):
654
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
655
+ num_j = len(entanglement[i % num_i])
656
+
657
+ # entanglement is List[List[str]]
658
+ if all(isinstance(e2, str) for en in entanglement for e2 in en):
659
+ return get_entangler_map(
660
+ n, self.num_qubits, entanglement[i % num_i][j % num_j], offset=i
661
+ )
662
+
663
+ # entanglement is List[List[int]]
664
+ if all(isinstance(e2, (int, numpy.int32, numpy.int64)) for en in entanglement for e2 in en):
665
+ for ind, en in enumerate(entanglement):
666
+ entanglement[ind] = tuple(map(int, en))
667
+ return entanglement
668
+
669
+ # check if entanglement is List[List[List]]
670
+ if not all(isinstance(e2, (tuple, list)) for en in entanglement for e2 in en):
671
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
672
+
673
+ # entanglement is List[List[List[int]]]
674
+ if all(
675
+ isinstance(e3, (int, numpy.int32, numpy.int64))
676
+ for en in entanglement
677
+ for e2 in en
678
+ for e3 in e2
679
+ ):
680
+ for en in entanglement:
681
+ for ind, e2 in enumerate(en):
682
+ en[ind] = tuple(map(int, e2))
683
+ return entanglement[i % num_i]
684
+
685
+ # check if entanglement is List[List[List[List]]]
686
+ if not all(isinstance(e3, (tuple, list)) for en in entanglement for e2 in en for e3 in e2):
687
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
688
+
689
+ # entanglement is List[List[List[List[int]]]]
690
+ if all(
691
+ isinstance(e4, (int, numpy.int32, numpy.int64))
692
+ for en in entanglement
693
+ for e2 in en
694
+ for e3 in e2
695
+ for e4 in e3
696
+ ):
697
+ for en in entanglement:
698
+ for e2 in en:
699
+ for ind, e3 in enumerate(e2):
700
+ e2[ind] = tuple(map(int, e3))
701
+ return entanglement[i % num_i][j % num_j]
702
+
703
+ raise ValueError(f"Invalid value of entanglement: {entanglement}")
704
+
705
+ @property
706
+ def initial_state(self) -> QuantumCircuit:
707
+ """Return the initial state that is added in front of the n-local circuit.
708
+
709
+ Returns:
710
+ The initial state.
711
+ """
712
+ return self._initial_state
713
+
714
+ @initial_state.setter
715
+ def initial_state(self, initial_state: QuantumCircuit) -> None:
716
+ """Set the initial state.
717
+
718
+ Args:
719
+ initial_state: The new initial state.
720
+
721
+ Raises:
722
+ ValueError: If the number of qubits has been set before and the initial state
723
+ does not match the number of qubits.
724
+ """
725
+ self._initial_state = initial_state
726
+ self._invalidate()
727
+
728
+ @property
729
+ def parameter_bounds(self) -> list[tuple[float, float]] | None:
730
+ """The parameter bounds for the unbound parameters in the circuit.
731
+
732
+ Returns:
733
+ A list of pairs indicating the bounds, as (lower, upper). None indicates an unbounded
734
+ parameter in the corresponding direction. If ``None`` is returned, problem is fully
735
+ unbounded.
736
+ """
737
+ if not self._is_built:
738
+ self._build()
739
+ return self._bounds
740
+
741
+ @parameter_bounds.setter
742
+ def parameter_bounds(self, bounds: list[tuple[float, float]]) -> None:
743
+ """Set the parameter bounds.
744
+
745
+ Args:
746
+ bounds: The new parameter bounds.
747
+ """
748
+ self._bounds = bounds
749
+
750
+ def add_layer(
751
+ self,
752
+ other: QuantumCircuit | qiskit.circuit.Instruction,
753
+ entanglement: list[int] | str | list[list[int]] | None = None,
754
+ front: bool = False,
755
+ ) -> "NLocal":
756
+ """Append another layer to the NLocal.
757
+
758
+ Args:
759
+ other: The layer to compose, can be another NLocal, an Instruction or Gate,
760
+ or a QuantumCircuit.
761
+ entanglement: The entanglement or qubit indices.
762
+ front: If True, ``other`` is appended to the front, else to the back.
763
+
764
+ Returns:
765
+ self, such that chained composes are possible.
766
+
767
+ Raises:
768
+ TypeError: If `other` is not compatible, i.e. is no Instruction and does not have a
769
+ `to_instruction` method.
770
+ """
771
+ block = self._convert_to_block(other)
772
+
773
+ if entanglement is None:
774
+ entanglement = [list(range(block.num_qubits))]
775
+ elif isinstance(entanglement, list) and not isinstance(entanglement[0], list):
776
+ entanglement = [entanglement]
777
+ if front:
778
+ self._prepended_blocks += [block]
779
+ self._prepended_entanglement += [entanglement]
780
+ else:
781
+ self._appended_blocks += [block]
782
+ self._appended_entanglement += [entanglement]
783
+
784
+ if isinstance(entanglement, list):
785
+ num_qubits = 1 + max(max(indices) for indices in entanglement)
786
+ if num_qubits > self.num_qubits:
787
+ self._invalidate() # rebuild circuit
788
+ self.num_qubits = num_qubits
789
+
790
+ # modify the circuit accordingly
791
+ if front is False and self._is_built:
792
+ if self._insert_barriers and len(self.data) > 0:
793
+ self.barrier()
794
+
795
+ if isinstance(entanglement, str):
796
+ entangler_map: Sequence[Sequence[int]] = get_entangler_map(
797
+ block.num_qubits, self.num_qubits, entanglement
798
+ )
799
+ else:
800
+ entangler_map = entanglement
801
+
802
+ for i in entangler_map:
803
+ params = self.ordered_parameters[-len(get_parameters(block)) :]
804
+ parameterized_block = self._parameterize_block(block, params=params)
805
+ self.compose(parameterized_block, i, inplace=True, copy=False)
806
+ else:
807
+ # cannot prepend a block currently, just rebuild
808
+ self._invalidate()
809
+
810
+ return self
811
+
812
+ def assign_parameters(
813
+ self,
814
+ parameters: (
815
+ Mapping[Parameter, ParameterExpression | float] | Sequence[ParameterExpression | float]
816
+ ),
817
+ inplace: bool = False,
818
+ **kwargs,
819
+ ) -> QuantumCircuit | None:
820
+ """Assign parameters to the n-local circuit.
821
+
822
+ This method also supports passing a list instead of a dictionary. If a list
823
+ is passed, the list must have the same length as the number of unbound parameters in
824
+ the circuit. The parameters are assigned in the order of the parameters in
825
+ :meth:`ordered_parameters`.
826
+
827
+ Returns:
828
+ A copy of the NLocal circuit with the specified parameters.
829
+
830
+ Raises:
831
+ AttributeError: If the parameters are given as list and do not match the number
832
+ of parameters.
833
+ """
834
+ if parameters is None or len(parameters) == 0:
835
+ return self
836
+
837
+ if not self._is_built:
838
+ self._build()
839
+
840
+ return super().assign_parameters(parameters, inplace=inplace, **kwargs)
841
+
842
+ def _parameterize_block(
843
+ self, block, param_iter=None, rep_num=None, block_num=None, indices=None, params=None
844
+ ):
845
+ """Convert ``block`` to a circuit of correct width and parameterized using the iterator."""
846
+ if self._overwrite_block_parameters:
847
+ # check if special parameters should be used
848
+ # pylint: disable=assignment-from-none
849
+ if params is None:
850
+ params = self._parameter_generator(rep_num, block_num, indices)
851
+ if params is None:
852
+ params = [next(param_iter) for _ in range(len(get_parameters(block)))]
853
+
854
+ update = dict(zip(block.parameters, params))
855
+ return block.assign_parameters(update)
856
+
857
+ return block.copy()
858
+
859
+ def _build_rotation_layer(self, circuit, param_iter, i):
860
+ """Build a rotation layer."""
861
+ # if the unentangled qubits are skipped, compute the set of qubits that are not entangled
862
+ if self._skip_unentangled_qubits:
863
+ skipped_qubits = self.get_unentangled_qubits()
864
+ else:
865
+ skipped_qubits = set()
866
+
867
+ target_qubits = circuit.qubits
868
+
869
+ # iterate over all rotation blocks
870
+ for j, block in enumerate(self.rotation_blocks):
871
+ skipped_blocks = {qubit // block.num_qubits for qubit in skipped_qubits}
872
+ if (
873
+ self._allow_fast_path_parametrization
874
+ and (simple_block := _stdlib_gate_from_simple_block(block)) is not None
875
+ ):
876
+ all_qubits = (
877
+ tuple(target_qubits[k * block.num_qubits : (k + 1) * block.num_qubits])
878
+ for k in range(self.num_qubits // block.num_qubits)
879
+ if k not in skipped_blocks
880
+ )
881
+ for qubits in all_qubits:
882
+ instr = CircuitInstruction(
883
+ simple_block.gate(*itertools.islice(param_iter, simple_block.num_params)),
884
+ qubits,
885
+ )
886
+ circuit._append(instr)
887
+ else:
888
+ block_indices = [
889
+ list(range(k * block.num_qubits, (k + 1) * block.num_qubits))
890
+ for k in range(self.num_qubits // block.num_qubits)
891
+ if k not in skipped_blocks
892
+ ]
893
+ # apply the operations in the layer
894
+ for indices in block_indices:
895
+ parameterized_block = self._parameterize_block(block, param_iter, i, j, indices)
896
+ circuit.compose(parameterized_block, indices, inplace=True, copy=False)
897
+
898
+ def _build_entanglement_layer(self, circuit, param_iter, i):
899
+ """Build an entanglement layer."""
900
+ # iterate over all entanglement blocks
901
+ target_qubits = circuit.qubits
902
+ for j, block in enumerate(self.entanglement_blocks):
903
+ entangler_map = self.get_entangler_map(i, j, block.num_qubits)
904
+ if (
905
+ self._allow_fast_path_parametrization
906
+ and (simple_block := _stdlib_gate_from_simple_block(block)) is not None
907
+ ):
908
+ for indices in entangler_map:
909
+ # It's actually nontrivially faster to use a listcomp and pass that to `tuple`
910
+ # than to pass a generator expression directly.
911
+ # pylint: disable=consider-using-generator
912
+ instr = CircuitInstruction(
913
+ simple_block.gate(*itertools.islice(param_iter, simple_block.num_params)),
914
+ tuple([target_qubits[i] for i in indices]),
915
+ )
916
+ circuit._append(instr)
917
+ else:
918
+ # apply the operations in the layer
919
+ for indices in entangler_map:
920
+ parameterized_block = self._parameterize_block(block, param_iter, i, j, indices)
921
+ circuit.compose(parameterized_block, indices, inplace=True, copy=False)
922
+
923
+ def _build_additional_layers(self, circuit, which):
924
+ if which == "appended":
925
+ blocks = self._appended_blocks
926
+ entanglements = self._appended_entanglement
927
+ elif which == "prepended":
928
+ blocks = reversed(self._prepended_blocks)
929
+ entanglements = reversed(self._prepended_entanglement)
930
+ else:
931
+ raise ValueError("`which` must be either `appended` or `prepended`.")
932
+
933
+ for block, ent in zip(blocks, entanglements):
934
+ if isinstance(ent, str):
935
+ ent = get_entangler_map(block.num_qubits, self.num_qubits, ent)
936
+ for indices in ent:
937
+ circuit.compose(block, indices, inplace=True, copy=False)
938
+
939
+ def _build(self) -> None:
940
+ """If not already built, build the circuit."""
941
+ if self._is_built:
942
+ return
943
+
944
+ super()._build()
945
+
946
+ if self.num_qubits == 0:
947
+ return
948
+
949
+ if not self._flatten:
950
+ circuit = QuantumCircuit(*self.qregs, name=self.name)
951
+ else:
952
+ circuit = self
953
+
954
+ # use the initial state as starting circuit, if it is set
955
+ if self.initial_state:
956
+ circuit.compose(self.initial_state.copy(), inplace=True, copy=False)
957
+
958
+ param_iter = iter(self.ordered_parameters)
959
+
960
+ # build the prepended layers
961
+ self._build_additional_layers(circuit, "prepended")
962
+
963
+ # main loop to build the entanglement and rotation layers
964
+ for i in range(self.reps):
965
+ # insert barrier if specified and there is a preceding layer
966
+ if self._insert_barriers and (i > 0 or len(self._prepended_blocks) > 0):
967
+ circuit.barrier()
968
+
969
+ # build the rotation layer
970
+ self._build_rotation_layer(circuit, param_iter, i)
971
+
972
+ # barrier in between rotation and entanglement layer
973
+ if self._insert_barriers and len(self._rotation_blocks) > 0:
974
+ circuit.barrier()
975
+
976
+ # build the entanglement layer
977
+ self._build_entanglement_layer(circuit, param_iter, i)
978
+
979
+ # add the final rotation layer
980
+ if not self._skip_final_rotation_layer:
981
+ if self.insert_barriers and self.reps > 0:
982
+ circuit.barrier()
983
+ self._build_rotation_layer(circuit, param_iter, self.reps)
984
+
985
+ # add the appended layers
986
+ self._build_additional_layers(circuit, "appended")
987
+
988
+ # cast global phase to float if it has no free parameters
989
+ if isinstance(circuit.global_phase, ParameterExpression):
990
+ try:
991
+ circuit.global_phase = float(circuit.global_phase)
992
+ except TypeError:
993
+ # expression contains free parameters
994
+ pass
995
+
996
+ if not self._flatten:
997
+ try:
998
+ block = circuit.to_gate()
999
+ except QiskitError:
1000
+ block = circuit.to_instruction()
1001
+
1002
+ self.append(block, self.qubits, copy=False)
1003
+
1004
+ # pylint: disable=unused-argument
1005
+ def _parameter_generator(self, rep: int, block: int, indices: list[int]) -> Parameter | None:
1006
+ """If certain blocks should use certain parameters this method can be overridden."""
1007
+ return None
1008
+
1009
+
1010
+ def get_parameters(block: QuantumCircuit | Instruction) -> list[Parameter]:
1011
+ """Return the list of Parameters objects inside a circuit or instruction.
1012
+
1013
+ This is required since, in a standard gate the parameters are not necessarily Parameter
1014
+ objects (e.g. U3Gate(0.1, 0.2, 0.3).params == [0.1, 0.2, 0.3]) and instructions and
1015
+ circuits do not have the same interface for parameters.
1016
+ """
1017
+ if isinstance(block, QuantumCircuit):
1018
+ return list(block.parameters)
1019
+ else:
1020
+ return [p for p in block.params if isinstance(p, ParameterExpression)]
1021
+
1022
+
1023
+ def get_entangler_map(
1024
+ num_block_qubits: int, num_circuit_qubits: int, entanglement: str, offset: int = 0
1025
+ ) -> Sequence[tuple[int, ...]]:
1026
+ """Get an entangler map for an arbitrary number of qubits.
1027
+
1028
+ Args:
1029
+ num_block_qubits: The number of qubits of the entangling block.
1030
+ num_circuit_qubits: The number of qubits of the circuit.
1031
+ entanglement: The entanglement strategy.
1032
+ offset: The block offset, can be used if the entanglements differ per block.
1033
+ See mode ``sca`` for instance.
1034
+
1035
+ Returns:
1036
+ The entangler map using mode ``entanglement`` to scatter a block of ``num_block_qubits``
1037
+ qubits on ``num_circuit_qubits`` qubits.
1038
+
1039
+ Raises:
1040
+ ValueError: If the entanglement mode ist not supported.
1041
+ """
1042
+ try:
1043
+ return fast_entangler_map(num_circuit_qubits, num_block_qubits, entanglement, offset)
1044
+ except Exception as exc:
1045
+ # need this as Rust is now raising a QiskitError, where this function was raising ValueError
1046
+ raise ValueError("Something went wrong in Rust space, here's the error:") from exc
1047
+
1048
+
1049
+ _StdlibGateResult = collections.namedtuple("_StdlibGateResult", ("gate", "num_params"))
1050
+ _STANDARD_GATE_MAPPING = get_standard_gate_name_mapping()
1051
+
1052
+
1053
+ def _stdlib_gate_from_simple_block(block: QuantumCircuit) -> _StdlibGateResult | None:
1054
+ if block.global_phase != 0.0 or len(block) != 1:
1055
+ return None
1056
+ instruction = block.data[0]
1057
+ # If the single instruction isn't a standard-library gate that spans the full width of the block
1058
+ # in the correct order, we're not simple. If the gate isn't fully parametrized with pure,
1059
+ # unique `Parameter` instances (expressions are too complex) that are in order, we're not
1060
+ # simple.
1061
+ if (
1062
+ instruction.clbits
1063
+ or tuple(instruction.qubits) != tuple(block.qubits)
1064
+ or (
1065
+ getattr(_STANDARD_GATE_MAPPING.get(instruction.operation.name), "base_class", None)
1066
+ is not instruction.operation.base_class
1067
+ )
1068
+ or tuple(instruction.operation.params) != tuple(block.parameters)
1069
+ ):
1070
+ return None
1071
+ return _StdlibGateResult(instruction.operation.base_class, len(instruction.operation.params))