Source code for qblox_scheduler.analysis.optimization_analysis
# Repository: https://gitlab.com/qblox/packages/software/qblox-scheduler
# Licensed according to the LICENSE file on the main branch
#
# Copyright 2020-2025, Quantify Consortium
# Copyright 2025, Qblox B.V.
import matplotlib.pyplot as plt
import numpy as np
from qblox_scheduler.analysis import base_analysis as ba
from quantify_core.visualization import mpl_plotting as qpl
from quantify_core.visualization.SI_utilities import (
    adjust_axeslabels_SI,
    format_value_string,
)
[docs]
class OptimizationAnalysis(ba.BaseAnalysis):
    """
    An analysis class which extracts the optimal quantities from an N-dimensional
    interpolating experiment.
    """
    # Override the run method so that we can add the new optional arguments
[docs]
    def run(self, minimize: bool = True):
        """
        Parameters
        ----------
        minimize
            Boolean which determines whether to report the minimum or the maximum.
            True for minimize.
            False for maximize.
        Returns
        -------
        :class:`~qblox_scheduler.analysis.optimization_analysis.OptimizationAnalysis`:
            The instance of this analysis.
        """  # NB the return type need to be specified manually to avoid circular import
        self.minimize = minimize
        return super().run() 
[docs]
    def process_data(self):
        """
        Finds the optimal (minimum or maximum) for y0 and saves the xi and y0
        values in the :code:`quantities_of_interest`.
        """
        text_msg = "Summary\n"
        arg_optimum_function = np.argmin if self.minimize else np.argmax
        optimum_function = np.min if self.minimize else np.max
        optimum_text = "minimum" if self.minimize else "maximum"
        # Go through every y variable and find the optimal point
        y_variable = "y0"
        text_msg += "\n"
        variable_name = self.dataset[y_variable].attrs["long_name"]
        text_msg += f"{variable_name} {optimum_text}:\n"
        # Find the optimum for each x coordinate
        for x_variable in self.dataset.coords:
            optimum = float(
                self.dataset[x_variable][
                    arg_optimum_function(self.dataset[y_variable].values)
                ].values
            )
            self.quantities_of_interest[self.dataset[x_variable].attrs["name"]] = optimum
            text_msg += format_value_string(
                self.dataset[x_variable].attrs["long_name"],
                optimum,
                end_char="\n",
                unit=self.dataset[x_variable].units,
            )
        # Find the corresponding optimal y value
        optimum = float(optimum_function(self.dataset[y_variable].values))
        self.quantities_of_interest[self.dataset[y_variable].attrs["name"]] = optimum
        text_msg += format_value_string(
            self.dataset[y_variable].attrs["long_name"],
            optimum,
            end_char="\n",
            unit=self.dataset[y_variable].units,
        )
        self.quantities_of_interest["plot_msg"] = text_msg 
 
[docs]
def iteration_plots(dataset, quantities_of_interest):
    """
    For every x and y variable, plot a graph of that variable vs the iteration index.
    """
    figs = {}
    axs = {}
    all_variables = list(dataset.coords.items()) + list(dataset.data_vars.items())
    for variable, values in all_variables:
        variable_name = dataset[variable].attrs["long_name"]
        fig, ax = plt.subplots()
        fig_id = f"Line plot {variable_name} vs iteration"
        ax.plot(values, marker=".", linewidth="0.5", markersize="4.5")
        adjust_axeslabels_SI(ax)
        qpl.set_ylabel(variable_name, dataset[variable].units, axis=ax)
        qpl.set_xlabel("iteration index", axis=ax)
        qpl.set_suptitle_from_dataset(fig, dataset, f"{variable_name} vs iteration number:")
        qpl.plot_textbox(ax, quantities_of_interest["plot_msg"])
        # add the figure and axis to the dicts for saving
        figs[fig_id] = fig
        axs[fig_id] = ax
    return figs, axs