Source code for iq_readout.plots.summary

"""Plot summaries for the classifiers."""

from typing import List

import numpy as np
import matplotlib.pyplot as plt

from ..metrics import get_probs_prep_meas
from ..classifiers import Classifier, TwoStateClassifier, ThreeStateClassifier
from .shots1d import plot_two_pdfs_projected, plot_several_pdfs_along_line
from .shots2d import plot_shots_2d, plot_boundaries_2d, plot_contour_pdf_2d
from .metrics import plot_probs_prep_meas


[docs] def summary(classifier: Classifier, *shots: List[np.ndarray]) -> plt.Figure: """Figure to show a general overview of the performance of the classifier.""" if classifier._num_states == 2: fig = two_state_classifier(classifier, *shots) elif classifier._num_states == 3: fig = three_state_classifier(classifier, *shots) else: raise ValueError( "Only implemented for two- and three-state classifiers, " f"but {classifier._num_states}-state classifier was given. " ) return fig
def two_state_classifier( classifier: TwoStateClassifier, shots_0: np.ndarray, shots_1: np.ndarray, ) -> plt.Figure: fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(16, 5)) axes[0] = plot_shots_2d(axes[0], shots_0, shots_1) probs = get_probs_prep_meas(classifier, shots_0, shots_1) axes[1] = plot_probs_prep_meas(axes[1], probs) axes[2] = plot_two_pdfs_projected( axes[2], classifier, shots_0, shots_1, ) axes[2].set_title("projection: 0-1") fig.tight_layout() return fig def three_state_classifier( classifier: ThreeStateClassifier, shots_0: np.ndarray, shots_1: np.ndarray, shots_2: np.ndarray, ) -> plt.Figure: fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(12, 7)) # (1) 2D plot with the experimental shots plot_shots_2d(axes[0, 0], shots_0, shots_1, shots_2) # (2) p(m|s) matrix probs_prep_meas = get_probs_prep_meas(classifier, shots_0, shots_1, shots_2) plot_probs_prep_meas(axes[0, 1], probs_prep_meas) # (3) 2D plot with decision boundaries and 1/e countour plot_shots_2d(axes[0, 2], shots_0, shots_1, shots_2) plot_boundaries_2d(axes[0, 2], classifier) plot_contour_pdf_2d(axes[0, 2], classifier.pdf_0) plot_contour_pdf_2d(axes[0, 2], classifier.pdf_1) plot_contour_pdf_2d(axes[0, 2], classifier.pdf_2) axes[0, 2].legend().remove() # (4-6) 1D plot along a line params = classifier.params mu_0 = [params[0]["mu_0_x"], params[0]["mu_0_y"]] mu_1 = [params[1]["mu_1_x"], params[1]["mu_1_y"]] mu_2 = [params[2]["mu_2_x"], params[2]["mu_2_y"]] plot_several_pdfs_along_line( axes[1, 0], [mu_0, mu_1], classifier, shots_0, shots_1, shots_2, ) axes[1, 0].set_title("projection: 0-1") axes[1, 0].legend().remove() plot_several_pdfs_along_line( axes[1, 1], [mu_1, mu_2], classifier, shots_0, shots_1, shots_2, ) axes[1, 1].set_title("projection: 1-2") axes[1, 1].legend().remove() plot_several_pdfs_along_line( axes[1, 2], [mu_0, mu_2], classifier, shots_0, shots_1, shots_2, ) axes[1, 2].set_title("projection: 0-2") axes[1, 2].legend().remove() fig.tight_layout() return fig