Source code for leaspy.models.settings

import json
from typing import Union

from leaspy import __version__
from leaspy.exceptions import LeaspyModelInputError
from leaspy.utils.typing import KwargsType

__all__ = ["ModelSettings"]


[docs] class ModelSettings: """ Used in models.base.load to create a model class object from a `json` file. Attributes ---------- name : :obj:`str` The model's name. parameters : :obj:`KwargsType` The model's parameters. hyperparameters : :obj:`KwargsType` The model's hyperparameters. Parameters ---------- path_to_model_settings_or_dict : :obj:`dict` or :obj:`str` * If a str: path to a json file containing model settings * If a dict: content of model settings Raises ------ :exc:`.LeaspyModelInputError` If the provided settings are not valid or if the file cannot be read. """ def __init__(self, path_to_model_settings_or_dict: Union[str, dict]): if isinstance(path_to_model_settings_or_dict, dict): settings = path_to_model_settings_or_dict elif isinstance(path_to_model_settings_or_dict, str): with open(path_to_model_settings_or_dict) as fp: settings = json.load(fp) else: raise LeaspyModelInputError( "Bad type for model settings: should be a dict or a path " f"as a string, not {type(path_to_model_settings_or_dict)}" ) ModelSettings._check_settings(settings) self.name: str = settings["name"].lower() self.parameters: KwargsType = settings["parameters"] self.dataset_info: dict = settings.get("dataset_info", {}) self.training_info: dict = settings.get("training_info", {}) self.hyperparameters: KwargsType = { k.lower(): v for k, v in settings.items() if k not in ("name", "parameters", "hyperparameters", "leaspy_version", "dataset_info", "training_info") } @staticmethod def _check_settings(settings: dict) -> None: """Check if the settings are valid. Parameters ---------- settings : :obj:`dict` The settings to check. Raises ------ :exc:`.LeaspyModelInputError` If the settings are not valid: Key is missing or version is incompatible. """ for mandatory_key in ("name", "parameters"): if mandatory_key not in settings: raise LeaspyModelInputError( f"The '{mandatory_key}' key is missing in the model " "parameters (JSON file) you are loading." ) if "leaspy_version" not in settings: raise LeaspyModelInputError( "The model you are trying to load was generated with a leaspy version < 1.1 " f"and is not compatible with your current version of leaspy == {__version__} " "because of a bug in the multivariate model which lead to under-optimal results.\n" "Please consider re-calibrating your model with your current leaspy version.\n" "If you really want to load it as is (at your own risk) please use leaspy == 1.0.*" )