from abc import ABC, abstractmethod
[docs]
class BaseModel(ABC):
[docs]
@abstractmethod
def evaluate(self):
'''
Calculate a point estimate for mixing model
Returns:
--------
evaluation : float
point estimate for model
Example
-------
.. code-block:: python
class MyModel(BaseModel):
@property
def model(self):
return self._model
@models.setter
def model(self, the_model):
self._model = the_model
def evaluate(self, model_parameters):
return self._model(model_parameters)
# . . .
'''
[docs]
@abstractmethod
def log_likelihood_elementwise(self):
r'''
Calculate log_likelihood for array of points given
Returns:
--------
log_likelis : np.ndarray
an array of length as shape[0] of the input evaluation points
Example:
--------
.. code-block:: python
class MyModel(BaseModel):
def log_likelihood_elementwise(
self, y_exp, y_err, model_params
):
# Assuming a normal distribution for error
y = self.evaluate(model_params)
# If y_exp, y_err, y are numpy arrays of same length
return np.exp(-(y - y_exp) **2 / (2 * y_err ** 2)) \
/ np.sqrt(2 * np.pi * y_err ** 2))
'''
[docs]
@abstractmethod
def set_prior(self):
'''
User must provide function that sets a member variable called _prior.
Dictionary of prior distributions. Format should be compatible with
sampler.
Example:
--------
.. code-block:: python
class MyModel(BaseMixer):
# . . .
def set_prior(self, prior_dict):
self._prior = prior_dict
# . . .
'''