Source code for petab_select.misc

import hashlib

# import json
from typing import Any, List, Union

from .constants import (  # TYPE_PARAMETER_OPTIONS_DICT,
    ESTIMATE,
    TYPE_PARAMETER_DICT,
    TYPE_PARAMETER_OPTIONS,
)

__all__ = [
    'parameter_string_to_value',
]


def hashify(x: Any) -> str:
    """Generate a hash.

    Args:
        x:
            The object to hash. `x` will be converted to a string (`str(x)`), then
            hashed.

    Returns:
        The hash.
    """
    # return int(hashlib.sha256(str(x).encode('utf-8')).hexdigest(), 16)
    return hashlib.blake2b(str(x).encode('utf-8')).hexdigest()


def hash_parameter_dict(dict_: TYPE_PARAMETER_DICT):
    """Hash a dictionary of parameter values."""
    value = tuple((k, dict_[k]) for k in sorted(dict_))
    return hashify(value)


def hash_parameter_options(list_: TYPE_PARAMETER_OPTIONS):
    """Hash parameter options."""
    return hashify(list(list_))


def hash_str(str_: str):
    return hashify(str_)


def hash_list(list_: List):
    return hashify(list(list_))


def snake_case_to_camel_case(string: str) -> str:
    """Convert a string from snake case to camel case.

    Args:
        string:
            The string, in snake case.

    Returns:
        The string, in camel case.
    """
    string_pieces = string.split('_')
    string_camel = ''
    for string_piece in string_pieces:
        string_camel += string_piece[0].upper() + string_piece[1:]
    return string_camel


[docs]def parameter_string_to_value( parameter_string: str, passthrough_estimate: bool = False, ) -> Union[float, int, str]: """Cast a parameter value from string to numeric. Args: parameter_string: The parameter value, as a string. passthrough_estimate: Whether to return `ESTIMATE` as `ESTIMATE`. If `False`, raises an exception if `parameter_string == ESTIMATE`. Returns: The parameter value, as a numeric type. """ if parameter_string == ESTIMATE: if passthrough_estimate: return parameter_string raise ValueError('Please handle estimated parameters differently.') float_value = float(parameter_string) int_value = int(float_value) if int_value == float_value: return int_value return float_value
# def hash_dictionary(dictionary: Dict[str, Union[]]): # return hash(json.dumps(dictionary, sort_keys=True)) # # # def hash_list(list_: List): # return hash(json.dumps(list_, sort_keys=True))