Skip to main content
IBM Quantum Platform

Exemples d'estimateurs

  • Le code présenté sur cette page a été développé en tenant compte des exigences suivantes. Nous vous recommandons d'utiliser ces versions ou des versions plus récentes.

    qiskit[all]~=2.5.1
    qiskit-ibm-runtime~=0.47.0
    

Les exemples présentés dans cette section illustrent quelques façons courantes d'utiliser Estimator. Avant d'exécuter ces exemples, suivez les instructions de la section « Installation de Qiskit ».

Note

Ces exemples utilisent tous les primitives de type « IBM Quantum », mais vous pourriez utiliser les primitives de base à la place.

Calculez et interprétez efficacement les valeurs attendues des opérateurs quantiques nécessaires à de nombreux algorithmes grâce à Estimator. Découvrez ses applications dans la modélisation moléculaire, l'apprentissage automatique et les problèmes d'optimisation complexes.


Lancer une seule expérience

Utilisez Estimator pour déterminer la valeur attendue d'un couple circuit-observable.

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}

Exécuter plusieurs expériences dans un seul travail

Utilisez Estimator pour déterminer les valeurs attendues de plusieurs paires circuit-observable.

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

Exécuter des circuits paramétrés

Utilisez Estimator pour exécuter trois expériences dans un seul travail, en exploitant les valeurs des paramètres afin d'améliorer la réutilisabilité des circuits.

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}

Utiliser les traitements par lots et les options avancées

Découvrez le mode d'exécution par lots et les options avancées pour optimiser les performances des circuits sur les QPU.

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}

Etapes suivantes

Recommandations
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.