Source code for mdt.model_building.model_functions
from mot.lib.cl_function import CLFunction, SimpleCLFunction
from .parameter_functions.numdiff_info import SimpleNumDiffInfo
from .parameters import FreeParameter
from .parameter_functions.priors import UniformWithinBoundsPrior
from .parameter_functions.transformations import CosSqrClampTransform
__author__ = 'Robbert Harms'
__date__ = "2016-10-03"
__maintainer__ = "Robbert Harms"
__email__ = "robbert@xkls.nl"
[docs]class ModelCLFunction(CLFunction):
"""Extends a CLFunction with modeling information."""
@property
def name(self):
"""Get the name of this model function.
Returns:
str: The name of this model function.
"""
raise NotImplementedError()
[docs] def get_free_parameters(self):
"""Get all the free parameters in this model
Returns:
list of CLFunctionParameter: list of all the model parameters of type FreeParameter in this model
"""
raise NotImplementedError()
[docs] def get_prior_parameters(self, parameter):
"""Get the prior parameters of the given parameter.
Args:
parameter (FreeParameter): one of the parameters of this model function
Returns:
list of parameters: the list of prior parameters for the given parameter
"""
raise NotImplementedError()
[docs] def get_model_function_priors(self):
"""Get all the model function priors.
Returns:
list of mot.lib.cl_function.CLFunction: the priors for this model function,
these are supposed to be used in conjunction to the parameter priors.
"""
raise NotImplementedError()
[docs]class SimpleModelCLFunction(ModelCLFunction, SimpleCLFunction):
def __init__(self, return_type, cl_function_name, parameters, cl_body, dependencies=None,
model_function_priors=None):
"""A default implementation of a This CL function is for all estimable models
Args:
return_type (str): the CL return type of the function
cl_function_name (string): The name of the CL function
parameters (list or tuple of CLFunctionParameter): The list of parameters required for this function
cl_body (str): the cl body of this function
dependencies (list or tuple of CLFunction): The list of CL libraries this function depends on
model_function_priors (list of mot.lib.cl_function.CLFunction): list of priors concerning this whole model
function. The parameter names of the given functions must match those of this function.
"""
super().__init__(return_type, cl_function_name, parameters,
cl_body, dependencies=dependencies)
self._model_function_priors = model_function_priors or []
if isinstance(self._model_function_priors, CLFunction):
self._model_function_priors = [self._model_function_priors]
@property
def name(self):
"""Get the name of this model function, used in the composite model function
Returns:
str: The name of this model function.
"""
return self.get_cl_function_name()
[docs] def get_model_function_priors(self):
"""Get all the model function priors.
Returns:
list[mot.lib.cl_function.CLFunction]: the priors for this model function, these are supposed to be used in
conjunction to the parameter priors.
"""
return self._model_function_priors
[docs] def get_free_parameters(self):
"""Get all the free parameters in this model
Returns:
list: the list of free parameters in this model
"""
return list([p for p in self.get_parameters() if isinstance(p, FreeParameter)])
[docs] def get_prior_parameters(self, parameter):
"""Get the parameters referred to by the priors of each of the free parameters.
This returns a list of all the parameters referenced by the priors of the parameters, recursively.
Returns:
list of mot.lib.cl_function.CLFunctionParameter: the list of additional parameters used by each of the
parameter priors
"""
def get_prior_parameters(params):
return_params = []
for param in params:
prior_params = param.sampling_prior.get_extra_parameters()
proxy_prior_params = [prior_param.get_renamed('{}.prior.{}'.format(param.name, prior_param.name))
for prior_param in prior_params]
return_params.extend(proxy_prior_params)
free_prior_params = [p for p in proxy_prior_params if isinstance(p, FreeParameter)]
return_params.extend(get_prior_parameters(free_prior_params))
return return_params
return get_prior_parameters([parameter])
[docs]class WeightType(SimpleModelCLFunction):
"""A class that defines the notion of a weighted compartment.
Some of the code checks for this class type, be sure to subclass this class if you want to represent a Weight.
"""
[docs]class SimpleWeight(WeightType):
def __init__(self, name='Weight', param_name='w', value=0.5, lower_bound=0.0,
upper_bound=1.0, parameter_kwargs=None):
"""A class that by itself defines the notion of a Weight.
Some of the code checks for type Weight, be sure to use this model function if you want to represent a Weight.
A weight is meant to be a model volume fraction.
Args:
name (str): The name of the model
value (number or ndarray): The initial value for the single free parameter of this function.
lower_bound (number or ndarray): The initial lower bound for the single free parameter of this function.
upper_bound (number or ndarray): The initial upper bound for the single free parameter of this function.
"""
parameter_settings = dict(parameter_transform=CosSqrClampTransform(),
sampling_proposal_std=0.01,
sampling_prior=UniformWithinBoundsPrior(),
numdiff_info=SimpleNumDiffInfo(scale_factor=10)
)
parameter_settings.update(parameter_kwargs or {})
super().__init__(
'mot_float_type',
name,
(FreeParameter('mot_float_type ' + param_name, False, value,
lower_bound, upper_bound, **parameter_settings),),
'return ' + param_name + ';')