Sari la conținutul principal
Acest proiect este în versiune beta. Ai găsit o eroare? Deschide un issue pe GitHub. Ai o întrebare sau o idee? Întreabă în Discussions — ne-ar plăcea să aflăm părerea ta!
Cum este calitatea traducerii pe această pagină?

Reducerea adâncimii circuitelor cu backpropagation pe operatori

Backpropagation pe operatori este o tehnică care presupune absorbirea operațiilor de la sfârșitul unui Circuit cuantic într-un operator Pauli, reducând în general adâncimea circuitului cu prețul unor termeni suplimentari în operator. Scopul este de a backpropaga cât mai mult din circuit fără a permite operatorului să crească prea mult.

O modalitate de a permite o backpropagare mai adâncă în circuit, prevenind în același timp creșterea excesivă a operatorului, este trunchierea termenilor cu coeficienți mici, în loc să fie adăugați la operator. Trunchierea termenilor poate duce la mai puține Circuit-uri cuantice de executat, însă aceasta introduce o eroare în calculul final al valorii așteptate, proporțională cu magnitudinea coeficienților termenilor trunchiați. În acest tutorial vom implementa un pattern Qiskit pentru simularea dinamicii cuantice a unui lanț de spin Heisenberg folosind backpropagation pe operatori:

  • Pasul 1: Maparea la problema cuantică

    • Mapează Hamiltonianul evoluat în timp pe un circuit cuantic
  • Pasul 2: Optimizarea problemei

    • Împarte circuitul în felii (slices)

    • Backpropagă feliile din circuit pe un observabil Pauli
    • Combină feliile rămase într-un singur Circuit

    • Transpilează circuitul pentru Backend

  • Pasul 3: Execuția experimentelor

    • Calculează valoarea așteptată folosind circuitul redus și observabilul extins cu un StatevectorEstimator, pentru simplitate în acest notebook
  • Pasul 4: Reconstrucția rezultatelor

    • N.A.

Notă: Qiskit descrie în sens larg straturile ca partiții de adâncime 1 ale circuitului pe toți Qubiții. Acest pachet folosește termenul felii (slices) pentru a descrie straturi de adâncime arbitrară. Funcția qiskit_addon_obp.backpropagate este proiectată să backpropagheze felii întregi odată, astfel că alegerea modului de feliere a circuitului cuantic poate avea un impact major asupra performanței backpropagării pentru o problemă dată. Vei afla mai multe despre felii mai jos.

Pasul 1: Maparea la problema cuantică​

Mapează evoluția în timp a unui model cuantic Heisenberg la un experiment cuantic.​

Pachetul qiskit_addon_utils oferă funcționalități reutilizabile pentru diverse scopuri.

Modulul său qiskit_addon_utils.problem_generators oferă funcții pentru generarea de Hamiltonieni de tip Heisenberg pe un graf de conectivitate dat. Acest graf poate fi fie un rustworkx.PyGraph, fie un CouplingMap, ceea ce îl face ușor de utilizat în fluxuri de lucru centrate pe Qiskit.

În continuare, generăm mai întâi un CouplingMap de tip heavy-hex din care extragem un lanț liniar de 10 Qubiți. Notă: indicii acestui nou reduced_coupling_map sunt din nou bazați pe zero.

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_addon_obp": "qiskit-addon-obp", "qiskit_addon_utils": "qiskit-addon-utils", "qiskit_ibm_runtime": "qiskit-ibm-runtime", "rustworkx": "rustworkx"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit.transpiler import CouplingMap

coupling_map = CouplingMap.from_heavy_hex(3, bidirectional=False)

# Choose a 10-qubit linear chain on this coupling map
reduced_coupling_map = coupling_map.reduce([0, 13, 1, 14, 10, 16, 5, 12, 8, 18])
from rustworkx.visualization import graphviz_draw

graphviz_draw(reduced_coupling_map.graph, method="circo")

Code output

Apoi, generăm un operator Pauli care modelează un Hamiltonian Heisenberg XYZ.

undefined