parent
8ad41a1523
commit
8197fdf825
@ -0,0 +1,19 @@ |
|||||||
|
|
||||||
|
|
||||||
|
class PriorityQueue(): |
||||||
|
""" |
||||||
|
Rappresenta una semplice coda con priorità FIFO |
||||||
|
:queue: lista che contiene i valori della coda |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__(self): |
||||||
|
self.queue = [] |
||||||
|
|
||||||
|
def enqueue(self, node): |
||||||
|
self.queue.append(node) |
||||||
|
|
||||||
|
def dequeue(self): |
||||||
|
return self.queue.pop(0) |
||||||
|
|
||||||
|
def is_empty(self): |
||||||
|
return len(self.queue) == 0 |
@ -0,0 +1,68 @@ |
|||||||
|
import numpy as np |
||||||
|
import dynamic_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