I'm using Qiskit and I have a Quantum Circuit (say, circuit
) that gives reasonable results when using the simulator, namely
sim_backend = provider.get_backend('qasm_simulator')
job = execute(circuit, sim_backend, shots=shots)
However, when switching to the true machine, namely
sim_backend = provider.get_backend('ibmq_16_melbourne')
I'm experiencing very noisy, meaningless results.
From my understanding, this is normal and, in these cases, error mitigation is performed by measuring the noise of the quantum circuit and then operating with this knowledge.
Could someone tell me which Qiskit routine I could use to mitigate noise and how?
EDIT
Following the comment by Davit Khachatryan and the answer by Martin Vesely, I have prepared the code below.
# --- Standard imports
%matplotlib inline
# Importing standard Qiskit libraries and configuring account
from qiskit import QuantumCircuit, execute, Aer, IBMQ
from qiskit.compiler import transpile, assemble
from qiskit.tools.jupyter import *
from qiskit.visualization import *
# Loading your IBM Q account(s)
provider = IBMQ.load_account()
# --- Imports
from qiskit import QuantumCircuit, execute, BasicAer
from qiskit.tools.monitor import job_monitor
import math
from numpy import linalg as LA
import numpy as np
#%config jupy = 'svg' # Makes the images look nice
import time
import matplotlib.pyplot as plt
nBits = 2
shots = 8192
# --- Computation of the calibration matrix
from qiskit.ignis.mitigation.measurement import (complete_meas_cal,CompleteMeasFitter)
from qiskit import *
qr = QuantumRegister(2)
meas_calibs, state_labels = complete_meas_cal(qr=qr, circlabel='mcal')
backend = provider.get_backend('ibmq_16_melbourne')
job = execute(meas_calibs, backend=backend, shots=1000)
job_monitor(job, interval = 3)
cal_results = job.result()
meas_fitter = CompleteMeasFitter(cal_results, state_labels, circlabel='mcal')
print(meas_fitter.cal_matrix)
# --- Execution of the noisy quantum circuit
qc = QuantumCircuit(nBits, nBits)
qc.x(1)
qc.measure(qc.qregs[0], qc.cregs[0])
job = execute(qc, provider.get_backend('ibmq_16_melbourne'), shots = shots)
#job = execute(qc, BasicAer.get_backend('qasm_simulator'), shots = shots)
job_monitor(job, interval = 3)
result = job.result()
print(result.get_counts())
# --- Error correction
# Get the filter object
meas_filter = meas_fitter.filter
# Results with mitigation
mitigated_results = meas_filter.apply(result)
mitigated_counts = mitigated_results.get_counts(0)
print(mitigated_counts)
The noisy quantum circuit returns:
{'00': 661, '11': 34, '10': 7494, '01': 3}
The error mitigated noise circuit returns:
{'00': 132.05699755089069, '11': 29.711709316932044, '01': 0.4405790117450936, '10': 8029.790714120432}
Is that what I should expect?