Skip to main contentIBM Quantum Documentation

StatevectorEstimator

qiskit.primitives.StatevectorEstimator(*, default_precision=0.0, seed=None)

GitHub(opens in a new tab)

Bases: BaseEstimatorV2

Simple implementation of BaseEstimatorV2 with full state vector simulation.

This class is implemented via Statevector which turns provided circuits into pure state vectors. These states are subsequently acted on by :class:~.SparsePauliOp`, which implies that, at present, this implementation is only compatible with Pauli-based observables.

Each tuple of (circuit, observables, <optional> parameter values, <optional> precision), called an estimator primitive unified bloc (PUB), produces its own array-based result. The run() method can be given a sequence of pubs to run in one call.

from qiskit.circuit import Parameter, QuantumCircuit
from qiskit.primitives import StatevectorEstimator
from qiskit.quantum_info import Pauli, SparsePauliOp
 
import matplotlib.pyplot as plt
import numpy as np
 
# Define a circuit with two parameters.
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.ry(Parameter("a"), 0)
circuit.rz(Parameter("b"), 0)
circuit.cx(0, 1)
circuit.h(0)
 
# Define a sweep over parameter values, where the second axis is over
# the two parameters in the circuit.
params = np.vstack([
    np.linspace(-np.pi, np.pi, 100),
    np.linspace(-4 * np.pi, 4 * np.pi, 100)
]).T
 
# Define three observables. Many formats are supported here including
# classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1
# lists cause this array of observables to have shape (3, 1), rather
# than shape (3,) if they were omitted.
observables = [
    [SparsePauliOp(["XX", "IY"], [0.5, 0.5])],
    [Pauli("XX")],
    [Pauli("IY")]
]
 
# Instantiate a new statevector simulation based estimator object.
estimator = StatevectorEstimator()
 
# Estimate the expectation value for all 300 combinations of
# observables and parameter values, where the pub result will have
# shape (3, 100). This shape is due to our array of parameter
# bindings having shape (100,), combined with our array of observables
# having shape (3, 1)
pub = (circuit, observables, params)
job = estimator.run([pub])
 
# Extract the result for the 0th pub (this example only has one pub).
result = job.result()[0]
 
# Error-bar information is also available, but the error is 0
# for this StatevectorEstimator.
result.data.stds
 
# Pull out the array-based expectation value estimate data from the
# result and plot a trace for each observable.
for idx, pauli in enumerate(observables):
    plt.plot(result.data.evs[idx], label=pauli)
plt.legend()
../_images/qiskit-primitives-StatevectorEstimator-1.png

Parameters

  • default_precision (float(opens in a new tab)) – The default precision for the estimator if not specified during run.
  • seed (np.random.Generator | int(opens in a new tab) | None) – The seed or Generator object for random number generation. If None, a random seeded default RNG will be used.

Attributes

default_precision

Return the default precision

seed

Return the seed or Generator object for random number generation.


Methods

run

run(pubs, *, precision=None)

GitHub(opens in a new tab)

Estimate expectation values for each provided pub (Primitive Unified Bloc).

Parameters

  • pubs (Iterable[EstimatorPubLike]) – An iterable of pub-like objects, such as tuples (circuit, observables) or (circuit, observables, parameter_values).
  • precision (float(opens in a new tab) | None) – The target precision for expectation value estimates of each run Estimator Pub that does not specify its own precision. If None the estimator’s default precision value will be used.

Returns

A job object that contains results.

Return type

PrimitiveJob[PrimitiveResult[PubResult]]

Was this page helpful?
Report a bug or request content on GitHub.