Example: Sampling with FiQCISampler#

For configuration options and mitigation levels, see the FiQCISampler guide.

Import everything needed#

from fiqci.ems import FiQCISampler
from iqm.qiskit_iqm import IQMProvider
from qiskit import QuantumCircuit, transpile

Initialise FiQCISampler#

url = None
quantum_computer = None

# Connect to an IQM quantum computer using the provider
if url is not None and quantum_computer is not None:
	provider = IQMProvider(url=url, quantum_computer=quantum_computer)
	backend = provider.get_backend()
else:
	# Or using a noisy simulator
	from iqm.qiskit_iqm import IQMFakeAdonis

	backend = IQMFakeAdonis()

# Initialise FiQCI sampler with mitigation level 1 (readout error mitigation)
sampler = FiQCISampler(backend=backend, mitigation_level=1)

# We can view the default settings enabled for mitigation level 1
sampler.mitigator_options
{'rem': {'enabled': True,
  'calibration_shots': 1000,
  'calibration_file': None,
  'mitigator': <fiqci.ems.mitigators.rem.M3IQM at 0x7f3e18c621e0>}}

Mitigated Bell State#

# Create a Bell state circuit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()

# Transpile for backend
qc_transpiled = transpile(qc, backend=backend, optimization_level=3)

qc_transpiled.draw("mpl")
../_images/d87ec4b21c5b3c57ffe2d1408cd336b0857a0d5d002161e5dd44a81694789f46.png
# Execute on FiQCI Sampler
job = sampler.run([qc_transpiled], shots=2**10)

# Retrieve mitigated counts
mitigated_counts = job.result().get_counts()

print("Mitigated counts:", mitigated_counts)
Mitigated counts: {'10': 19, '11': 498, '00': 505}

Manually configure mitigation options#

# Initialise FiQCI sampler
sampler = FiQCISampler(backend=backend, mitigation_level=0)

# Config rem
sampler.rem(enabled=True, calibration_shots=2**10)

# Print current mitigator options
sampler.mitigator_options
{'rem': {'enabled': True,
  'calibration_shots': 1024,
  'calibration_file': None,
  'mitigator': <fiqci.ems.mitigators.rem.M3IQM at 0x7f3e137cccb0>}}

Get Job Information and Metadata#

# Get the raw counts for the first circuit in the first job
print(job.result().results[0].header)

raw_counts = job.result().results[0].header["fiqci_ems"]["raw_counts"]

print(raw_counts)
{'creg_sizes': [['meas', 2]], 'global_phase': 0.0, 'memory_slots': 2, 'n_qubits': 5, 'name': 'circuit-13855', 'qreg_sizes': [['ancilla', 3], ['q', 2]], 'metadata': {}, 'fiqci_ems': {'mitigation_level': 1, 'mitigation_method': 'M3', 'calibration_shots': 1000, 'raw_counts': {'01': 41, '10': 56, '00': 462, '11': 465}}}
{'01': 41, '10': 56, '00': 462, '11': 465}