import typing import numpy as np import conditional_intensity_matrix as cim class SetOfCims: """ Aggregates all the CIMS of the node identified by the label _node_id. :_node_id: the node label :_parents_states_number: the cardinalities of the parents :_node_states_number: the caridinality of the node :_p_combs: the relative p_comb structure :state_residence_time: matrix containing all the state residence time vectors for the node :_transition_matrices: matrix containing all the transition matrices for the node :_actual_cims: the cims of the node """ def __init__(self, node_id: str, parents_states_number: typing.List, node_states_number: int, p_combs: np.ndarray): """ Parameters: :_node_id: the node label :_parents_states_number: the cardinalities of the parents :_node_states_number: the caridinality of the node :_p_combs: the relative p_comb structure """ self._node_id = node_id self._parents_states_number = parents_states_number self._node_states_number = node_states_number self._actual_cims = [] self._state_residence_times = None self._transition_matrices = None self._p_combs = p_combs self.build_times_and_transitions_structures() def build_times_and_transitions_structures(self): """ Initializes at the correct dimensions the state residence times matrix and the state transition matrices Parameters: :void Returns: :void """ if not self._parents_states_number: self._state_residence_times = np.zeros((1, self._node_states_number), dtype=np.float) self._transition_matrices = np.zeros((1, self._node_states_number, self._node_states_number), dtype=np.int) else: self._state_residence_times = \ np.zeros((np.prod(self._parents_states_number), self._node_states_number), dtype=np.float) self._transition_matrices = np.zeros([np.prod(self._parents_states_number), self._node_states_number, self._node_states_number], dtype=np.int) def build_cims(self, state_res_times: np.ndarray, transition_matrices: np.ndarray): """ Build the ConditionalIntensityMatrix object given the state residence times and transitions matrices. Compute the cim coefficients. Parameters: :state_res_times: the state residence times matrix :_transition_matrices: the transition matrices Returns: :void """ for state_res_time_vector, transition_matrix in zip(state_res_times, transition_matrices): cim_to_add = cim.ConditionalIntensityMatrix(state_res_time_vector, transition_matrix) cim_to_add.compute_cim_coefficients() self._actual_cims.append(cim_to_add) self._actual_cims = np.array(self._actual_cims) self._transition_matrices = None self._state_residence_times = None def filter_cims_with_mask(self, mask_arr: np.ndarray, comb: typing.List) -> np.ndarray: """ Filter the cims contained in the array _actual_cims given the boolean mask mask_arr and the index comb. Parameters: :mask_arr: the boolean mask :comb: the indexes of the selected cims Returns: :Array of ConditionalIntensityMatrix """ if mask_arr.size <= 1: return self._actual_cims else: flat_indxs = np.argwhere(np.all(self._p_combs[:, mask_arr] == comb, axis=1)).ravel() return self._actual_cims[flat_indxs] @property def actual_cims(self) -> np.ndarray: return self._actual_cims @property def p_combs(self) -> np.ndarray: return self._p_combs def get_cims_number(self): return len(self._actual_cims)