Source code for clinamen2.utils.script_functions

"""Reusable code for Python script calls."""
import argparse
import pathlib
from typing import Tuple

import numpy.typing as npt

from clinamen2.cmaes.params_and_state import (
    AlgorithmParameters,
    AlgorithmState,
    create_init_algorithm_state,
    init_default_algorithm_parameters,
)
from clinamen2.utils.plot_functions import CMAPlotHelper


[docs] def cma_parser() -> argparse.ArgumentParser: """Argument parser for example scripts. Has the CMA-ES parameters as attributes. Further arguments added to this base parser may not have a shortcut. Returns parser """ parser = argparse.ArgumentParser() parser.add_argument( "-l", "--label", type=str, default="dummy", help="Run label of evolution.", ) parser.add_argument( "-r", "--random_seed", type=int, default=0, help="Random seed for evolution. Default is 0", ) parser.add_argument( "-s", "--step_size", type=float, default=1.0, help="Initial step size. Default is 1.0", ) parser.add_argument( "-g", "--generations", type=int, default=1000, help="Number of generations to run for. Default is 1000", ) parser.add_argument( "-p", "--pop_size", type=int, help="Population size to use instead of CMA-ES default.", default=None, ) parser.add_argument( "-n", "--save_nth", type=int, help="Save every nth generation. Default is 1", default=1, ) return parser
[docs] def cma_setup( mean, step_size, run_seed=0, pop_size=None, initial_cholesky_factor=None, ) -> Tuple[AlgorithmParameters, AlgorithmState, npt.ArrayLike]: """Helper function to initialize the algorithm""" dimension = mean.shape[0] # AlgorithmParameters parameters = init_default_algorithm_parameters( dimension, initial_step_size=step_size, random_seed=run_seed, pop_size=pop_size, ) # AlgorithmState init_state = create_init_algorithm_state(parameters) state = init_state(mean=mean, cholesky_factor=initial_cholesky_factor) return parameters, state
[docs] def generate_result_figures( label: str, input_dir: pathlib.Path, generation_bounds: Tuple[int, int], output_dir: pathlib.Path = None, figsize: Tuple[float, float] = (10, 8), y_units: str = r"", json: bool = True, ) -> None: """Create two default figures for given evolution. - CMA_PlotHandler.plot_mean_loss_per_generation() - CMA_PlotHandler.plot_loss_per_generation() Args: label: Label of the evolution run. input_dir: Full path to the generated data. generation_bounds: Plot data between these generations. output_dir: Full path to save figures to. DEfaults to input_dir. figsize: Matpplotlib figure size. Default is (10, 8). y_units: Units of loss. Default is empty string. json: Data is stored in JSON files. """ if output_dir is None: output_dir = input_dir plotter = CMAPlotHelper( label=label, generation_bounds=generation_bounds, input_dir=input_dir, output_dir=output_dir, ) plotter.plot_mean_loss_per_generation( generation_bounds=(1, plotter.generations), show_sigma=True, sigma_e_mult=1, y_units=y_units, save_fig=True, figsize=figsize, ) plotter.plot_loss_per_generation( generation_bounds=[1, plotter.generations], y_units=y_units, save_fig=True, figsize=figsize, )