Magsimula sa mga primitive
Ang beta release ng bagong execution model ay available na. Ang directed execution model ay nagbibigay ng mas maraming flexibility sa pag-customize ng iyong error mitigation workflow. Tingnan ang gabay na Directed execution model para sa karagdagang impormasyon.
Bagama't ginagamit ng dokumentasyong ito ang mga primitive mula sa Qiskit Runtime, na nagpapahintulot sa iyo na gumamit ng IBM® backends, ang mga primitive ay maaaring patakbuhin sa anumang provider sa pamamagitan ng backend primitives. Bukod pa rito, maaari mong gamitin ang reference primitives para tumakbo sa lokal na statevector simulator. Tingnan ang Exact simulation with Qiskit primitives para sa mga detalye.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
Inilalarawan ng mga hakbang sa paksang ito kung paano i-set up ang mga primitive, tuklasin ang mga opsyon na magagamit mo para i-configure ang mga ito, at i-invoke ang mga ito sa isang program.
Para gamitin ang bagong sinusuportahang fractional gates, itakda ang use_fractional_gates=True kapag humiling ng backend mula sa isang QiskitRuntimeService instance. Halimbawa:
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)
Tandaan na ito ay isang experimental na feature at maaaring magbago sa hinaharap.
Package versions
Ang code sa pahinang ito ay binuo gamit ang mga sumusunod na requirements. Inirerekomenda naming gamitin ang mga bersyong ito o mas bago.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Magsimula sa Estimator​
1. I-initialize ang account​
Dahil ang Qiskit Runtime Estimator ay isang managed service, kailangan mo munang i-initialize ang iyong account. Pagkatapos ay maaari kang pumili ng QPU na gusto mong gamitin para kalkulahin ang expectation value.
Sundin ang mga hakbang sa Install and set up topic kung wala ka pang account.
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
print(backend.name)
ibm_torino
2. Gumawa ng circuit at observable​
Kailangan mo ng kahit isang circuit at isang observable bilang mga input sa Estimator primitive.
from qiskit.circuit.library import qaoa_ansatz
from qiskit.quantum_info import SparsePauliOp
entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]
observable = SparsePauliOp.from_sparse_list(
[("ZZ", [i, j], 0.5) for i, j in entanglement],
num_qubits=backend.num_qubits,
)
circuit = qaoa_ansatz(observable, reps=2)
# the circuit is parametrized, so we will define the parameter values for execution
param_values = [0.1, 0.2, 0.3, 0.4]
print(f">>> Observable: {observable.paulis}")
>>> Observable: ['IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...', ...]
Ang circuit at observable ay kailangang i-transform para gumamit lamang ng mga instruction na sinusuportahan ng QPU (tinutukoy bilang instruction set architecture (ISA) circuits). Gagamitin natin ang Transpiler para dito.
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('rz', 3826), ('sx', 1601), ('cz', 968)])
3. I-initialize ang Qiskit Runtime Estimator​
Kapag ini-initialize mo ang Estimator, gamitin ang parameter na mode para tukuyin ang mode na gusto mong patakbuhin ito. Ang mga posibleng value ay batch, session, o backend objects para sa batch, session, at job execution mode, ayon sa pagkakasunod. Para sa karagdagang impormasyon, tingnan ang Introduction to Qiskit Runtime execution modes.
from qiskit_ibm_runtime import EstimatorV2 as Estimator
estimator = Estimator(mode=backend)
4. I-invoke ang Estimator at kunin ang mga resulta​
Susunod, i-invoke ang method na run() para kalkulahin ang mga expectation value para sa mga input circuit at observable. Ang circuit, observable, at optional na mga parameter value set ay ini-input bilang mga primitive unified bloc (PUB) tuple.
job = estimator.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: d5k96c4jt3vs73ds5smg
>>> Job Status: QUEUED
result = job.result()
print(f">>> {result}")
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")
>>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
> Expectation value: 25.8930784649363
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
Magsimula sa Sampler​
1. I-initialize ang account​
Dahil ang Qiskit Runtime Sampler ay isang managed service, kailangan mo munang i-initialize ang iyong account. Pagkatapos ay maaari kang pumili ng QPU na gusto mong gamitin para kalkulahin ang expectation value.
Sundin ang mga hakbang sa Install and set up topic kung wala ka pang naka-set up na account.
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
2. Gumawa ng circuit​
Kailangan mo ng kahit isang circuit bilang input sa Sampler primitive.
import numpy as np
from qiskit.circuit.library import efficient_su2
circuit = efficient_su2(127, entanglement="linear")
circuit.measure_all()
# The circuit is parametrized, so we will define the parameter values for execution
param_values = np.random.rand(circuit.num_parameters)
Gamitin ang Transpiler para makakuha ng ISA circuit.
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")
>>> Circuit ops (ISA): OrderedDict([('sx', 3089), ('rz', 3036), ('cz', 1092), ('measure', 127), ('barrier', 1)])
3. I-initialize ang Qiskit Runtime Sampler​
Kapag ini-initialize mo ang Sampler, gamitin ang parameter na mode para tukuyin ang mode na gusto mong patakbuhin ito. Ang mga posibleng value ay batch, session, o backend objects para sa batch, session, at job execution mode, ayon sa pagkakasunod. Para sa karagdagang impormasyon, tingnan ang Introduction to Qiskit Runtime execution modes. Tandaan na ang mga Open Plan user ay hindi maaaring mag-submit ng mga session job.
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
4. I-invoke ang Sampler at kunin ang mga resulta​
Susunod, i-invoke ang method na run() para makabuo ng output. Ang circuit at optional na mga parameter value set ay ini-input bilang mga primitive unified bloc (PUB) tuple.
job = sampler.run([(isa_circuit, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")
>>> Job ID: d5k96rsjt3vs73ds5tig
>>> Job Status: QUEUED
result = job.result()
# Get results for the first (and only) PUB
pub_result = result[0]
print(
f"First ten results for the 'meas' output register: {pub_result.data.meas.get_bitstrings()[:10]}"
)
First ten results for the 'meas' output register: ['0101001101010000011001110001011000010010001100001000100110011111011110000010110001101000110011101010000100011011000110101111000', '0100111000000100110001100100000101111000111001101000110111101110110010010100001101001111001010011101010000010011000110000010001', '0101111101111111010011010101000000110100000010000010011101100011100011001100000100100001000101000000100001010101010011001101100', '1100110101111111001110010000010100101010101010001000001100100110011111010000000010001000110111010000010101100000100000110111001', '0010000001111001111010100100010111101000101000100000101100001000011100000100011010110110100011100110001001110110111101010011000', '0101110000001000100100010010100100111000010100000000010010000000010110010010000110000001110110010100000111001110100100111101100', '0100011111101001000111110011011101101101110101110001010111011101111110011101001000000001110000011110000101010000001010000100000', '0001010101011000110100000100111111100001011000111110000011000111001101010000010001001100000110000000100000110101010010101110010', '0100011010001110011110000110100101100100101001001111010100100101010100010000000010100000101010110010000000001000010101011111110', '0000011000000111000001000101111111110110101100110000001100010010011101011100001010000100011010001010001101000000000000010001001']
Magsimula sa mga backend primitive​
Hindi tulad ng mga provider-specific primitive, ang mga backend primitive ay mga generic na implementasyon na maaaring gamitin sa anumang arbitrary na
backend object, basta't isinasagawa nito ang Backend interface.
- Ang Sampler primitive ay maaaring patakbuhin sa anumang provider sa pamamagitan ng
qiskit.primitives.BackendSamplerV2. - Ang Estimator primitive ay maaaring patakbuhin sa anumang provider sa pamamagitan ng
qiskit.primitives.BackendEstimatorV2.
Ang ilang mga provider ay natively nagpapatupad ng mga primitive. Tingnan ang Qiskit Ecosystem page para sa mga detalye.
Halimbawa: BackendEstimator​
from qiskit.primitives import BackendEstimatorV2
from <some_qiskit_provider> import QiskitProvider
provider = QiskitProvider()
backend = provider.get_backend('backend_name')
estimator = BackendEstimatorV2(backend)
Halimbawa: BackendSampler​
from qiskit.primitives import BackendSamplerV2
from <some_qiskit_provider> import QiskitProvider
provider = QiskitProvider()
backend = provider.get_backend('backend_name')
sampler = BackendSamplerV2(backend)
Mga pagkakatulad at pagkakaiba ng backend at Runtime primitives​
-
Ang mga input at output ng
qiskit.primitives.BackendSamplerV2atqiskit.primitives.BackendEstimatorV2ay sumusunod sa parehong PUB format ng mga primitive sa Qiskit Runtime. Tingnan ang Primitive inputs and outputs para sa mga detalye. Gayunpaman, maaaring may mga pagkakaiba sa mga field ng ibinalik na metadata. -
Ang klase na
qiskit.primitives.BackendEstimatorV2ay hindi nag-aalok ng anumang measurement o gate error mitigation implementations out-of-the-box, dahil ang mga backend primitive ay idinisenyo para tumakbo nang lokal sa makina ng user. -
Ang klase na
qiskit.primitives.BackendSamplerV2ay nangangailangan ng backend na sumusuporta sa opsyongmemory. -
Ang mga backend primitive interface ay naglalantad ng custom na
SamplerV2atEstimatorV2na mgaOptionsna iba sa mga Runtime implementation.
Mga susunod na hakbang​
- Alamin kung paano subukan nang lokal bago tumakbo sa mga quantum computer.
- Suriin ang mga detalyadong halimbawa ng primitives.
- Magsanay sa mga primitive sa pamamagitan ng pagtapos ng Cost function lesson sa IBM Quantum Learning.
- Alamin kung paano mag-transpile nang lokal sa seksyong Transpile.
- Subukan ang gabay na Compare transpiler settings.
- Alamin kung paano gamitin ang mga primitive option.
- Tingnan ang API para sa mga opsyon ng Sampler at Estimator.
- Basahin ang Migrate to V2 primitives.