Skip to content

Commit

Permalink
Add mitigated tomo tests
Browse files Browse the repository at this point in the history
  • Loading branch information
chriseclectic committed Feb 6, 2023
1 parent 9c6732e commit 8a35a5e
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 6 deletions.
61 changes: 58 additions & 3 deletions test/library/tomography/test_process_tomography.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,16 @@
import qiskit.quantum_info as qi
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
from qiskit_experiments.library import ProcessTomography
from qiskit_experiments.library.tomography import ProcessTomographyAnalysis, basis
from qiskit_experiments.database_service import ExperimentEntryNotFound
from .tomo_utils import FITTERS, filter_results, teleport_circuit, teleport_bell_circuit
from qiskit_experiments.library import ProcessTomography, MitigatedProcessTomography
from qiskit_experiments.library.tomography import ProcessTomographyAnalysis, basis
from .tomo_utils import (
FITTERS,
filter_results,
teleport_circuit,
teleport_bell_circuit,
readout_noise_model,
)


@ddt.ddt
Expand Down Expand Up @@ -441,3 +447,52 @@ def test_qpt_amat_pauli_basis(self):
self.assertExperimentDone(expdata)
fid = expdata.analysis_results("process_fidelity").value
self.assertGreater(fid, 0.95)

@ddt.data((0,), (1,), (2,), (3,), (0, 1), (2, 0), (0, 3))
def test_mitigated_full_qpt_random_unitary(self, qubits):
"""Test QPT experiment"""
seed = 1234
shots = 5000
f_threshold = 0.95

noise_model = readout_noise_model(4, seed=seed)
backend = AerSimulator(seed_simulator=seed, shots=shots, noise_model=noise_model)
target = qi.random_unitary(2 ** len(qubits), seed=seed)
exp = MitigatedProcessTomography(target, backend=backend)
exp.analysis.set_options(unmitigated_fit=True)
expdata = exp.run(analysis=None)
self.assertExperimentDone(expdata)

for fitter in FITTERS:
with self.subTest(fitter=fitter, qubits=qubits):
if fitter:
exp.analysis.set_options(fitter=fitter)
fitdata = exp.analysis.run(expdata)
self.assertExperimentDone(fitdata)
# Should be 2 results, mitigated and unmitigated
states = expdata.analysis_results("state")
self.assertEqual(len(states), 2)

# Check state is density matrix
for state in states:
self.assertTrue(
isinstance(state.value, qi.Choi),
msg=f"{fitter} fitted state is not density matrix for qubits {qubits}",
)

# Check fit state fidelity
fids = expdata.analysis_results("process_fidelity")
self.assertEqual(len(fids), 2)
mitfid, nomitfid = fids
# Check mitigation improves fidelity
self.assertTrue(
mitfid.value >= nomitfid.value,
msg="mitigated {} did not improve fidelity for qubits {} ({:.4f} < {:.4f})".format(
fitter, qubits, mitfid.value, nomitfid.value
),
)
self.assertGreater(
mitfid.value,
f_threshold,
msg=f"{fitter} fit fidelity is low for qubits {qubits}",
)
59 changes: 56 additions & 3 deletions test/library/tomography/test_state_tomography.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,16 @@
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel

from qiskit_experiments.library import StateTomography
from qiskit_experiments.library.tomography import StateTomographyAnalysis, basis
from qiskit_experiments.database_service import ExperimentEntryNotFound
from .tomo_utils import FITTERS, filter_results, teleport_circuit, teleport_bell_circuit
from qiskit_experiments.library import StateTomography, MitigatedStateTomography
from qiskit_experiments.library.tomography import StateTomographyAnalysis, basis
from .tomo_utils import (
FITTERS,
filter_results,
teleport_circuit,
teleport_bell_circuit,
readout_noise_model,
)


@ddt.ddt
Expand Down Expand Up @@ -341,3 +347,50 @@ def test_qst_amat_pauli_basis(self):
self.assertExperimentDone(expdata)
fid = expdata.analysis_results("state_fidelity").value
self.assertGreater(fid, 0.95)

@ddt.data((0,), (1,), (2,), (3,), (0, 1), (2, 0), (0, 3), (0, 3, 1))
def test_mitigated_full_qst(self, qubits):
"""Test QST experiment"""
seed = 1234
shots = 5000
f_threshold = 0.95

noise_model = readout_noise_model(4, seed=seed)
backend = AerSimulator(seed_simulator=seed, shots=shots, noise_model=noise_model)
target = qi.random_statevector(2 ** len(qubits), seed=seed)
exp = MitigatedStateTomography(target, physical_qubits=qubits, backend=backend)
exp.analysis.set_options(unmitigated_fit=True)
expdata = exp.run(analysis=None)
self.assertExperimentDone(expdata)

for fitter in FITTERS:
with self.subTest(fitter=fitter, qubits=qubits):
if fitter:
exp.analysis.set_options(fitter=fitter)
fitdata = exp.analysis.run(expdata)
self.assertExperimentDone(fitdata)
# Should be 2 results, mitigated and unmitigated
states = expdata.analysis_results("state")
self.assertEqual(len(states), 2)
for state in states:
self.assertTrue(
isinstance(state.value, qi.DensityMatrix),
msg=f"{fitter} fitted state is not density matrix for qubits {qubits}",
)

# Check fit state fidelity
fids = expdata.analysis_results("state_fidelity")
self.assertEqual(len(fids), 2)
mitfid, nomitfid = fids
# Check mitigation improves fidelity
self.assertTrue(
mitfid.value >= nomitfid.value,
msg="mitigated {} did not improve fidelity for qubits {} ({:.4f} < {:.4f})".format(
fitter, qubits, mitfid.value, nomitfid.value
),
)
self.assertGreater(
mitfid.value,
f_threshold,
msg=f"{fitter} fit fidelity is low for qubits {qubits}",
)
14 changes: 14 additions & 0 deletions test/library/tomography/tomo_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
"""
Common methods for tomography tests
"""
import numpy as np
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit_aer.noise import NoiseModel


FITTERS = [
Expand Down Expand Up @@ -77,3 +79,15 @@ def teleport_bell_circuit(flatten_creg=True):
teleport.z(2).c_if(creg[0], 1)
teleport.x(2).c_if(creg[1], 1)
return teleport


def readout_noise_model(num_qubits, seed=None):
"""Generate noise model of random local readout errors"""
rng = np.random.default_rng(seed=seed)
p1g0s = 0.15 * rng.random(num_qubits)
p0g1s = 0.3 * rng.random(num_qubits)
amats = np.stack([[1 - p1g0s, p1g0s], [p0g1s, 1 - p0g1s]]).T
noise_model = NoiseModel()
for i, amat in enumerate(amats):
noise_model.add_readout_error(amat.T, [i])
return noise_model

0 comments on commit 8a35a5e

Please sign in to comment.