Lumaktaw sa pangunahing nilalaman

Magsimula sa mga primitive

Bagong execution model, nasa beta release na

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.

tala

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.

Paggamit ng Fractional Gates

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 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​

Mga susunod na hakbang​

Mga Rekomendasyon