Przejdź do głównej treści

Instalacja i użycie wtyczek Transpilera

Wersje pakietów

Kod na tej stronie został opracowany przy użyciu poniższych zależności. Zalecamy korzystanie z tych wersji lub nowszych.

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

Aby ułatwić tworzenie i ponowne wykorzystywanie niestandardowego kodu transpilacji przez szerszą społeczność użytkowników Qiskit, Qiskit SDK obsługuje interfejs wtyczek, który umożliwia zewnętrznym pakietom Pythona zadeklarowanie, że udostępniają rozszerzoną funkcjonalność transpilacji dostępną przez Qiskit.

Aktualnie zewnętrzne wtyczki mogą udostępniać rozszerzoną funkcjonalność transpilacji na trzy sposoby:

  • Wtyczka etapu Transpilera dostarcza menedżer przebiegów, który można użyć zamiast jednego z 6 etapów wstępnie skonfigurowanego podzielonego na etapy menedżera przebiegów: init, layout, routing, translation, optimization i scheduling.
  • Wtyczka syntezy unitarnej dostarcza rozszerzoną funkcjonalność syntezy unitarnych bramek.
  • Wtyczka syntezy wysokiego poziomu dostarcza rozszerzoną funkcjonalność syntezy „obiektów wysokiego poziomu", takich jak funkcje liniowe lub operatory Clifforda. Obiekty wysokiego poziomu są reprezentowane przez podklasy klasy Operation.

Pozostała część strony opisuje, jak wylistować dostępne wtyczki, zainstalować nowe i jak ich używać.

Lista dostępnych wtyczek i instalacja nowych

Qiskit zawiera już kilka wbudowanych wtyczek do transpilacji. Aby zainstalować więcej, możesz użyć menedżera pakietów Pythona. Na przykład możesz uruchomić pip install qiskit-toqm, aby zainstalować wtyczkę etapu routingu Qiskit TOQM. Wiele zewnętrznych wtyczek jest częścią ekosystemu Qiskit.

Lista dostępnych wtyczek etapów Transpilera

Użyj funkcji list_stage_plugins, podając nazwę etapu, którego wtyczki chcesz wylistować.

# 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']

Gdyby zainstalowano qiskit-toqm, toqm pojawiłoby się na liście wtyczek routing.

Lista dostępnych wtyczek syntezy unitarnej

Użyj funkcji unitary_synthesis_plugin_names.

from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names

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

Lista dostępnych wtyczek syntezy wysokiego poziomu

Użyj funkcji high_level_synthesis_plugin_names, podając nazwę typu „obiektu wysokiego poziomu" do syntezy. Nazwa odpowiada atrybutowi name klasy Operation reprezentującej typ syntetyzowanego obiektu.

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']

Możesz użyć klasy HighLevelSynthesisPluginManager, aby wylistować nazwy wszystkich wtyczek syntezy wysokiego poziomu:

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']

Używanie wtyczki

W tej sekcji pokazujemy, jak używać wtyczek Transpilera. W przykładach kodu używamy wtyczek dostarczanych z Qiskit, ale wtyczki zainstalowane z zewnętrznych pakietów używa się w ten sam sposób.

Używanie wtyczki etapu Transpilera

Aby użyć wtyczki etapu Transpilera, podaj jej nazwę jako odpowiedni argument w generate_preset_pass_manager lub transpile. Argument tworzy się przez dodanie _method do nazwy etapu transpilacji. Na przykład, aby użyć wtyczki routingu lookahead, należy podać lookahead jako argument 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"
)

Używanie wtyczki syntezy unitarnej

Aby użyć wtyczki syntezy unitarnej, podaj jej nazwę jako argument unitary_synthesis_method w generate_preset_pass_manager lub 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"]
),
)

Synteza unitarna jest używana na etapach init, translation i optimization podzielonego na etapy menedżera przebiegów zwracanego przez generate_preset_pass_manager lub używanego w transpile. Opis tych etapów znajdziesz w Etapach Transpilera.

Użyj argumentu unitary_synthesis_plugin_config, czyli słownika o dowolnej strukturze, aby przekazać opcje dla metody syntezy unitarnej. Dokumentacja metody syntezy powinna wyjaśniać obsługiwane opcje. Ta lista zawiera linki do dokumentacji wbudowanych wtyczek syntezy unitarnej.

Używanie wtyczki syntezy wysokiego poziomu

Najpierw utwórz obiekt HLSConfig, aby przechowywać nazwy wtyczek do użycia dla różnych obiektów wysokiego poziomu. Na przykład:

from qiskit.transpiler.passes import HLSConfig

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

Ten fragment kodu tworzy konfigurację syntezy wysokiego poziomu, która używa wtyczki layers do syntezy obiektów Clifford i wtyczki pmh do syntezy obiektów LinearFunction. Nazwy argumentów słów kluczowych odpowiadają atrybutowi name klasy Operation reprezentującej typ syntetyzowanego obiektu. Dla każdego obiektu wysokiego poziomu podane wtyczki są kolejno wypróbowywane, dopóki jedna z nich nie zakończy się sukcesem (w powyższym przykładzie każda lista zawiera tylko jedną wtyczkę).

Oprócz podawania wtyczki przez jej nazwę, możesz zamiast tego przekazać krotkę (name, options), gdzie drugi element krotki to słownik zawierający opcje dla wtyczki. Dokumentacja metody syntezy powinna wyjaśniać obsługiwane opcje. Ta lista zawiera linki do dokumentacji wbudowanych wtyczek syntezy wysokiego poziomu.

Gdy obiekt HLSConfig zostanie utworzony, przekaż go jako argument hls_config do generate_preset_pass_manager lub transpile:

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

Synteza wysokiego poziomu jest używana na etapach init, translation i optimization podzielonego na etapy menedżera przebiegów zwracanego przez generate_preset_pass_manager lub używanego w transpile. Opis tych etapów znajdziesz w Etapach Transpilera.

Kolejne kroki

Zalecenie