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.8458748, 1.8392448, 1.8545539, 1.8595868, 1.8557866, 1.8570733,
       1.8582106, 1.8280498, 1.83839  , 1.844856 ], dtype=float32)

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

quasis.expval_and_stddev('IZIZIZ')
[(0.021070122718811035, 0.02148182265858956),
 (0.0207061767578125, 0.021443209229624626),
 (0.03976649045944214, 0.021532266321992132),
 (0.03831237554550171, 0.021561463844851664),
 (0.0070178210735321045, 0.021539420642264155),
 (0.03233566880226135, 0.021546887015903952),
 (-0.014029055833816528, 0.021553483053951338),
 (0.03749316930770874, 0.021377849694146703),
 (0.024328887462615967, 0.02143822511689138),
 (0.021245360374450684, 0.021475893904040085)]