Langkau ke kandungan utama
Projek ini dalam fasa beta. Jumpa pepijat? Buat isu GitHub. Ada soalan atau idea? Tanya dalam Discussions — kami suka dengar maklum balas anda!
Bagaimana kualiti terjemahan pada halaman ini?

Cara mentafsir visualisasi shaded lightcone

Pakej ini menyediakan dua cara untuk melihat shaded lightcone:

  • draw_shaded_lightcone melapiskan sempadan pada gambar rajah litar. Ini paling sesuai untuk litar pada rantai 1D qubit, di mana gambar rajah litar dan susun atur fizikal sepadan.

  • animate_shaded_lightcone memproyeksikan sempadan pada peta gandingan QPU dan melangkah melalui litar lapisan demi lapisan. Ini paling sesuai apabila kesambungan qubit lebih daripada garis 1D, di mana gambar rajah litar tidak lagi menyampaikan qubit mana yang berjiran.

Kedua-dua visualisasi menunjukkan nombor asas yang sama. Panduan ini merangkumi maksud nombor tersebut, dan menerangkan butiran yang mudah disalah baca.

Persediaan​

Gunakan litar Ising Trotter dan observabel yang sama seperti panduan permulaan pantas.

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

_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_addon_slc": "qiskit-addon-slc", "samplomatic": "samplomatic"}
_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")
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import Pauli, PauliLindbladMap, QubitSparsePauliList
from qiskit_addon_slc.bounds import (
compute_backward_bounds,
compute_forward_bounds,
merge_bounds,
)
from qiskit_addon_slc.utils import generate_noise_model_paulis
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic.utils import find_unique_box_instructions

def trotter_ising_circuit(num_qubits, num_steps, rx_angle, rzz_angle):
"""Trotterized transverse-field Ising evolution on a 1D chain."""
circuit = QuantumCircuit(num_qubits)
for _ in range(num_steps):
circuit.rx(rx_angle, range(num_qubits))
circuit.barrier()
for start in (0, 1): # even then odd bonds
for i in range(start, num_qubits - 1, 2):
circuit.rzz(rzz_angle, i, i + 1)
circuit.barrier()
return circuit

num_qubits = 10
circuit = trotter_ising_circuit(
num_qubits, num_steps=4, rx_angle=np.pi / 16, rzz_angle=-np.pi / 3
)
observable = Pauli("I" * num_qubits).compose("Z", [num_qubits // 2])

boxing_pass = generate_boxing_pass_manager(
inject_noise_targets="all",
inject_noise_strategy="individual_modification",
inject_noise_site="after",
twirling_strategy="active",
remove_barriers="never",
)
boxed_circuit = boxing_pass.run(circuit)
noise_model_paulis = generate_noise_model_paulis(
find_unique_box_instructions(boxed_circuit)
)

forward_bounds = compute_forward_bounds(
boxed_circuit, noise_model_paulis, observable
)
backward_bounds = compute_backward_bounds(boxed_circuit, noise_model_paulis)

rng = np.random.default_rng(42)
noise_rates = {
layer: PauliLindbladMap.from_components(
rng.random(len(terms)) * 5e-3,
QubitSparsePauliList.from_sparse_list(
terms.to_sparse_list(), terms.num_qubits
),
)
for layer, terms in noise_model_paulis.items()
}
merged_bounds = merge_bounds(
boxed_circuit, forward_bounds, backward_bounds, noise_rates
)
print(f"observable: Z on qubit {num_qubits // 2}")
Optimal spacetime partitioning not implemented! Just partitioning list of noisy boxes.
observable: Z on qubit 5

draw_shaded_lightcone​

Setiap kotak bising dilorekkan mengikut sempadan ralat yang berlaku di situ: cerah bermaksud sempadan besar, dan kotak yang pudar ke latar belakang bermaksud ralatnya mempunyai kesan kecil terhadap observabel. Kotak pudar itu ialah calon untuk digugurkan daripada model hingar yang dimitigasi.

from qiskit_addon_slc.visualization import draw_shaded_lightcone

draw_shaded_lightcone(
boxed_circuit, merged_bounds, noise_model_paulis, fold=-1, scale=0.5
)

Output of the previous code cell

Nota penting​

1. Setiap nombor ialah hasil tambah ke atas sebutan ralat yang berkongsi sokongan. Tanpa penapis, sempadan setiap sebutan ralat yang bertindak pada qubit yang sama, atau pada pasangan qubit yang sama, ditambah menjadi satu nilai: ketiga-tiga jenis Pauli pada satu qubit, dan kesemua sembilan pada satu pasangan. Itu mempunyai dua akibat. Nilai boleh melebihi 2.0, walaupun tiada sempadan sebutan tunggal yang boleh (kotak berlabel 4.5 ialah beberapa sebutan yang ditambah, bukan sempadan yang dilanggar). Rajah itu tidak dapat memberitahu anda sama ada nilai besar datang daripada satu jenis Pauli atau daripada beberapa jenis yang setanding; bahagian seterusnya menunjukkan cara memisahkannya.

2. Skala warna bermula pada 2.0 dan bertambah mengikut data. Skala berjalan daripada 0 hingga entri "max_bound" dalam metadata litar yang dilapiskan, iaitu yang lebih besar antara 2.0 dan nilai terbesar yang ditunjukkan. Hasil tambah tanpa penapis sering melebihi 2.0, jadi skala melebar untuk memuatkannya, dan warna yang sama boleh mewakili nilai yang berbeza dalam rajah yang berbeza. Apabila setiap nilai kecil, skala kekal pada 2.0 dan semuanya kelihatan gelap seragam (itu skala yang mencerminkan saiz mutlak, bukan kerosakan pemaparan).

Memisahkan jenis Pauli​

Gunakan pauli_filter untuk melihat satu jenis pada satu masa. Integer memilih pemberat Pauli; rentetan memilih Pauli tertentu, dipadankan dengan setiap sebutan hingar dikurangkan kepada sokongan bukan identitinya sendiri. Jadi "X" memilih setiap ralat XX qubit tunggal, tidak kira qubit mana yang ditindaknya, dan "XX" memilih yang berpemberat 2 (label lebar penuh seperti "XII" tidak memadankan apa-apa).

from qiskit_addon_slc.visualization import accumulate_filtered_bounds

box_id = next(iter(merged_bounds))
print(f"single-qubit supports of box {box_id!r}:\n")
print(f"{'filter':>8} bounds per qubit")
for pauli_filter in (None, 1, "X", "Y", "Z"):
filtered = accumulate_filtered_bounds(
boxed_circuit, merged_bounds, noise_model_paulis, pauli_filter
)
per_qubit = {
support[0]: round(float(bound), 3)
for support, bound in sorted(filtered[box_id].items())
if len(support) == 1
}
print(f"{pauli_filter!s:>8} {per_qubit}")
single-qubit supports of box 'm0':

filter bounds per qubit
None {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.312, 4: 1.355, 5: 5.111, 6: 1.506, 7: 0.124, 8: 0.019, 9: 0.0}
1 {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.312, 4: 1.355, 5: 5.111, 6: 1.506, 7: 0.124, 8: 0.019, 9: 0.0}
X {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.153, 4: 0.577, 5: 2.0, 6: 0.702, 7: 0.056, 8: 0.01, 9: 0.0}
Y {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.148, 4: 0.607, 5: 2.0, 6: 0.631, 7: 0.057, 8: 0.01, 9: 0.0}
Z {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.011, 4: 0.172, 5: 1.111, 6: 0.172, 7: 0.011, 8: 0.0, 9: 0.0}

Baris tanpa penapis ialah hasil tambah ketiga-tiga jenis Pauli di bawahnya. Penapisan ialah satu-satunya cara untuk mengetahui sama ada nilai besar tanpa penapis datang daripada satu jenis ralat dominan atau beberapa yang setanding. Itu penting, kerana mitigasi bertindak mengikut sebutan, bukan mengikut tapak.

Memasukkan penapis yang sama kepada draw_shaded_lightcone merekodkannya dalam tajuk rajah, supaya rajah yang ditapis tidak boleh dikelirukan dengan yang tidak ditapis:

draw_shaded_lightcone(
boxed_circuit,
merged_bounds,
noise_model_paulis,
pauli_filter="X",
fold=-1,
scale=0.5,
)

Output of the previous code cell

Rajah ini kelihatan agak berbeza daripada yang tanpa penapis di atas, dan bukan hanya kerana ia menunjukkan lebih sedikit nilai. Setiap pemegang tempat dalam rajah ini mewakili satu sokongan: satu qubit, atau sepasang qubit. Tanpa penapis, kotak menunjukkan pemegang tempat pada setiap qubit dan pada setiap pasangan qubit berjiran, jadi ia merentasi beberapa lajur. Dengan "X", hanya sokongan qubit tunggal yang kekal, dan setiap kotak mengecut menjadi satu lajur.

Namun, kedua-dua gambar tidak menunjukkan apa yang sebenarnya digunakan oleh PEC. Pemegang tempat ialah cara untuk memaparkan sempadan, bukan gate anti-hingar. Semasa eksperimen, setiap kotak yang terma ralatnya dimitigasi diperlakukan sebagai satu lapisan gate dua-qubit, dan Pauli anti-hingar yang disampel untuk terma ralatnya digubah menjadi satu Pauli yang dikenakan pada lapisan itu secara keseluruhan.

animate_shaded_lightcone​

Pada peranti yang kesambungannya bukan garis 1D, rajah litar tidak lagi menunjukkan qubit mana yang berjiran, jadi penyebaran ruang lightcone menjadi mustahil untuk dibaca. animate_shaded_lightcone sebaliknya melukis peta gandingan QPU dan menganimasikan sempadan merentasinya, satu kotak berhingar bagi setiap bingkai.

Ia memerlukan CouplingMap, yang disusun atur pada grid dengan membenamkan graf peranti, jadi ia menyokong kedua-dua kesambungan heavy-hex dan segi empat sama.

Nota: Dalam dokumentasi yang dirender ini, animasi adalah statik. Peluncur dan butang main hanya berfungsi apabila notebook dijalankan secara interaktif, contohnya dalam Jupyter.

from qiskit import transpile
from qiskit.transpiler import CouplingMap
from qiskit_addon_slc.visualization import animate_shaded_lightcone

# A small square-lattice device stands in for a real backend here.
coupling_map = CouplingMap.from_grid(3, 4)

# Lay the chain onto a connected path of physical qubits, snaking through the grid, so the
# transpiler inserts no SWAPs: a SWAP-laden circuit is far more expensive to bound and harder to
# read.
initial_layout = [0, 1, 2, 3, 7, 6, 5, 4, 8, 9]
device_circuit = transpile(
circuit,
coupling_map=coupling_map,
initial_layout=initial_layout,
optimization_level=0,
)
boxed_device_circuit = boxing_pass.run(device_circuit)
device_noise_paulis = generate_noise_model_paulis(
find_unique_box_instructions(boxed_device_circuit),
coupling_map=coupling_map,
circuit=boxed_device_circuit,
)
# The same observable, on the physical qubit the middle of the chain was laid onto.
device_observable = Pauli("I" * device_circuit.num_qubits).compose(
"Z", [initial_layout[num_qubits // 2]]
)
device_bounds = compute_forward_bounds(
boxed_device_circuit, device_noise_paulis, device_observable
)

animate_shaded_lightcone(boxed_device_circuit, device_bounds, coupling_map)

Output of the previous code cell

Membaca animasi​

Setiap qubit ialah carta pai, satu hirisan bagi setiap jenis Pauli. Penanda sesuatu qubit dibahagikan kepada tiga hirisan untuk ralat XX, YY dan ZZnya, setiap satu dilorekkan mengikut sempadannya sendiri. Ini ialah penapisan daripada bahagian sebelumnya yang terbina dalam rajah (tiada pauli_filter diperlukan untuk membezakan jenis).

Tepi membawa sempadan ralat dua-qubit. Garisan antara dua qubit yang bergandingan dilorekkan mengikut sempadan ralat berpemberat-2 yang bertindak pada pasangan itu.

Kelabu cerah bermaksud tiada data, bukan sempadan yang kecil. Hirisan atau tepi dilukis kelabu cerah apabila model hingar kotak tidak mempunyai terma ralat untuknya, contohnya pada qubit yang tidak dikenakan tindakan oleh kotak. Ia dilukis kelabu dan bukan gelap supaya tidak dikelirukan dengan sempadan sifar. Kotak melebihi had max_num_boxes adalah berbeza: ia membawa sempadan remeh 2.0, jadi ia dilukis pada hujung skala yang terang.

Peluncur melangkah melalui kotak, bukan melalui masa secara seragam. Terdapat satu bingkai bagi setiap kotak berhingar, mengikut susunan litar (atau susunan terbalik dengan reverse=True, yang menjejak lightcone ke belakang dari observable). Menontonnya secara terbalik biasanya arah yang lebih intuitif: kon itu berkembang ke luar daripada qubit yang diukur. Setiap bingkai dilabel dengan pengecam kotaknya, kunci yang sama yang digunakan oleh kamus sempadan untuk menyimpan kotak itu, jadi peluncur juga boleh digunakan untuk melompat ke kotak tertentu dan mencari nombornya.

Nota: Susun atur qubit dipulihkan daripada graf peta gandingan dengan membenamkannya ke dalam kekisi segi empat sama. Peta gandingan yang tidak dapat dibenamkan (kerana terputus, atau terlalu padat bersambung untuk grid) menimbulkan ValueError dan bukannya melukis gambar yang mengelirukan.

Yang mana satu untuk digunakan​

draw_shaded_lightconeanimate_shaded_lightcone
geometrirajah litarpeta gandingan QPU
terbaik untukrantai 1Dsebarang kesambungan
jenis Paulidijumlahkan, melainkan ditapissentiasa dipisahkan, sebagai hirisan pai
masasemua lapisan serentaksatu lapisan setiap bingkai
outputrajah matplotlibrajah plotly

Untuk rantai 1D, rajah statik lebih mudah ditangkap sepintas lalu dan boleh dihasilkan semula dalam kertas kerja. Di luar 1D, animasi ialah satu-satunya daripada kedua-duanya yang menunjukkan struktur ruang dengan setia.