parent
5051b484f9
commit
8a9a0d44ed
@ -0,0 +1,20 @@ |
||||
import conditional_intensity_matrix as cim |
||||
import numpy as np |
||||
|
||||
|
||||
class AmalgamatedCims: |
||||
|
||||
def __init__(self, states_number,list_of_keys, list_of_matrices_dims): |
||||
self.actual_cims = {} |
||||
self.init_cims_structure(list_of_keys, list_of_matrices_dims) |
||||
self.states_per_variable = states_number |
||||
|
||||
def init_cims_structure(self, keys, dims): |
||||
for key, dim in (keys, dims): |
||||
self.actual_cims[key] = np.empty(dim, dtype=cim.ConditionalIntensityMatrix) |
||||
for block_matrix in self.actual_cims.values(): |
||||
for matrix in block_matrix: |
||||
matrix = cim.ConditionalIntensityMatrix(self.states_per_variable) |
||||
|
||||
def compute_matrix_indx(self, row, col): |
||||
return self.state_per_variable * row + col |
@ -0,0 +1,9 @@ |
||||
import numpy as np |
||||
|
||||
|
||||
class ConditionalIntensityMatrix: |
||||
|
||||
def __init__(self, dimension): |
||||
self.state_residence_times = np.zeros(shape=(1, dimension)) |
||||
self.state_transition_matrix = np.zeros(shape=(dimension, dimension)) |
||||
self.cim = np.zeros(shape=(dimension, dimension)) |
@ -1,68 +0,0 @@ |
||||
import numpy as np |
||||
import network_graph as dg |
||||
import sample_path as sp |
||||
import priority_queue as pq |
||||
|
||||
|
||||
class RateMatrix(): |
||||
""" |
||||
Rappresenta la matrice Q di una generica CTMC costruita a partire dalle informazioni contenute nel grafo dinamico |
||||
""" |
||||
def __init__(self, graph, dim): |
||||
self.graph = graph |
||||
self.matrix = np.zeros(shape=(dim,dim)) |
||||
self.pr_queue = pq.PriorityQueue() |
||||
|
||||
def build_matrix(self): |
||||
root = self.graph.get_root_node() |
||||
root.color = dg.node.Color.GRAY |
||||
self.pr_queue.enqueue(root) |
||||
|
||||
|
||||
while not self.pr_queue.is_empty(): |
||||
n = self.pr_queue.dequeue() |
||||
adjacency_list = self.graph.get_neighbours(n) |
||||
#print(adjacency_list) |
||||
time = self.graph.graph[n.state_id]["Time"] |
||||
sum_of_qs = 0.0 |
||||
for nd, weight in adjacency_list.items(): |
||||
sum_of_qs += self.calculate_off_diagonal_element_and_fill_matrix(n.node_id, nd.node_id, weight, time) |
||||
if self.graph.graph[nd.state_id]["Node"].color == dg.node.Color.WHITE: |
||||
self.graph.graph[nd.state_id]["Node"].color = dg.node.Color.GRAY |
||||
self.pr_queue.enqueue(nd) |
||||
n.color = dg.node.Color.BLACK |
||||
self.calculate_diagonal_element_and_fill_matrix(sum_of_qs, n.node_id) |
||||
|
||||
|
||||
def calculate_off_diagonal_element_and_fill_matrix(self, start_node, arrival_node, weight, time): |
||||
q = weight / time |
||||
self.matrix[start_node][arrival_node] = q |
||||
return q |
||||
|
||||
def calculate_diagonal_element_and_fill_matrix(self, sum_of_qs, start_node): |
||||
self.matrix[start_node][start_node] = -sum_of_qs |
||||
|
||||
|
||||
# A Simple Test # |
||||
s1 = sp.SamplePath() |
||||
s1.build_trajectories() |
||||
print(s1.get_number_trajectories()) |
||||
|
||||
g1 = dg.DynamicGraph(s1) |
||||
g1.build_graph() |
||||
print(g1.graph) |
||||
#print(g1.states_number) |
||||
|
||||
Q = RateMatrix(g1, g1.states_number) |
||||
#print(Q.matrix) |
||||
Q.build_matrix() |
||||
print(Q.matrix) |
||||
|
||||
non_zero_values = 0 |
||||
val = 0.0 |
||||
for coeff in Q.matrix[0][1:]: |
||||
if(coeff != 0): |
||||
non_zero_values += 1 |
||||
val += coeff |
||||
|
||||
print(non_zero_values == len(Q.graph.graph["222"]["Arcs"].keys())) |
Reference in new issue