import scipy.stats as stats
from taurex.log import Logger
import math
import enum
[docs]class PriorMode(enum.Enum):
"""
Defines the type of prior space
"""
LINEAR = 0,
LOG = 1,
[docs]class Prior(Logger):
"""
Defines a prior function
"""
def __init__(self):
super().__init__(self.__class__.__name__)
self._prior_mode = PriorMode.LINEAR
@property
def priorMode(self):
return self._prior_mode
[docs] def sample(self, x):
raise NotImplementedError
[docs] def prior(self, value):
if self._prior_mode is PriorMode.LINEAR:
return value
else:
return 10**value
[docs] def params(self):
raise NotImplementedError
[docs] def boundaries(self):
raise NotImplementedError
[docs]class Gaussian(Prior):
def __init__(self, mean=0.5, std=0.25):
super().__init__()
self._loc = mean
self._scale = std
[docs] def sample(self, x):
return stats.norm.ppf(x, loc=self._loc, scale=self._scale)
[docs] def params(self):
return f'Mean = {self._loc} Stdev = {self._scale}'
[docs] def boundaries(self):
return self.sample(0.1), self.sample(0.9)
[docs]class LogGaussian(Gaussian):
def __init__(self, mean=0.5, std=0.25,
lin_mean=None, lin_std=None):
if lin_mean is not None:
mean = math.log10(lin_mean)
if lin_std is not None:
std = math.log10(lin_std)
super().__init__(mean=mean, std=std)
self._prior_mode = PriorMode.LOG