Source code for binf.pdf.parameters
"""
"""
## TODO: move test code somewhere else, complete documentation
import numpy
from abc import abstractmethod
from csb.numeric import log
from csb.statistics.pdf import AbstractDensity, ParameterNotFoundError
from csb.statistics.pdf.parameterized import Parameter, ParameterizedDensity
from numpy import sqrt, pi
[docs]class InvalidOperationError(Exception):
pass
[docs]class Location(Parameter):
[docs] def _validate(self, value):
return float(value)
[docs]class Scale(Parameter):
[docs] def _validate(self, value):
return float(value)
[docs] def _compute(self, base_value):
if base_value == 0.0:
return numpy.inf
else:
return 1.0 / base_value ** 0.5
[docs] def bind_to(self, base):
if base.name != "precision":
raise ValueError(base)
super(Scale, self).bind_to(base)
[docs]class Precision(Parameter):
[docs] def _validate(self, value):
if value < 0:
raise ValueError(value)
return float(value)
[docs]class FancyGaussian(ParameterizedDensity):
def __init__(self, mu=0, precision=1):
super(FancyGaussian, self).__init__()
self._register('mu')
self._register('sigma')
self._register('precision')
loc = Location(mu)
prec = Precision(precision)
sigma = Scale(0)
sigma.bind_to(prec)
self.set_params(mu=loc, sigma=sigma, precision=prec)
def __setitem__(self, param, value):
if param in self._params:
self._validate(param, value)
self._params[param] = value
else:
raise ParameterNotFoundError(param)
@property
def mu(self):
return self['mu'].value
@mu.setter
def mu(self, value):
self['mu'] = float(value)
@property
def sigma(self):
return self['sigma'].value
@property
def precision(self):
return self['precision'].value
@precision.setter
def precision(self, value):
self['precision'].set(value)
[docs] def log_prob(self, x):
mu = self.mu
sigma = self.sigma
return log(1.0 / sqrt(2 * pi * sigma ** 2)) - (x - mu) ** 2 / (2 * sigma ** 2)
if __name__ == "__main__":
pdf = FancyGaussian(1, 2)
print pdf.mu, pdf.sigma, pdf.precision
pdf = FancyGaussian(2, 5)
print pdf.mu, pdf.sigma, pdf.precision
pdf['precision'].set(2)
print pdf.mu, pdf.sigma, pdf.precision
try:
pdf['sigma'].set(2)
except InvalidOperationError as ex:
print str(ex)