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()
}