Exemplos de amostras
O código desta página foi desenvolvido com base nos seguintes requisitos. Recomendamos usar essas versões ou versões mais recentes.
qiskit[all]~=2.5.1 qiskit-ibm-runtime~=0.47.0
Gerar distribuições de quase-probabilidade completas, com mitigação de erros, a partir de amostras das saídas de circuitos quânticos. Aproveite os recursos do Sampler para algoritmos de pesquisa e classificação, como o Grover e o QVSM.
Executar um único experimento
Use o Sampler para retornar o resultado da medição como sequências de bits ou contagens de um único circuito.
import numpy as np
from qiskit.circuit.library import iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import random_hermitian
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
n_qubits = 127
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=n_qubits
)
mat = np.real(random_hermitian(n_qubits, seed=1234))
circuit = iqp(mat)
circuit.measure_all()
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
sampler = Sampler(backend)
job = sampler.run([isa_circuit])
result = job.result()
# Get results for the first (and only) PUB
pub_result = result[0]
print(f" > First ten results: {pub_result.data.meas.get_bitstrings()[:10]}")Output:
> First ten results: ['1111010010110011001010101100010100001010110000100110111000000000100011100000001101110110001010000100000000010000000011000110101', '1001001111111001011011011011001010100101010000001101000010101101010000011100000000100100010000001000010000001010001001010101111', '0100001101111001110000000001000101101010001000010110111100011000100000010101101110001000010001111110001000100010011110000001100', '1000101001100101010000100001000101101010000011001110101111100010111011010110001010101010011011000001100000000010100100010100111', '1100011110101010000000011000100000100001110101011011100011011000111111110010000101000000000101011100001000100101000000000100001', '0000001100000000101100000000110100101011110100101101100110000000100110001110100000010010100000011101011001000000001011000100101', '1000001100110111001110100011101000111111101100110011100000000000000100001000100101100110000000100101000101001001110000001110000', '1100001000101000101100010011010101001010110010101000110111010100000100000011110000110011010110011010110010000000000000000000101', '0111010011101111010010000011010010001000000000010100000001001010001111100000100101000101000111110010101010100000101000100101011', '0100001000101010110010100111110100101001011111000011111010100110011000100001100000111101100101000000010010010000011110001011000']
Execute várias experiências em uma única tarefa
Use o Sampler para retornar os resultados das medições como sequências de bits ou contagens de vários circuitos em uma única tarefa.
import numpy as np
from qiskit.circuit.library import iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import random_hermitian
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
n_qubits = 127
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=n_qubits
)
rng = np.random.default_rng()
mats = [np.real(random_hermitian(n_qubits, seed=rng)) for _ in range(3)]
circuits = [iqp(mat) for mat in mats]
for circuit in circuits:
circuit.measure_all()
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuits = pm.run(circuits)
sampler = Sampler(mode=backend)
job = sampler.run(isa_circuits)
result = job.result()
for idx, pub_result in enumerate(result):
print(
f" > First five results for pub {idx}: "
f"{pub_result.data.meas.get_bitstrings()[:5]}"
)Output:
> First five results for pub 0: ['0101000101101010001010110001000101011010001000011001101011100011010001000000011001010110011001100000010001000001000100001111011', '0001010011100000101110011011110001110001000101000101011100101101010001000110101000001000101010000001000001000101101100000101000', '0100100110010110000000101011101100011000000101111110111111010001010000000010000010101110100101100111000101100010100111000010100', '1001011100111110000100011111110001011001100100001010000101010000111010000001100111110001101101001010110100000001010000010110000', '0001101101111010100001110101000011100001100001011101110100000110100001001101011110111011001011000101010110000010000111000001100']
> First five results for pub 1: ['1111011001010000011101010001110000011000100000000001101010100000001100001001011010000100110100110111000001011000010010000000110', '0100111011011010011111101001110101101000100000000011111101011000100010000001110110010011000111010000100010101001011001001101110', '0110001000111101001000101000101000010010100010010000011011110001111010000000011010100000110000010000111101000010001001000100100', '1110110111110000010111101000111000100011110110011001100011000101000111110001001010000110100000011001100011101100000000000101010', '1000010011110101101101111100011000100101001011110010000101011100010111101100111001101111111111010100011010110100011000100100001']
> First five results for pub 2: ['0100010111001111010001100100111010110000001000110000111010111001000011101110000110110010010000001000100100000010101000000001100', '0000110110001001100000001000101000001101010100011010111000101011011110000101011010000110000000000100000001010110010010000000001', '0001000111100100110100101100011011000010100001000100100000010001101110000000010101100111100100111101010111111001100101100010010', '0011110010110101011001111100000101000010001111000101100000001100110011111000000100010010101110111001011100000000001010000001001', '1110000001000100001010011100110100011110101010100100111111000110010111000001001100111000101001001100011011010010111000101000011']
Executar circuitos parametrizados
Execute várias experiências em uma única tarefa, utilizando valores de parâmetros para aumentar a reutilização dos circuitos.
import numpy as np
from qiskit.circuit.library import real_amplitudes
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
n_qubits = 127
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=n_qubits
)
# Step 1: Map classical inputs to a quantum problem
circuit = real_amplitudes(num_qubits=n_qubits, reps=2)
circuit.measure_all()
# Define three sets of parameters for the circuit
rng = np.random.default_rng(1234)
parameter_values = [
rng.uniform(-np.pi, np.pi, size=circuit.num_parameters) for _ in range(3)
]
# Step 2: Optimize problem for quantum execution.
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
# Step 3: Execute using IBM Quantum primitives.
sampler = Sampler(backend)
job = sampler.run([(isa_circuit, parameter_values)])
result = job.result()
# Get results for the first (and only) PUB
pub_result = result[0]
# Get counts from the classical register "meas".
print(
f" >> First five results for the meas output register: "
f"{pub_result.data.meas.get_bitstrings()[:5]}"
)Output:
>> First five results for the meas output register: ['1001010001111101000000100001100110000001110001011100011001110011101111001110110100110101011001100100011001110001110011011100011', '1000101001000011110100010010001111101110000001111100001010100000100000100110101111110011000000111001010100110001011011101001111', '0110111100011101011000100011000011000010110110000100101100010101111001101011111110011111100000100011111001101101001111011110101', '0110111011101011011111000100000011110011010000010000100110000011101000111100011100100110111000110100111000101011111100010100111', '0000001110100110101011011110110011111100011111001011010101111100000010111110010100001110001001110000001011110011001001000001111']
Use lotes e opções avançadas
Explore o modo de execução em lote e as opções avançadas para otimizar o desempenho dos circuitos nas QPUs.
import numpy as np
from qiskit.circuit.library import iqp
from qiskit.quantum_info import random_hermitian
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import Batch, SamplerV2 as Sampler
from qiskit_ibm_runtime import QiskitRuntimeService
n_qubits = 127
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=n_qubits
)
rng = np.random.default_rng(1234)
mat = np.real(random_hermitian(n_qubits, seed=rng))
circuit = iqp(mat)
circuit.measure_all()
mat = np.real(random_hermitian(n_qubits, seed=rng))
another_circuit = iqp(mat)
another_circuit.measure_all()
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
another_isa_circuit = pm.run(another_circuit)
# The context manager automatically closes the batch.
with Batch(backend=backend) as batch:
sampler = Sampler(mode=batch)
job = sampler.run([isa_circuit])
another_job = sampler.run([another_isa_circuit])
result = job.result()
another_result = another_job.result()
# first job
print(
f" > The first five measurement results of job 1: "
f"{result[0].data.meas.get_bitstrings()[:5]}"
)Output:
> The first five measurement results of job 1: ['1001001101100100001000001111101111001011010010010110110001110000000101010010001101001111000010110010101011001110110111001000100', '0100000111100101000010001110100001000011000011010000100001011000001001010111110100010000111101011100000100001110010110110001010', '1100011001000001101101000000000111001011110101110100001001000001001001100000101010010000000000110011000000011010011011100001111', '0011111111110001010010101111110111000010100001010000011101100010011011110001001000001100101000010100101010100010001001010001010', '1001111101110101010101110110011101111010011101000101110100011011110100000100100100110001001110101000000100101001001111000001010']
# second job
print(
" > The first five measurement results of job 2:",
another_result[0].data.meas.get_bitstrings()[:5],
)Output:
> The first five measurement results of job 2: ['1111111110000001000111010010010101010010111001110111001000100000010011101110101101001010001010000000000100011000010001000010000', '1110011100110100100100111001000101010011110001010110100100001110010010011100000000000100000010001001010100011110010000001011100', '1111101001010011110011011010000111000010001101100101000100000110000011001110001101100100100100100010011100001000000000100111010', '1100010101000011101000110100000101001000110110010100000000001000010110100110000111010101010010001101010010100000100111010110000', '1010100100100110011100010010100000101101101101000111000010101110010111010100001111000001100010100011110000000011101000101001100']
Próximas etapas
- Especifique opções avançadas de tempo de execução.
- Pratique com primitivas seguindo a lição sobre a função
Costem IBM Quantum Learning. - Saiba como fazer a transpilagem localmente na seção Transpilagem.
- Consulte o guia de comparação de configurações do transpiler.
- Entenda os limites da tarefa ao enviar uma tarefa para uma QPU do IBM®.