Skip to main content
IBM Quantum Platform

Exemplos de estimadores

  • 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
    

Os exemplos desta seção ilustram algumas formas comuns de usar o Estimator. Antes de executar estes exemplos, siga as instruções em Instalar o Qiskit.

Note

Todos esses exemplos utilizam as primitivas do tipo IBM Quantum, mas você também pode usar as primitivas básicas.

Calcule e interprete com eficiência os valores esperados dos operadores quânticos necessários para muitos algoritmos com o Estimator. Explore as aplicações em modelagem molecular, aprendizado de máquina e problemas complexos de otimização.


Executar um único experimento

Use o Estimador para determinar o valor esperado de um único par circuito-observável.

import numpy as np
from qiskit.circuit.library import iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp, random_hermitian
from qiskit_ibm_runtime import QiskitRuntimeService, EstimatorV2 as Estimator

n_qubits = 50

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)
observable = SparsePauliOp("Z" * 50)

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)

estimator = Estimator(mode=backend)
job = estimator.run([(isa_circuit, isa_observable)])
result = job.result()

print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")

Output:

 > Expectation value: -0.008839779005524863
 > Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}

Execute várias experiências em uma única tarefa

Use o Estimator para determinar os valores esperados de vários pares de variáveis observáveis do circuito.

import numpy as np
from qiskit.circuit.library import iqp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp, random_hermitian
from qiskit_ibm_runtime import QiskitRuntimeService, EstimatorV2 as Estimator

n_qubits = 50

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)]

pubs = []
circuits = [iqp(mat) for mat in mats]
observables = [
    SparsePauliOp("X" * 50),
    SparsePauliOp("Y" * 50),
    SparsePauliOp("Z" * 50),
]

# Get ISA circuits
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)

for qc, obs in zip(circuits, observables):
    isa_circuit = pm.run(qc)
    isa_obs = obs.apply_layout(isa_circuit.layout)
    pubs.append((isa_circuit, isa_obs))

estimator = Estimator(backend)
job = estimator.run(pubs)
job_result = job.result()

for idx in range(len(pubs)):
    pub_result = job_result[idx]
    print(f">>> Expectation values for PUB {idx}: {pub_result.data.evs}")
    print(f">>> Standard errors for PUB {idx}: {pub_result.data.stds}")

Output:

>>> Expectation values for PUB 0: 0.9937888198757764
>>> Standard errors for PUB 0: 1.7873718562576024
>>> Expectation values for PUB 1: -0.1038961038961039
>>> Standard errors for PUB 1: 1.3378580728628524
>>> Expectation values for PUB 2: -0.6753246753246753
>>> Standard errors for PUB 2: 1.7025095006727553

Executar circuitos parametrizados

Use o Estimator para executar três experimentos em uma única tarefa, aproveitando os valores dos parâmetros para aumentar a reutilização dos circuitos.

import numpy as np

from qiskit.circuit import QuantumCircuit, Parameter
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService, EstimatorV2 as Estimator

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

# Step 1: Map classical inputs to a quantum problem
theta = Parameter("θ")

chsh_circuit = QuantumCircuit(2)
chsh_circuit.h(0)
chsh_circuit.cx(0, 1)
chsh_circuit.ry(theta, 0)

number_of_phases = 21
phases = np.linspace(0, 2 * np.pi, number_of_phases)
individual_phases = [[ph] for ph in phases]

ZZ = SparsePauliOp.from_list([("ZZ", 1)])
ZX = SparsePauliOp.from_list([("ZX", 1)])
XZ = SparsePauliOp.from_list([("XZ", 1)])
XX = SparsePauliOp.from_list([("XX", 1)])
ops = [ZZ, ZX, XZ, XX]

# Step 2: Optimize problem for quantum execution.

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
chsh_isa_circuit = pm.run(chsh_circuit)
isa_observables = [
    operator.apply_layout(chsh_isa_circuit.layout) for operator in ops
]

# Step 3: Execute using IBM Quantum primitives.

# Reshape observable array for broadcasting
reshaped_ops = np.fromiter(isa_observables, dtype=object)
reshaped_ops = reshaped_ops.reshape((4, 1))

estimator = Estimator(backend, options={"default_shots": int(1e4)})
job = estimator.run([(chsh_isa_circuit, reshaped_ops, individual_phases)])
# Get results for the first (and only) PUB
pub_result = job.result()[0]
print(f">>> Expectation values: {pub_result.data.evs}")
print(f">>> Standard errors: {pub_result.data.stds}")
print(f">>> Metadata: {pub_result.metadata}")

Output:

>>> Expectation values: [[ 9.89263974e-01  9.41062225e-01  7.87637085e-01  5.83548830e-01
   3.06029826e-01 -7.99943914e-03 -3.11567899e-01 -5.91343155e-01
  -8.05892215e-01 -9.36139493e-01 -9.88853746e-01 -9.42703136e-01
  -8.10609833e-01 -5.90522700e-01 -3.15465062e-01 -5.94830090e-03
   2.90851403e-01  5.85805082e-01  8.02200166e-01  9.41882681e-01
   9.90494657e-01]
 [ 9.23012209e-03  3.12183240e-01  6.00163049e-01  8.02405280e-01
   9.48446323e-01  9.84956584e-01  9.42703136e-01  8.05071760e-01
   5.92984066e-01  3.07055395e-01 -3.07670736e-03 -3.18131541e-01
  -5.60165854e-01 -7.94200727e-01 -9.43728705e-01 -9.91315112e-01
  -9.39626428e-01 -8.03430849e-01 -5.79446553e-01 -3.04799143e-01
  -4.92273178e-03]
 [ 8.20455297e-03 -3.00696866e-01 -5.99752822e-01 -8.11635402e-01
  -9.45574729e-01 -9.92340681e-01 -9.40036656e-01 -8.00354142e-01
  -5.82113033e-01 -2.90441175e-01  1.84602442e-03  3.24284956e-01
   5.64883472e-01  8.04866646e-01  9.44138933e-01  9.93366250e-01
   9.48651437e-01  7.87842199e-01  5.58730057e-01  3.16490631e-01
  -6.97387002e-03]
 [ 9.91930454e-01  9.40446884e-01  7.89483109e-01  5.52986870e-01
   2.97209931e-01  2.25625207e-03 -3.11567899e-01 -5.92984066e-01
  -8.08353581e-01 -9.48036095e-01 -9.90699771e-01 -9.42498022e-01
  -8.09584264e-01 -5.96265887e-01 -3.07055395e-01 -2.05113824e-04
   3.02132663e-01  5.95240318e-01  7.93995613e-01  9.42703136e-01
   9.93776478e-01]]
>>> Standard errors: [[0.00312841 0.00403472 0.00759426 0.00833516 0.01030326 0.01122794
  0.01128844 0.00813687 0.00865973 0.00513426 0.00345264 0.00388667
  0.00736782 0.01026783 0.01038179 0.01246262 0.01191826 0.01081814
  0.00850225 0.00496315 0.00269764]
 [0.01123964 0.01177892 0.00819503 0.0073663  0.00427303 0.00289125
  0.00435623 0.0066848  0.01140235 0.00993107 0.00840459 0.00821741
  0.0097656  0.0082026  0.00506637 0.00357209 0.0041762  0.00767615
  0.00831383 0.01094546 0.01373803]
 [0.0121451  0.01227001 0.00831633 0.00691503 0.00385729 0.00267653
  0.00454884 0.00722136 0.01080783 0.0098484  0.01141928 0.01035556
  0.00804047 0.0058858  0.00398198 0.00281015 0.00501157 0.00714316
  0.00954163 0.00878997 0.01213102]
 [0.00290704 0.0047878  0.00638958 0.00768626 0.00875767 0.00887984
  0.01145493 0.00904896 0.00599187 0.00482709 0.00298048 0.00428419
  0.00690245 0.00855953 0.00997334 0.00862447 0.00870133 0.00872892
  0.00487633 0.00504538 0.00311229]]
>>> Metadata: {'shots': 10016, 'target_precision': 0.01, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}

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.transpiler import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp, random_hermitian
from qiskit_ibm_runtime import (
    QiskitRuntimeService,
    Batch,
    EstimatorV2 as Estimator,
)

n_qubits = 15

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)
mat = np.real(random_hermitian(n_qubits, seed=rng))
another_circuit = iqp(mat)
observable = SparsePauliOp("X" * n_qubits)
another_observable = SparsePauliOp("Y" * n_qubits)

pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
another_isa_circuit = pm.run(another_circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
another_isa_observable = another_observable.apply_layout(
    another_isa_circuit.layout
)

# The context manager automatically closes the batch.
with Batch(backend=backend) as batch:
    estimator = Estimator(mode=batch)

    estimator.options.resilience_level = 1

    job = estimator.run([(isa_circuit, isa_observable)])
    another_job = estimator.run(
        [(another_isa_circuit, another_isa_observable)]
    )
    result = job.result()
    another_result = another_job.result()

    # first job
    print(f" > Expectation value: {result[0].data.evs}")
    print(f" > Metadata: {result[0].metadata}")

    # second job
    print(f" > Another Expectation value: {another_result[0].data.evs}")
    print(f" > More Metadata: {another_result[0].metadata}")

Output:

 > Expectation value: 0.025219391667376672
 > Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
 > Another Expectation value: 0.002376355265112134
 > More Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}

Próximas etapas

Recomendações
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.