def test_simu_hawkes_multi_attrs(self): """...Test multiple simulations via SimuHawkesMulti vs. single Hawkes See that multiple simulations has same attributes as a single Hawkes simulation, but different results """ hawkes = SimuHawkes(kernels=self.kernels, baseline=self.baseline, end_time=10, verbose=False, seed=504) multi = SimuHawkesMulti(hawkes, n_threads=4, n_simulations=10) multi.simulate() hawkes.simulate() np.testing.assert_array_equal(hawkes.simulation_time, multi.simulation_time) np.testing.assert_array_equal(hawkes.n_nodes, multi.n_nodes) np.testing.assert_array_equal(hawkes.end_time, multi.end_time) np.testing.assert_array_equal(hawkes.max_jumps, multi.max_jumps) np.testing.assert_array_equal(hawkes.spectral_radius(), multi.spectral_radius) self.assertTrue( all(np.array_equal(hawkes.mean_intensity(), np.array(x)) for x in multi.mean_intensity)) self.assertFalse( np.array_equal(hawkes.n_total_jumps, multi.n_total_jumps))
def test_hawkes_set_baseline_piecewiseconstant(self): """...Test Hawkes process baseline set with time and value arrays """ baselines = [[1., 2., 1.5, 4.], [2., 1.5, 4., 1.]] hawkes = SimuHawkes(baseline=baselines, period_length=3.5, kernels=self.kernels, verbose=False) hawkes.end_time = 10 hawkes.simulate() self.assertGreater(hawkes.n_total_jumps, 1)
def test_hawkes_set_baseline_timefunction(self): """...Test Hawkes process baseline set with TimeFunction """ t_values = [0.5, 1., 2., 3.5] y_values_1 = [1., 2., 1.5, 4.] y_values_2 = [2., 1.5, 4., 1.] timefunction1 = TimeFunction((t_values, y_values_1)) timefunction2 = TimeFunction((t_values, y_values_2)) hawkes = SimuHawkes(baseline=[timefunction1, timefunction2], kernels=self.kernels, verbose=False) hawkes.end_time = 10 hawkes.simulate() self.assertGreater(hawkes.n_total_jumps, 1)
def test_hawkes_mean_intensity(self): """...Test that Hawkes obtained mean intensity is consistent """ hawkes = SimuHawkes(kernels=self.kernels, baseline=self.baseline, seed=308, end_time=300, verbose=False) self.assertLess(hawkes.spectral_radius(), 1) hawkes.track_intensity(0.01) hawkes.simulate() mean_intensity = hawkes.mean_intensity() for i in range(hawkes.n_nodes): self.assertAlmostEqual(np.mean(hawkes.tracked_intensity[i]), mean_intensity[i], delta=0.3)
def test_hawkes_negative_intensity_fail(self): """...Test simulation with negative kernel without threshold_negative_intensity """ run_time = 40 hawkes = SimuHawkes(n_nodes=1, end_time=run_time, verbose=False, seed=1398) kernel = HawkesKernelExp(-1.3, .8) hawkes.set_kernel(0, 0, kernel) hawkes.set_baseline(0, 0.3) msg = 'Simulation stopped because intensity went negative ' \ '\(you could call ``threshold_negative_intensity`` to allow it\)' with self.assertRaisesRegex(RuntimeError, msg): hawkes.simulate()
def test_simu_hawkes_force_simulation(self): """...Test force_simulation parameter of SimuHawkes """ diverging_kernel = [[HawkesKernelExp(2, 3)]] hawkes = SimuHawkes(kernels=diverging_kernel, baseline=[1], verbose=False) hawkes.end_time = 10 msg = '^Simulation not launched as this Hawkes process is not ' \ 'stable \(spectral radius of 2\). You can use ' \ 'force_simulation parameter if you really want to simulate it$' with self.assertRaisesRegex(ValueError, msg): hawkes.simulate() msg = "^This process has already be simulated until time 0.000000$" with self.assertWarnsRegex(UserWarning, msg): hawkes.end_time = 0 hawkes.force_simulation = True hawkes.simulate()
def test_hawkes_negative_intensity(self): """...Test simulation with negative kernel """ run_time = 40 hawkes = SimuHawkes(n_nodes=1, end_time=run_time, verbose=False, seed=1398) kernel = HawkesKernelExp(-1.3, .8) hawkes.set_kernel(0, 0, kernel) hawkes.set_baseline(0, 0.3) hawkes.threshold_negative_intensity() dt = 0.1 hawkes.track_intensity(dt) hawkes.simulate() self.assertAlmostEqual(hawkes.tracked_intensity[0].min(), 0) self.assertAlmostEqual(hawkes.tracked_intensity[0].max(), hawkes.baseline[0]) self.assertGreater(hawkes.n_total_jumps, 1)
inter_mode=TimeFunction.InterConstRight, dt=0.1) kernel1 = HawkesKernelTimeFunc(tf1) t_values2 = np.linspace(0, 4, 20) y_values2 = np.maximum(0., np.sin(t_values2) / 4) tf2 = TimeFunction([t_values2, y_values2]) kernel2 = HawkesKernelTimeFunc(tf2) baseline = np.array([0.1, 0.3]) hawkes = SimuHawkes(baseline=baseline, end_time=run_time, verbose=False, seed=2334) hawkes.set_kernel(0, 0, kernel1) hawkes.set_kernel(0, 1, HawkesKernelExp(.5, .7)) hawkes.set_kernel(1, 1, kernel2) hawkes.simulate() em = HawkesEM(4, kernel_size=16, n_threads=8, verbose=False, tol=1e-3) em.fit(hawkes.timestamps) fig = plot_hawkes_kernels(em, hawkes=hawkes, show=False) for ax in fig.axes: ax.set_ylim([0, 1]) plt.show()