2024-06-19 17:10:49 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
2024-06-20 17:19:55 +00:00
|
|
|
from abc import ABC, abstractmethod
|
|
|
|
|
|
|
|
import numpy as np
|
2024-06-19 17:10:49 +00:00
|
|
|
from numpy.random import Generator
|
|
|
|
|
|
|
|
|
2024-06-20 17:19:55 +00:00
|
|
|
class BaseDistribution(ABC):
|
2024-06-19 17:10:49 +00:00
|
|
|
def __init__(self, tau: float, rng: Generator | None = None):
|
|
|
|
self._tau = tau
|
|
|
|
self._rng = rng
|
|
|
|
|
2024-06-30 10:06:44 +00:00
|
|
|
self.tau_jump = tau
|
|
|
|
|
|
|
|
@property
|
|
|
|
def name(self) -> str:
|
|
|
|
return self.__class__.__name__
|
2024-06-20 17:19:55 +00:00
|
|
|
|
|
|
|
@abstractmethod
|
2024-06-19 17:10:49 +00:00
|
|
|
def __repr__(self):
|
2024-06-20 17:19:55 +00:00
|
|
|
pass
|
|
|
|
|
2024-08-03 17:04:13 +00:00
|
|
|
def header(self):
|
|
|
|
return f'tau = {self._tau}'
|
|
|
|
|
2024-06-20 17:19:55 +00:00
|
|
|
@abstractmethod
|
|
|
|
def start(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@property
|
|
|
|
@abstractmethod
|
|
|
|
def mean_tau(self):
|
|
|
|
pass
|
2024-06-19 17:10:49 +00:00
|
|
|
|
2024-08-03 17:04:13 +00:00
|
|
|
def wait(self, size: int = 1) -> 'ArrayLike':
|
2024-06-30 10:06:44 +00:00
|
|
|
return self._rng.exponential(self.tau_jump, size=size)
|
2024-06-20 17:19:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
class DeltaDistribution(BaseDistribution):
|
|
|
|
|
|
|
|
def __repr__(self):
|
2024-06-30 10:06:44 +00:00
|
|
|
return f'Delta Distribution (tau={self._tau})'
|
2024-06-20 17:19:55 +00:00
|
|
|
|
|
|
|
def start(self):
|
2024-06-30 10:06:44 +00:00
|
|
|
self.tau_jump = self._tau
|
2024-06-20 17:19:55 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def mean_tau(self):
|
|
|
|
return self._tau
|
|
|
|
|
|
|
|
|
|
|
|
class LogGaussianDistribution(BaseDistribution):
|
|
|
|
def __init__(self, tau: float, sigma: float, rng: Generator):
|
|
|
|
super().__init__(tau=tau, rng=rng)
|
|
|
|
|
|
|
|
self._sigma = sigma
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return f'Log-Gaussian(tau={self._tau}, sigma={self._sigma})'
|
|
|
|
|
2024-08-03 17:04:13 +00:00
|
|
|
def header(self) -> str:
|
|
|
|
return (
|
|
|
|
f'tau = {self._tau}\n'
|
|
|
|
f'sigma = {self._sigma}'
|
|
|
|
)
|
|
|
|
|
2024-06-20 17:19:55 +00:00
|
|
|
def start(self):
|
2024-06-30 10:06:44 +00:00
|
|
|
self.tau_jump = self._rng.lognormal(np.log(self._tau), self._sigma)
|
2024-06-20 17:19:55 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def mean_tau(self):
|
|
|
|
return self._tau * np.exp(self._sigma**2 / 2)
|