QrStatevectorSampler module

class QrStatevectorSampler

Simple implementation of BaseSamplerV2 using full state vector simulation.

This class is implemented via Statevector which turns provided circuits into pure state vectors, and is therefore incompatible with mid-circuit measurements (although other implementations may be).

As seen in the example below, this sampler supports providing arrays of parameter value sets to bind against a single circuit.

Each tuple of (circuit, <optional> parameter values, <optional> shots), called a sampler primitive unified bloc (PUB), produces its own array-valued result. The run() method can be given many pubs at once.

from qiskit.circuit import (
    Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister
)
from qiskit.primitives import StatevectorSampler

import matplotlib.pyplot as plt
import numpy as np

# Define our circuit registers, including classical registers
# called 'alpha' and 'beta'.
qreg = QuantumRegister(3)
alpha = ClassicalRegister(2, "alpha")
beta = ClassicalRegister(1, "beta")

# Define a quantum circuit with two parameters.
circuit = QuantumCircuit(qreg, alpha, beta)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.ry(Parameter("a"), 0)
circuit.rz(Parameter("b"), 0)
circuit.cx(1, 2)
circuit.cx(0, 1)
circuit.h(0)
circuit.measure([0, 1], alpha)
circuit.measure([2], beta)

# 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

# Instantiate a new statevector simulation based sampler object.
sampler = StatevectorSampler()

# Start a job that will return shots for all 100 parameter value sets.
pub = (circuit, params)
job = sampler.run([pub], shots=256)

# Extract the result for the 0th pub (this example only has one pub).
result = job.result()[0]

# There is one BitArray object for each ClassicalRegister in the
# circuit. Here, we can see that the BitArray for alpha contains data
# for all 100 sweep points, and that it is indeed storing data for 2
# bits over 256 shots.
assert result.data.alpha.shape == (100,)
assert result.data.alpha.num_bits == 2
assert result.data.alpha.num_shots == 256

# We can work directly with a binary array in performant applications.
raw = result.data.alpha.array

# For small registers where it is anticipated to have many counts
# associated with the same bitstrings, we can turn the data from,
# for example, the 22nd sweep index into a dictionary of counts.
counts = result.data.alpha.get_counts(22)

# Or, convert into a list of bitstrings that preserve shot order.
bitstrings = result.data.alpha.get_bitstrings(22)
print(bitstrings)
QrStatevectorSampler(default_shots, seed)
Args:
default_shots: The default shots for the sampler if not specified during run.
seed: Not used.
run(pubs, shots)
Args:
pubs: The pubs to be executed.
shots: number of shots for the pubs
Returns:
PrimitiveJob: The primitive job object containing the array of PrimitiveResult of SamplerPubResult.