Sari la conținutul principal

Instalează și folosește plugin-uri pentru Transpiler

Versiuni de pachete

Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm să folosești aceste versiuni sau mai noi.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Pentru a facilita dezvoltarea și reutilizarea codului de transpilare personalizat de către comunitatea mai largă de utilizatori Qiskit, Qiskit SDK suportă o interfață de plugin care permite pachetelor Python terțe să declare că oferă funcționalitate extinsă de transpilare accesibilă prin Qiskit.

În prezent, plugin-urile terțe pot oferi funcționalitate extinsă de transpilare în trei moduri:

  • Un plugin de etapă pentru Transpiler oferă un manager de pași care poate fi folosit în locul uneia dintre cele 6 etape ale unui manager de pași prestabilit pe etape: init, layout, routing, translation, optimization și scheduling.
  • Un plugin de sinteză unitară oferă funcționalitate extinsă pentru sinteza Gate-urilor unitare.
  • Un plugin de sinteză la nivel înalt oferă funcționalitate extinsă pentru sinteza „obiectelor de nivel înalt", cum ar fi funcțiile liniare sau operatorii Clifford. Obiectele de nivel înalt sunt reprezentate de subclase ale clasei Operation.

Restul paginii descrie cum să listezi plugin-urile disponibile, să instalezi altele noi și să le folosești.

Listează plugin-urile disponibile și instalează altele noi

Qiskit include deja câteva plugin-uri built-in pentru transpilare. Pentru a instala mai multe, poți folosi managerul tău de pachete Python. De exemplu, ai putea rula pip install qiskit-toqm pentru a instala plugin-ul de etapă de routing Qiskit TOQM. O serie de plugin-uri terțe fac parte din ecosistemul Qiskit.

Listează plugin-urile de etapă pentru Transpiler disponibile

Folosește funcția list_stage_plugins, transmițând numele etapei ale cărei plugin-uri vrei să le listezi.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins

list_stage_plugins("layout")
['default', 'dense', 'sabre', 'trivial']
list_stage_plugins("routing")
['basic', 'default', 'lookahead', 'none', 'sabre']

Dacă qiskit-toqm ar fi instalat, atunci toqm ar apărea în lista de plugin-uri routing.

Listează plugin-urile de sinteză unitară disponibile

Folosește funcția unitary_synthesis_plugin_names.

from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names

unitary_synthesis_plugin_names()
['aqc', 'clifford', 'default', 'gridsynth', 'sk']

Listează plugin-urile de sinteză la nivel înalt disponibile

Folosește funcția high_level_synthesis_plugin_names, transmițând numele tipului de „obiect de nivel înalt" care urmează să fie sintetizat. Numele corespunde atributului name al clasei Operation care reprezintă tipul de obiect sintetizat.

from qiskit.transpiler.passes.synthesis import (
high_level_synthesis_plugin_names,
)

high_level_synthesis_plugin_names("clifford")
['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']

Poți folosi clasa HighLevelSynthesisPluginManager pentru a lista numele tuturor plugin-urilor de sinteză la nivel înalt:

from qiskit.transpiler.passes.synthesis.plugin import (
HighLevelSynthesisPluginManager,
)

HighLevelSynthesisPluginManager().plugins.names()
['FullAdder.default',
'FullAdder.ripple_c04',
'FullAdder.ripple_v95',
'HalfAdder.default',
'HalfAdder.qft_d00',
'HalfAdder.ripple_c04',
'HalfAdder.ripple_r25',
'HalfAdder.ripple_v95',
'IntComp.default',
'IntComp.noaux',
'IntComp.twos',
'ModularAdder.default',
'ModularAdder.modular_v17',
'ModularAdder.qft_d00',
'ModularAdder.ripple_c04',
'ModularAdder.ripple_v95',
'Multiplier.cumulative_h18',
'Multiplier.default',
'Multiplier.qft_r17',
'PauliEvolution.default',
'PauliEvolution.rustiq',
'WeightedSum.default',
'annotated.default',
'clifford.ag',
'clifford.bm',
'clifford.default',
'clifford.greedy',
'clifford.layers',
'clifford.lnn',
'linear_function.default',
'linear_function.kms',
'linear_function.pmh',
'mcmt.default',
'mcmt.noaux',
'mcmt.vchain',
'mcmt.xgate',
'mcx.1_clean_b95',
'mcx.1_clean_kg24',
'mcx.1_dirty_kg24',
'mcx.2_clean_kg24',
'mcx.2_dirty_kg24',
'mcx.default',
'mcx.gray_code',
'mcx.n_clean_m15',
'mcx.n_dirty_i15',
'mcx.noaux_hp24',
'mcx.noaux_v24',
'permutation.acg',
'permutation.basic',
'permutation.default',
'permutation.kms',
'permutation.token_swapper',
'qft.default',
'qft.full',
'qft.line',
'clifford.rb_default']

Folosește un plugin

În această secțiune, arătăm cum să folosești plugin-urile pentru Transpiler. În exemplele de cod, folosim plugin-uri care vin împreună cu Qiskit, dar plugin-urile instalate din pachete terțe se utilizează în același mod.

Folosește un plugin de etapă pentru Transpiler

Pentru a folosi un plugin de etapă pentru Transpiler, specifică numele acestuia cu argumentul corespunzător pentru generate_preset_pass_manager sau transpile. Argumentul se formează adăugând _method la numele etapei de transpilare. De exemplu, pentru a folosi plugin-ul de routing lookahead, am specifica lookahead pentru argumentul routing_method:

from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend("ibm_fez")

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, routing_method="lookahead"
)

Folosește un plugin de sinteză unitară

Pentru a folosi un plugin de sinteză unitară, specifică numele acestuia ca argument unitary_synthesis_method pentru generate_preset_pass_manager sau transpile:

pass_manager = generate_preset_pass_manager(
optimization_level=3,
backend=backend,
unitary_synthesis_method="sk",
unitary_synthesis_plugin_config=dict(
basis_gates=["cz", "id", "rz", "sx", "x"]
),
)

Sinteza unitară este folosită în etapele init, translation și optimization ale managerului de pași pe etape returnat de generate_preset_pass_manager sau folosit în transpile. Consultă Etapele Transpiler pentru o descriere a acestor etape.

Folosește argumentul unitary_synthesis_plugin_config, un dicționar liber, pentru a transmite opțiuni pentru metoda de sinteză unitară. Documentația metodei de sinteză ar trebui să explice opțiunile pe care le suportă. Consultă această listă pentru linkuri către documentația plugin-urilor built-in de sinteză unitară.

Folosește un plugin de sinteză la nivel înalt

Mai întâi, creează un obiect HLSConfig pentru a stoca numele plugin-urilor de folosit pentru diverse obiecte de nivel înalt. De exemplu:

from qiskit.transpiler.passes import HLSConfig

hls_config = HLSConfig(clifford=["layers"], linear_function=["pmh"])

Această celulă de cod creează o configurație de sinteză la nivel înalt care folosește plugin-ul layers pentru sintetizarea obiectelor Clifford și plugin-ul pmh pentru sintetizarea obiectelor LinearFunction. Numele argumentelor cuvânt cheie corespund atributului name al clasei Operation care reprezintă tipul de obiect sintetizat. Pentru fiecare obiect de nivel înalt, lista de plugin-uri specificată este încercată în ordine până când unul dintre ele reușește (în exemplul de mai sus, fiecare listă conține doar un singur plugin).

Pe lângă specificarea unui plugin prin numele său, poți transmite în schimb un tuplu (name, options), unde al doilea element al tuplului este un dicționar care conține opțiuni pentru plugin. Documentația metodei de sinteză ar trebui să explice opțiunile pe care le suportă. Consultă această listă pentru linkuri către documentația plugin-urilor built-in de sinteză la nivel înalt.

După ce ai creat obiectul HLSConfig, transmite-l ca argument hls_config pentru generate_preset_pass_manager sau transpile:

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, hls_config=hls_config
)

Sinteza la nivel înalt este folosită în etapele init, translation și optimization ale managerului de pași pe etape returnat de generate_preset_pass_manager sau folosit în transpile. Consultă Etapele Transpiler pentru o descriere a acestor etape.

Pași următori

Recomandare