Parametri utilizați frecvent pentru transpilare
Versiuni de pachete
Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm utilizarea acestor versiuni sau a unora mai noi.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Această pagină descrie unii dintre parametrii utilizați mai frecvent pentru transpilarea locală. Acești parametri sunt configurați folosind argumente pentru generate_preset_pass_manager sau transpile.
Gradul de aproximare
Poți folosi gradul de aproximare pentru a specifica cât de mult dorești ca circuitul rezultat să corespundă circuitului dorit (de intrare). Acesta este un număr de tip float în intervalul (0.0 - 1.0), unde 0.0 reprezintă aproximarea maximă și 1.0 (implicit) înseamnă fără aproximare. Valorile mai mici sacrifică acuratețea ieșirii în favoarea ușurinței de execuție (adică, mai puține porți). Valoarea implicită este 1.0.
În sinteza unitară cu doi qubiți (utilizată în etapele inițiale ale tuturor nivelurilor și pentru etapa de optimizare cu nivelul de optimizare 3), această valoare specifică fidelitatea țintă a descompunerii de ieșire. Adică, câtă eroare este introdusă atunci când o reprezentare matriceală a unui circuit este convertită în porți discrete. Dacă gradul de aproximare are o valoare mai mică (mai multă aproximare), circuitul de ieșire din sinteză va diferi mai mult față de matricea de intrare, dar va avea și mai puține porți (deoarece orice operație arbitrară cu doi qubiți poate fi descompusă perfect cu cel mult trei porți CX) și este mai ușor de rulat.
Când gradul de aproximare este mai mic de 1.0, pot fi sintetizate circuite cu una sau două porți CX, ducând la mai puțină eroare de la hardware, dar mai multă din aproximare. Deoarece CX este cea mai costisitoare poartă în termeni de eroare, ar putea fi benefic să reduci numărul acestora cu prețul fidelității în sinteză (această tehnică a fost folosită pentru a crește volumul cuantic pe dispozitivele IBM®: Validating quantum computers using randomized model circuits).
Ca exemplu, generăm un UnitaryGate aleatoriu cu doi qubiți care va fi sintetizat în etapa inițială. Setând approximation_degree la o valoare mai mică de 1.0 se poate genera un circuit aproximativ. Trebuie, de asemenea, să specificăm basis_gates pentru a permite metodei de sinteză să știe ce porți poate folosi pentru sinteza aproximativă.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager
UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)
qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])
2
Aceasta produce o ieșire de 2 deoarece aproximarea necesită mai puține porți CX.
Seed-ul generatorului de numere aleatorii
Unele părți ale Transpiler-ului sunt stocastice, astfel încât rulările repetate ale transpilării pot returna rezultate diferite. Pentru a obține un rezultat reproductibil, poți seta seed-ul pentru generatorul de numere pseudoaleatorii folosind argumentul seed_transpiler. Rulările repetate cu același seed vor returna aceleași rezultate.
Exemplu:
pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")
Layout-ul inițial
Înainte de transpilare, qubiții conținuți în circuitul tău sunt qubiți virtuali care nu corespund neapărat qubiților fizici de pe Backend-ul țintă. Poți specifica maparea inițială a qubiților virtuali la qubiții fizici folosind argumentul initial_layout. Reține că layout-ul final al qubiților poate diferi de layout-ul inițial deoarece Transpiler-ul poate permuta qubiții folosind porți swap sau alte mijloace.
În exemplul de mai jos, construim un layout inițial pentru Backend-ul simulat FakeSherbrooke prin crearea unui obiect Layout. Layout-ul nostru mapează primul qubit din circuitul nostru la qubitul 5 al lui Sherbrooke, și mapează al doilea qubit din circuitul nostru la qubitul 6 al lui Sherbrooke. Reține că qubiții fizici sunt întotdeauna reprezentați prin numere întregi.
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout
backend = FakeSherbrooke()
a, b = qubits
initial_layout = Layout({a: 5, b: 6})
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)
Pe lângă specificarea unui obiect Layout, poți transmite și o listă de numere întregi, unde elementul al listei conține qubitul fizic la care ar trebui mapat qubitul . De exemplu:
initial_layout = [5, 6]
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)
Poți folosi funcția plot_error_map pentru a genera o diagramă a grafului dispozitivului cu informații despre erori și cu qubiții fizici etichetați. Poți vizualiza, de asemenea, diagrame similare pe pagina Compute resources.
from qiskit.visualization import plot_error_map
plot_error_map(backend, figsize=(30, 24))
Opțiuni pentru etape și pluginuri ale Transpiler-ului
Aceste opțiuni au sufixul _method. Ele influențează modul în care funcționează Transpiler-ul și sunt folosite pentru a încerca să obții o ieșire mai bună, diferită sau specifică din Transpiler.
-
init_method(str) - Pluginul de utilizat pentru etapa de inițializare. -
layout_method(str) - Pass-ul de selecție a layout-ului (trivial,dense,sabre). Acesta poate fi și numele pluginului extern de utilizat pentru etapa de layout. -
optimization_method(str) - Pluginul de utilizat pentru etapa de optimizare. -
routing_method(str) - Numele pass-ului de rutare (basic,lookahead,default,sabre,none). Acesta poate fi și numele pluginului extern de utilizat pentru etapa de rutare. -
scheduling_method(str) - Numele pass-ului de planificare. Acesta poate fi și numele pluginului extern de utilizat pentru etapa de planificare.as_soon_as_possible: Planifică instrucțiunile greedy: cât mai devreme posibil pe o resursă qubit (alias:asap).as_late_as_possible: Planifică instrucțiunile târziu. Adică, menține qubiții în starea de bază atunci când este posibil (alias:alap).
-
translation_method(str) - Numele pass-ului de traducere (unroller,translator,synthesis). Acesta poate fi și numele pluginului extern de utilizat pentru etapa de traducere. -
unitary_synthesis_method(str) - Numele metodei de sinteză unitară de utilizat. Implicit, se foloseștedefault.
Pentru a vedea o listă cu toate pluginurile instalate pentru o anumită etapă, rulează list_stage_plugins("stage_name"). De exemplu, dacă vrei să vezi o listă cu toate pluginurile instalate pentru etapa de rutare, rulează list_stage_plugins(routing).
Pași următori
- Consultă tema Opțiuni implicite și setări de configurare.
- Află cum să setezi nivelul de optimizare.
- Încearcă ghidul Compararea setărilor Transpiler-ului.
- Consultă documentația API pentru Transpiler.