# Source code for heron.models


import numpy as np

[docs]class Model(object):
"""
This is the factory class for statistical models used for waveform generation.

A model class must expose the following methods:
- distribution : produce a distribution of waveforms at a given point in the parameter space
- mean : produce a mean waveform at a given point in the parameter space
- train : provide an interface for training the model
"""

def __init__(self):
"""
Make some default initialisations.
These don't really mean anything, but it's important that the variables exist.
This __init__ function ought to be usable as a template for other functions, or run from the superclass.
"""

# Need to explicitly set the number of dimensions of the training data.
# TODO: Decide if this is actually required.
self.x_dimensions = 2

# Need to create a lookup table between the columns in the model
# and their location in the training data
self.columns = {0: "time",
1: "second quantity"}
self.c_ind = {j:i for i,j in self.columns.items()}

# The training data contains both the x and the y data, so we need
# to specify which are parameters.
# It's worth noting that right now, time isn't a parameter...
self.parameters = ("second quantity",)

def _process_inputs(self, times, p):
"""
Apply regularisations and normalisations to any input point dictionary.

Parameters
----------
times: list, array-like
An array of time stamps.
p : dict
A dictionary of the input locations
"""

# The default implementation of this method just passes the data straight through.

return times, p

def _generate_eval_matrix(self, p, times):
"""
Create the matrix of parameter points at which to evaluate the model.
"""

times, p = self._process_inputs(times, p)

nt = len(times)
points = np.ones((nt, self.x_dimensions))
points[:,self.c_ind['time']] = times

for parameter in self.parameters:
if parameter in p.keys():
value = p[parameter]
else:
value = 0.0

points[:, self.c_ind[parameter]] *= value

return points

pass