def _sample_poisson_process(self, n=None, length=None): """Generate a realization of a Poisson process. Generate a poisson process sample up to count of length if time=False, otherwise generate a sample up to time t=length if time=True """ if n is not None: check_positive_integer(n) exponentials = self.rng.exponential(scale=1.0 / self.rate, size=n) s = np.array([0] + list(np.cumsum(exponentials))) return s elif length is not None: check_positive_number(length, "Sample length") t = 0 times = [0] exp_rate = 1.0 / self.rate while t < length: t += self.rng.exponential(scale=exp_rate) times.append(t) return np.array(times) else: raise ValueError("Must provide either argument n or length.")
def test_check_positive_number(positive_number_fixture, parameter_name_fixture): if positive_number_fixture <= 0: with pytest.raises(ValueError): check_positive_number(positive_number_fixture, parameter_name_fixture) else: assert check_positive_number(positive_number_fixture, parameter_name_fixture) is None
def _sample_geometric_brownian_motion(self, n, initial=1.0): """Generate a realization of geometric Brownian motion.""" check_positive_integer(n) check_positive_number(initial, "Initial") # Opt for repeated use if self._n != n: self._n = n self._line = generate_times(self.drift - self.volatility**2 / 2.0, n) noise = self.volatility * self._brownian_motion.sample(n) return initial * np.exp(self._line + noise)
def scale(self, value): check_positive_number(value, "Scale") self._scale = value
def t(self, value): check_positive_number(value, "Time end") self._t = float(value)
def volatility(self, value): check_positive_number(value, "Volatility") self._volatility = value
def variance(self, value): check_positive_number(value, "Variance") self._variance = value
def rate(self, value): check_positive_number(value, "Rate parameter") self._rate = value
def mean(self, value): check_positive_number(value, "Mean parameter") self._mean = float(value)
def alpha(self, value): check_positive_number(value) self._alpha = value