How to generate exact quasiprobability distributions from SamplerΒΆ

This how-to guide is intended to show users how they can generate statevector-based quasiprobability distributions through the qiskit.primitives.BaseSampler interface.

[1]:
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp

from qiskit_addon_cutting import (
    partition_problem,
    generate_cutting_experiments,
)
/tmp/ipykernel_3415/794328953.py:1: DeprecationWarning: Using Qiskit with Python 3.9 is deprecated as of the 2.1.0 release. Support for running Qiskit with Python 3.9 will be removed in the 2.3.0 release, which coincides with when Python 3.9 goes end of life.
  from qiskit import QuantumCircuit

Prepare inputs to generate_cutting_experiments

[2]:
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
observable = SparsePauliOp(["ZZ"])
partitioned_problem = partition_problem(
    circuit=circuit, partition_labels="AB", observables=observable.paulis
)
subcircuits = partitioned_problem.subcircuits
subobservables = partitioned_problem.subobservables

Call generate_cutting_experiments

[3]:
subexperiments, coefficients = generate_cutting_experiments(
    circuits=subcircuits,
    observables=subobservables,
    num_samples=1000,
)

In order to calculate exact quasiprobability distributions for circuits with mid-circuit measurements, users will need to use the ExactSampler class from qiskit_addon_cutting.utils.simulation. The Qiskit Samplers do not support mid-circuit measurements in statevector mode.

[4]:
from qiskit_addon_cutting.utils.simulation import ExactSampler

exact_sampler = ExactSampler()

If ExactSampler is used, the quasiprobability distributions returned from generate_cutting_experiments will be exact and generated from the statevectors of the subexperiments.

[5]:
results = {
    label: exact_sampler.run(subexperiment).result()
    for label, subexperiment in subexperiments.items()
}