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 FakeCasablanca
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 = FakeCasablanca()
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.78886881, 1.79576905, 1.78710008, 1.80213407, 1.78320833,
       1.7950349 , 1.60849616, 1.79070841, 1.79370376, 1.55090941])

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

quasis.expval_and_stddev('IZIZIZ')
[(0.019535442094597122, 0.021147510534992007),
 (0.04107061194444628, 0.021188257633787722),
 (0.015958834808163236, 0.021137053251165668),
 (0.05485802389916988, 0.02122577484257959),
 (0.021555171871815604, 0.021114025757477114),
 (0.0446445148685744, 0.021183926128484926),
 (0.013903153895045206, 0.020053030690430833),
 (0.03815778210955251, 0.02115838139545779),
 (0.015640363896900766, 0.02117606999974052),
 (0.027811721483754714, 0.019690793588409593)]