|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
# License: MIT License
|
|
|
|
|
|
|
|
|
|
|
|
import unittest
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
from pyctbn.legacy.structure_graph.conditional_intensity_matrix import ConditionalIntensityMatrix
|
|
|
|
|
|
|
|
|
|
|
|
class TestConditionalIntensityMatrix(unittest.TestCase):
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def setUpClass(cls) -> None:
|
|
|
|
cls.state_res_times = np.random.rand(1, 3)[0]
|
|
|
|
cls.state_res_times = cls.state_res_times * 1000
|
|
|
|
cls.state_transition_matrix = np.random.randint(1, 10000, (3, 3))
|
|
|
|
for i in range(0, len(cls.state_res_times)):
|
|
|
|
cls.state_transition_matrix[i, i] = 0
|
|
|
|
cls.state_transition_matrix[i, i] = np.sum(cls.state_transition_matrix[i])
|
|
|
|
|
|
|
|
def test_init(self):
|
|
|
|
c1 = ConditionalIntensityMatrix(state_residence_times = self.state_res_times,
|
|
|
|
state_transition_matrix = self.state_transition_matrix)
|
|
|
|
self.assertTrue(np.array_equal(self.state_res_times, c1.state_residence_times))
|
|
|
|
self.assertTrue(np.array_equal(self.state_transition_matrix, c1.state_transition_matrix))
|
|
|
|
self.assertEqual(c1.cim.dtype, np.float)
|
|
|
|
self.assertEqual(self.state_transition_matrix.shape, c1.cim.shape)
|
|
|
|
|
|
|
|
def test_compute_cim_coefficients(self):
|
|
|
|
c1 = ConditionalIntensityMatrix(state_residence_times = self.state_res_times,
|
|
|
|
state_transition_matrix = self.state_transition_matrix)
|
|
|
|
c2 = self.state_transition_matrix.astype(np.float)
|
|
|
|
np.fill_diagonal(c2, c2.diagonal() * -1)
|
|
|
|
for i in range(0, len(self.state_res_times)):
|
|
|
|
for j in range(0, len(self.state_res_times)):
|
|
|
|
c2[i, j] = (c2[i, j] + 1) / (self.state_res_times[i] + 1)
|
|
|
|
c1.compute_cim_coefficients()
|
|
|
|
for i in range(0, len(c1.state_residence_times)):
|
|
|
|
self.assertTrue(np.isclose(np.sum(c1.cim[i]), 0.0, 1e01,1e01))
|
|
|
|
for i in range(0, len(self.state_res_times)):
|
|
|
|
for j in range(0, len(self.state_res_times)):
|
|
|
|
self.assertTrue(np.isclose(c1.cim[i, j], c2[i, j], 1e01))
|
|
|
|
|
|
|
|
def test_repr(self):
|
|
|
|
c1 = ConditionalIntensityMatrix(state_residence_times = self.state_res_times,
|
|
|
|
state_transition_matrix = self.state_transition_matrix)
|
|
|
|
print(c1)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
unittest.main()
|