1
0
Fork 0

Refactor parameters_est class

parallel_struct_est
philpMartin 4 years ago
parent c60001426a
commit 5e820a38d8
  1. 170
      main_package/classes/parameters_estimator.py

@ -1,5 +1,4 @@
import os
import time as tm
from line_profiler import LineProfiler
import numba as nb
@ -14,10 +13,6 @@ class ParametersEstimator:
def __init__(self, sample_path, net_graph):
self.sample_path = sample_path
self.net_graph = net_graph
#self.scalar_indexes_converter = self.net_graph.
#self.columns_filtering_structure = self.net_graph.filtering_structure
#self.transition_scalar_index_converter = self.net_graph.transition_scalar_indexing_structure
#self.transition_filtering = self.net_graph.transition_filtering
self.amalgamated_cims_struct = None
def init_amalgamated_cims_struct(self):
@ -25,169 +20,6 @@ class ParametersEstimator:
self.net_graph.get_nodes(),
self.net_graph.get_ordered_by_indx_parents_values_for_all_nodes())
def parameters_estimation(self):
print("Starting computing")
t0 = tm.time()
for trajectory in self.sample_path.trajectories:
#tr_length = trajectory.size()
self.parameters_estimation_single_trajectory(trajectory.get_trajectory())
#print("Finished Trajectory number", indx)
t1 = tm.time() - t0
print("Elapsed Time ", t1)
def parameters_estimation_single_trajectory(self, trajectory):
row_length = trajectory.shape[1]
for indx, row in enumerate(trajectory[:-1]):
self.compute_sufficient_statistics_for_trajectory(trajectory.times, trajectory.actual_trajectory, trajectory.transitions, row_length)
def compute_sufficient_statistics_for_trajectory(self, times, traj_values, traj_transitions, row_length):
#time = self.compute_time_delta(current_row, next_row)
#time = current_row[0]
print(times)
print(traj_values)
print(traj_transitions)
for row in traj_transitions:
time = times[0]
for indx in range(0, row_length):
if row[indx] == 1:
which_node = indx
transition = [which_node, (traj_values[indx - 1], traj_values[indx])]
which_matrix = self.which_matrix_to_update(row, which_node)
which_element = transition[1]
self.amalgamated_cims_struct.update_state_transition_for_matrix(which_node, which_matrix, which_element)
which_element = transition[1][0]
self.amalgamated_cims_struct.update_state_residence_time_for_matrix(which_node, which_matrix,
which_element,
time)
else:
which_node = indx
which_matrix = self.which_matrix_to_update(row, which_node)
which_element = row[indx]
self.amalgamated_cims_struct.update_state_residence_time_for_matrix(
which_node, which_matrix, which_element, time)
def which_matrix_to_update(self, current_row, node_indx):
#print(type(self.fancy_indexing_structure[node_indx]))
return tuple(current_row.take(self.fancy_indexing_structure[node_indx]))
#return tuple(ParametersEstimator.taker(current_row, self.fancy_indexing_structure[node_indx]))
def parameters_estimation_for_variable_multiple_parents(self, node_indx, times, transitions ,variable_values, parents_values):
#print(times)
#print(variable_values)
#print(parents_values)
#print("Starting computing")
#t0 = tm.time()
for indx, row in enumerate(variable_values):
time = times[indx]
which_matrix = tuple(parents_values[indx]) # questo è un vettore
current_state = variable_values[indx]
if transitions[indx] == 1:
prev_state = variable_values[indx - 1]
transition = [node_indx, (prev_state, current_state)]
#which_node = transition[0]
which_element = transition[1]
self.amalgamated_cims_struct.update_state_transition_for_matrix(node_indx, which_matrix, which_element)
#which_element = current_state
self.amalgamated_cims_struct.update_state_residence_time_for_matrix(node_indx, which_matrix,
current_state,
time)
def parameters_estimation_for_variable_single_parent(self, node_indx, times, transitions, variable_values,
parents_values):
for indx, row in enumerate(variable_values):
time = times[indx]
which_matrix = parents_values[indx] # Avendo un solo parent questo è uno scalare
current_state = variable_values[indx]
#which_matrix = ParametersEstimator.taker(parents_values, indx)
# print(which_matrix.dtype)
if transitions[indx] == 1:
prev_state = variable_values[indx - 1]
transition = [node_indx, (prev_state, current_state)]
which_element = transition[1]
self.amalgamated_cims_struct.update_state_transition_for_matrix(node_indx, which_matrix,
which_element)
which_element = current_state
self.amalgamated_cims_struct.update_state_residence_time_for_matrix(node_indx, which_matrix,
which_element,time)
def parameters_estimation_for_variable_no_parent(self, node_indx, times, transitions,variable_values):
for indx, row in enumerate(variable_values):
time = times[indx]
which_matrix = 0
current_state = variable_values[indx]
"""if transitions[indx] == 1:
prev_state = variable_values[indx - 1]
#current_state = variable_values[indx]
transition = [node_indx, (prev_state, current_state)]
which_element = transition[1]
self.amalgamated_cims_struct.update_state_transition_for_matrix(node_indx, which_matrix,
which_element)"""
which_element = current_state
self.amalgamated_cims_struct.update_state_residence_time_for_matrix(node_indx, which_matrix,
which_element,
time)
def parameters_estimation_for_variable_no_parent_in_place(self, node_indx, times, transitions, variable_values):
state_trans_matrix = np.zeros(shape=(3,3), dtype=np.int)
state_res_time_array = np.zeros(shape=(3), dtype=np.float)
for indx, row in enumerate(variable_values):
time = times[indx]
#which_matrix = 0
current_state = variable_values[indx]
if transitions[indx] == 1:
prev_state = variable_values[indx - 1]
#current_state = variable_values[indx]
transition = [node_indx, (prev_state, current_state)]
which_element = transition[1]
#self.amalgamated_cims_struct.update_state_transition_for_matrix(node_indx, which_matrix,
#which_element)
state_trans_matrix[which_element] += 1
which_element = current_state
#self.amalgamated_cims_struct.update_state_residence_time_for_matrix(node_indx, which_matrix,
#which_element,
#time)
state_res_time_array[which_element] += time
def parameters_estimation_for_variable_single_parent_in_place(self, node_indx, times, transitions, variable_values,
parents_values,values_tuple):
state_res_time_dim = values_tuple[1:]
state_trans_matricies = np.zeros(shape=27, dtype=np.int)
state_res_time_array = np.zeros(shape=9, dtype=np.float)
state_transition_indx = np.array(values_tuple, dtype=np.int)
for indx, row in enumerate(variable_values):
time = times[indx]
#which_matrix = np.ravel_multi_index(parents_values[indx], ) # Avendo un solo parent questo è uno scalare
#current_state = variable_values[indx]
#which_matrix = ParametersEstimator.taker(parents_values, indx)
state_transition_indx[0] = parents_values[indx]
state_transition_indx[1] = variable_values[indx]
# print(which_matrix.dtype)
if transitions[indx] == 1:
state_transition_indx[2] = variable_values[indx - 1]
#transition = [node_indx, (prev_state, current_state)]
#which_element = transition[1]
#self.amalgamated_cims_struct.update_state_transition_for_matrix(node_indx, which_matrix,
#which_element)
scalar_indx = np.ravel_multi_index(state_transition_indx, values_tuple)
print("State Transition", scalar_indx)
state_trans_matricies[scalar_indx] += 1
scalar_indx = np.ravel_multi_index(state_transition_indx[:-1], state_res_time_dim)
print("Res Time",scalar_indx)
state_res_time_array[scalar_indx] += time
#which_element = current_state
#self.amalgamated_cims_struct.update_state_residence_time_for_matrix(node_indx, which_matrix,
#which_element,time)
#t1 = tm.time() - t0
#print("Elapsed Time ", t1)
def compute_parameters(self):
for node_indx, set_of_cims in enumerate(self.amalgamated_cims_struct.sets_of_cims):
self.compute_state_res_time_for_node(node_indx, self.sample_path.trajectories.times,
@ -247,8 +79,6 @@ class ParametersEstimator:
#print(M)
def compute_state_transitions_for_all_nodes(self):
for node_indx, set_of_cims in enumerate(self.amalgamated_cims_struct.sets_of_cims):
self.compute_state_transitions_for_a_node(node_indx, self.sample_path.trajectories[0].get_complete_trajectory(),