Converting to probabilites¶

M3 natively works with quasi-probability distributions; distributions that contain negative values but nonetheless sum to one. This is useful for mitigating expectation values, but there could be situations where a true probability distribution is useful / needed. To this end, it is possible to find the closest probability distribution to a quasi-probability distribution in terms of \(L2\)-norm using: mthree.classes.QuasiDistribution.nearest_probability_distribution(). This conversion is done in linear time.

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, backend)
raw_counts = backend.run(trans_qc, shots=8192).result().get_counts()

quasis = mit.apply_correction(raw_counts, range(6))

# Here is where the conversion happens
quasis.nearest_probability_distribution()
{'100010': 4.942751922535623e-06,
 '010001': 2.212357862531214e-05,
 '110110': 3.234357778742817e-05,
 '010111': 3.3429367871775896e-05,
 '100110': 3.500512448030686e-05,
 '010011': 4.8992300683598606e-05,
 '001101': 8.487034026767485e-05,
 '110100': 0.00016995014798394946,
 '000101': 0.0002886424038432914,
 '000001': 0.00035245185677344043,
 '101011': 0.00038661536233369287,
 '001000': 0.00039479940623932754,
 '100000': 0.0010206058909973184,
 '010000': 0.0011482192946275062,
 '000100': 0.0017117797656280266,
 '110000': 0.0018628279205728166,
 '011111': 0.00248829001490676,
 '000010': 0.0030101558944293397,
 '110111': 0.0030110862317502753,
 '101111': 0.0034121443153116307,
 '111011': 0.003419530802960282,
 '111101': 0.003447720441488858,
 '000110': 0.0038479378345108142,
 '001111': 0.004216715278569294,
 '000111': 0.005252550389471764,
 '111001': 0.005316739119693713,
 '111000': 0.005874980739342535,
 '111110': 0.007876449433009218,
 '111111': 0.4581202923517984,
 '000000': 0.4831078080621193}