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 circuit_knitting.cutting import (
    partition_problem,
    generate_cutting_experiments,
)

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 circuit_knitting.utils.simulation. The Qiskit Samplers do not support mid-circuit measurements in statevector mode.

[4]:
from circuit_knitting.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()
}