Using distribution collections¶

When you mitigate over multiple circuits the return object is a mthree.classes.QuasiCollection

from qiskit import *
from qiskit_ibm_runtime.fake_provider import FakeCasablancaV2
import mthree

qc = QuantumCircuit(6)
qc.reset(range(6))
qc.h(3)
qc.cx(3,1)
qc.cx(3,5)
qc.cx(1,0)
qc.cx(5,4)
qc.cx(1,2)
qc.measure_all()

backend = FakeCasablancaV2()
mit = mthree.M3Mitigation(backend)
mit.cals_from_system(range(6))

trans_qc = transpile([qc]*10, backend)
raw_counts = backend.run(trans_qc, shots=4000).result().get_counts()

quasis = mit.apply_correction(raw_counts, range(6), return_mitigation_overhead=True)
type(quasis)
mthree.classes.QuasiCollection

QuasiCollection objects allow one to work with multiple distributions in the same manner as a single one. E.g. we can get the mitigation overhead of the whole collection

quasis.mitigation_overhead
array([1.8057809, 1.7998344, 1.794854 , 1.8044356, 1.7977172, 1.7929194,
       1.791221 , 1.8050765, 1.7874779, 1.8009642], dtype=float32)

or compute expectation values and standard deviations over the full set:

quasis.expval_and_stddev('IZIZIZ')
[(0.0476345419883728, 0.02124724015176704),
 (0.04975694417953491, 0.021212227327304614),
 (0.04332289099693298, 0.021182858577604886),
 (0.04009062051773071, 0.02123932464267371),
 (0.07067936658859253, 0.021199748027359445),
 (0.01496008038520813, 0.02117143949545417),
 (0.027989208698272705, 0.021161409829817384),
 (0.022048354148864746, 0.021243095609918217),
 (0.026659131050109863, 0.021139287383494902),
 (0.031759798526763916, 0.021218884822754743)]