Source code for ollin.movement_models.base

"""Base class for all movement models."""

from abc import abstractmethod, ABCMeta
from six import iteritems, add_metaclass

from ..core.constants import MOVEMENT_PARAMETERS


[docs]@add_metaclass(ABCMeta) class MovementModel(object): """Base class for all movement models. Any movement model must subclass this class and implement the generate movement method. Also they must provide a global attribute defining the default parameters for any instance of the movement model. Attributes ---------- name : str Name of model. Mainly used in plotting. default_parameters : dict Dictionary holding default values of any parameters associated with the movement model. There are some required parameters for every movement model. If not provided they will default to those in :py:mod:`.constants`. """ name = None default_parameters = {}
[docs] def handle_parameters(self, params): """Return parameter dictionary values with missing default values. This function searchs for all required parameters in the dictionary passed as argument. If not found it will default to the value specified in the default_parameters dictionary of the movement model class. If not found it will default to the one specified in the constants module. (see :py:mod:`.constants`) """ if params is None: params = {} parameters = MOVEMENT_PARAMETERS.copy() for key, value in iteritems(self.default_parameters): if isinstance(value, dict): try: parameters[key].update(value) except KeyError: parameters[key] = value else: parameters[key] = value for key, value in iteritems(params): if isinstance(value, dict): try: parameters[key].update(value) except KeyError: parameters[key] = value else: parameters[key] = value return parameters
def __init__(self, parameters=None): """Construct a movement model instance with the given parameters.""" if parameters is None: parameters = {} self.parameters = self.handle_parameters(parameters)
[docs] @abstractmethod def generate_movement( self, initial_position, site, steps, velocity): """Generate simulated movement from initial positions and conditions. This is an abstract method that must be implemented in any subclass. Arguments --------- initial_position : array Array of initial positions of shape [num, 2] to specify coordinates of individuals to be simulated. site: :py:obj:`.Site` Site in which to simulate movement. steps : int Number of steps to simulate. velocity : int Mean velocity of individuals. Returns ------- array : array Array of shape [num, steps, 2], so if (x, y) = Array[i, j, :] then x and y are the coordinates of the i-th individual at step j in the simulation. Number of steps is determined by number of days and steps per day parameter. """ pass