Source code for qdesignoptimizer.utils.plotting

"""Additional plotting utilities for loading and visualizing optimization results from files."""

import os
from datetime import datetime
from typing import List, Literal, Optional

import numpy as np

from qdesignoptimizer.design_analysis_types import OptTarget
from qdesignoptimizer.sim_plot_progress import plot_progress


[docs] def load_data_by_date( folder_parent: str, name_experiment: str, experiment_beginning: str, experiment_end: str, ) -> List[str]: """ Load optimization data files within a specified date range and experiment name. Searches a directory for .npy files matching an experiment name and falling within a specified date range. The function extracts dates from filenames following the convention 'experiment_name_YYYYMMDD-HHMMSS.npy'. Args: folder_parent: Directory path containing the optimization result files. name_experiment: Experiment name to filter files (e.g., "multi_transmon_chip"). experiment_beginning: Start date in 'YYYYMMDD-HHMMSS' format, either as full filename or just the date portion. experiment_end: End date in 'YYYYMMDD-HHMMSS' format, either as full filename or just the date portion. Returns: List of full file paths for matching optimization result files. Example: >>> files = load_data_by_date( ... "results/", ... "multi_transmon_chip", ... "20250306-165308", ... "20250308-120000" ... ) """ files_experiment = [] # Get all files in the parent folder all_files_in_folder = os.listdir(folder_parent) all_files_in_folder = [os.path.join(folder_parent, f) for f in all_files_in_folder] # Filter for .npy files npy_ind = [] for i, folder in enumerate(all_files_in_folder): if folder.endswith("npy"): npy_ind.append(i) npy_ind = np.array(npy_ind) all_files_in_folder = np.array(all_files_in_folder) files_npy = all_files_in_folder[npy_ind] # Filter for experiment name experiment_ind = [] for i, file_npy in enumerate(files_npy): if file_npy.find(name_experiment) > 0: experiment_ind.append(i) experiment_ind = np.array(experiment_ind) files_experiment.append(files_npy[experiment_ind]) # Extract dates from filenames and filter by date range date_start_dt = datetime.strptime( experiment_beginning.split("_")[-1], "%Y%m%d-%H%M%S" ) date_stop_dt = datetime.strptime(experiment_end.split("_")[-1], "%Y%m%d-%H%M%S") filtered_files = [] for file in np.concatenate(files_experiment): file_date_str = file.split("_")[-1].rstrip(".npy") file_date = datetime.strptime(file_date_str, "%Y%m%d-%H%M%S") if date_start_dt <= file_date <= date_stop_dt: filtered_files.append(file) return filtered_files
[docs] def plot_optimization_results( files: List[str], plot_variance: bool = True, plot_design_variables: Optional[Literal["chronological", "sorted"]] = None, opt_target_list: Optional[List[OptTarget]] = None, plot_settings: Optional[dict] = None, save_figures: bool = True, ) -> None: """ Plot optimization results from multiple data files. Loads optimization data from provided file paths and creates visualizations using the plot_progress function. Handles multiple optimization runs and configures plotting options for parameter visualization. Args: files: List of file paths to optimization result files (.npy format). plot_variance: Whether to show mean and standard deviation across multiple optimization runs (True) or individual lines for each run (False). Defaults to True. plot_design_variables: How design variables should be plotted against parameters: - "chronological": Plot in order of iterations - "sorted": Sort by design variable values - None: Don't plot design variables Note that some target parameters may depend on multiple design variables, so these plots may not capture the full physics. opt_target_list: List of optimization targets defining relationships between physical parameters and design variables. Required when plot_design_variables is set. save_figures: Whether to save generated plots to disk. Defaults to True. Raises: AssertionError: If loaded optimization results have inconsistent target parameters or different numbers of iterations. Example: >>> files = load_data_by_date("results/", "transmon", "20250306-165308", "20250308-120000") >>> targets = get_opt_targets_qb_res_transmission("qubit_1", "resonator_1", "feedline") >>> plot_optimization_results( ... files, ... plot_variance=True, ... plot_design_variables="sorted", ... opt_target_list=targets ... ) """ # Load results from files results = [] for file in files: results.append(np.load(file, allow_pickle=True)[0]) results = np.array(results) if plot_settings is None: plt_set = results[0]["plot_settings"] else: plt_set = plot_settings # Verify consistency of loaded results for result in results: assert ( result["system_target_params"] == results[0]["system_target_params"] ), "All optimization results must have the same target parameters" assert len(result["optimization_results"]) == len( results[0]["optimization_results"] ), "All optimization results must have the same number of passes" # Generate plots using the plot_progress function plot_progress( [result["optimization_results"] for result in results], results[0]["system_target_params"], plt_set, save_figures=save_figures, plot_variance=plot_variance, plot_design_variables=plot_design_variables, opt_target_list=opt_target_list, )