Module utils

A module for any utility-related functions for sbelt.

Expand source code
"""
A module for any utility-related functions for sbelt.
"""
import re 

def validate_arguments(parameters):
    """ Validate arguments for types/ranges.

    Args:
        parameters: A dictionary of the 13 parameters 
            required by the model. For example:

            {'particle_diam': 0.70,
            'bed_length': 100,
                ...
            'out_name': 'sbelt-out'} 
    
    Raises: 
        ValueError: if any argument is invalid. error 
            message provides further information.
    """
    # TODO: a lot of repeated code here - could be made prettier/simpler
    boolean_type_msg = "{failing_var} must be of type boolean (True/False)."
    boolean_type_vars = ['gauss', 'height_dependant_entr']
    for key in boolean_type_vars:
        if not isinstance(parameters[key], bool):
            raise ValueError(boolean_type_msg.format(failing_var=key))
    
    int_type_msg = "{failing_var} must be of type int."
    int_type_vars = ['bed_length', 'num_subregions', 'level_limit', 'iterations', 'data_save_interval']
    for key in int_type_vars:
        if not isinstance(parameters[key], int):
            raise ValueError(int_type_msg.format(failing_var=key))
    
    number_type_msg = "{failing_var} must be of type int or float."
    number_type_vars = ['particle_pack_dens', 'particle_diam', 'poiss_lambda', 'gauss_mu', 'gauss_sigma' ]
    for key in number_type_vars:
        if not isinstance(parameters[key], (int, float)):
            raise ValueError(number_type_msg.format(failing_var=key))

    string_type_msg = "{failing_var} must be of type string."
    string_type_vars = ['out_path', 'out_name']
    for key in string_type_vars:
        if not isinstance(parameters[key], str):
            raise ValueError(string_type_msg.format(failing_var=key))

    greater_than_0_msg = "{failing_var} must be > 0."
    greater_than_0_vars = ['bed_length','particle_pack_dens', 'particle_diam', 'num_subregions', 'level_limit', \
                                'iterations', 'gauss_sigma', 'data_save_interval']
    for key in greater_than_0_vars:
        if parameters[key] <= 0:
            raise ValueError(greater_than_0_msg.format(failing_var=key))
    
    geq_than_0_msg = "{failing_var} must be >= 0."
    geq_than_0_vars = ['poiss_lambda', 'gauss_mu']
    for key in geq_than_0_vars:
        if parameters[key] < 0:
            raise ValueError(geq_than_0_msg.format(failing_var=key))
    
    valid_filename_msg = "{failing_var} cannot contain spaces or invalid characters."
    valid_filename_vars = ['out_name']
    for key in valid_filename_vars:
        if not re.match(r"^[a-zA-Z\d\-\_]*$", parameters[key]):
            raise ValueError(valid_filename_msg.format(failing_var=key))

    # Check that particle_diam and num_subregions play well with bed_length!
    if parameters['bed_length'] % parameters['particle_diam'] != 0:
        bed_diam_msg = (
            "Invalid configuration of bed_length and particle_diam parameters: "
            " bed_length must be divisible by particle_diam."
        )
        print(bed_diam_msg)
        raise ValueError("bed_length must be divisible by set_diam")

    if parameters['bed_length'] % parameters['num_subregions'] != 0:
        bed_subr_msg = (
            "Invalid configuration of bed_length and num_subregions parameters: "
            " bed_length must be divisible by num_subregions."
        )
        print(bed_subr_msg)
        raise ValueError("bed_length must be divisible by num_subregions")

    return 

Functions

def validate_arguments(parameters)

Validate arguments for types/ranges.

Args

parameters

A dictionary of the 13 parameters required by the model. For example:

{'particle_diam': 0.70, 'bed_length': 100, … 'out_name': 'sbelt-out'}

Raises: ValueError: if any argument is invalid. error message provides further information.

Expand source code
def validate_arguments(parameters):
    """ Validate arguments for types/ranges.

    Args:
        parameters: A dictionary of the 13 parameters 
            required by the model. For example:

            {'particle_diam': 0.70,
            'bed_length': 100,
                ...
            'out_name': 'sbelt-out'} 
    
    Raises: 
        ValueError: if any argument is invalid. error 
            message provides further information.
    """
    # TODO: a lot of repeated code here - could be made prettier/simpler
    boolean_type_msg = "{failing_var} must be of type boolean (True/False)."
    boolean_type_vars = ['gauss', 'height_dependant_entr']
    for key in boolean_type_vars:
        if not isinstance(parameters[key], bool):
            raise ValueError(boolean_type_msg.format(failing_var=key))
    
    int_type_msg = "{failing_var} must be of type int."
    int_type_vars = ['bed_length', 'num_subregions', 'level_limit', 'iterations', 'data_save_interval']
    for key in int_type_vars:
        if not isinstance(parameters[key], int):
            raise ValueError(int_type_msg.format(failing_var=key))
    
    number_type_msg = "{failing_var} must be of type int or float."
    number_type_vars = ['particle_pack_dens', 'particle_diam', 'poiss_lambda', 'gauss_mu', 'gauss_sigma' ]
    for key in number_type_vars:
        if not isinstance(parameters[key], (int, float)):
            raise ValueError(number_type_msg.format(failing_var=key))

    string_type_msg = "{failing_var} must be of type string."
    string_type_vars = ['out_path', 'out_name']
    for key in string_type_vars:
        if not isinstance(parameters[key], str):
            raise ValueError(string_type_msg.format(failing_var=key))

    greater_than_0_msg = "{failing_var} must be > 0."
    greater_than_0_vars = ['bed_length','particle_pack_dens', 'particle_diam', 'num_subregions', 'level_limit', \
                                'iterations', 'gauss_sigma', 'data_save_interval']
    for key in greater_than_0_vars:
        if parameters[key] <= 0:
            raise ValueError(greater_than_0_msg.format(failing_var=key))
    
    geq_than_0_msg = "{failing_var} must be >= 0."
    geq_than_0_vars = ['poiss_lambda', 'gauss_mu']
    for key in geq_than_0_vars:
        if parameters[key] < 0:
            raise ValueError(geq_than_0_msg.format(failing_var=key))
    
    valid_filename_msg = "{failing_var} cannot contain spaces or invalid characters."
    valid_filename_vars = ['out_name']
    for key in valid_filename_vars:
        if not re.match(r"^[a-zA-Z\d\-\_]*$", parameters[key]):
            raise ValueError(valid_filename_msg.format(failing_var=key))

    # Check that particle_diam and num_subregions play well with bed_length!
    if parameters['bed_length'] % parameters['particle_diam'] != 0:
        bed_diam_msg = (
            "Invalid configuration of bed_length and particle_diam parameters: "
            " bed_length must be divisible by particle_diam."
        )
        print(bed_diam_msg)
        raise ValueError("bed_length must be divisible by set_diam")

    if parameters['bed_length'] % parameters['num_subregions'] != 0:
        bed_subr_msg = (
            "Invalid configuration of bed_length and num_subregions parameters: "
            " bed_length must be divisible by num_subregions."
        )
        print(bed_subr_msg)
        raise ValueError("bed_length must be divisible by num_subregions")

    return