|
|
|
import typing as ty
|
|
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
|
|
class Structure:
|
|
|
|
"""Contains all the infos about the network structure(nodes labels, nodes caridinalites, edges, indexes)
|
|
|
|
|
|
|
|
:param nodes_labels_list: the symbolic names of the variables
|
|
|
|
:type nodes_labels_list: List
|
|
|
|
:param nodes_indexes_arr: the indexes of the nodes
|
|
|
|
:type nodes_indexes_arr: numpy.ndArray
|
|
|
|
:param nodes_vals_arr: the cardinalites of the nodes
|
|
|
|
:type nodes_vals_arr: numpy.ndArray
|
|
|
|
:param edges_list: the edges of the network
|
|
|
|
:type edges_list: List
|
|
|
|
:param total_variables_number: the total number of variables in the net
|
|
|
|
:type total_variables_number: int
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, nodes_labels_list: ty.List, nodes_indexes_arr: np.ndarray, nodes_vals_arr: np.ndarray,
|
|
|
|
edges_list: ty.List, total_variables_number: int):
|
|
|
|
"""Constructor Method
|
|
|
|
"""
|
|
|
|
self._nodes_labels_list = nodes_labels_list
|
|
|
|
self._nodes_indexes_arr = nodes_indexes_arr
|
|
|
|
self._nodes_vals_arr = nodes_vals_arr
|
|
|
|
self._edges_list = edges_list
|
|
|
|
self._total_variables_number = total_variables_number
|
|
|
|
|
|
|
|
@property
|
|
|
|
def edges(self) -> ty.List:
|
|
|
|
return self._edges_list
|
|
|
|
|
|
|
|
@property
|
|
|
|
def nodes_labels(self) -> ty.List:
|
|
|
|
return self._nodes_labels_list
|
|
|
|
|
|
|
|
@property
|
|
|
|
def nodes_indexes(self) -> np.ndarray:
|
|
|
|
return self._nodes_indexes_arr
|
|
|
|
|
|
|
|
@property
|
|
|
|
def nodes_values(self) -> np.ndarray:
|
|
|
|
return self._nodes_vals_arr
|
|
|
|
|
|
|
|
@property
|
|
|
|
def total_variables_number(self) -> int:
|
|
|
|
return self._total_variables_number
|
|
|
|
|
|
|
|
def get_node_id(self, node_indx: int) -> str:
|
|
|
|
"""Given the ``node_index`` returns the node label.
|
|
|
|
|
|
|
|
:param node_indx: the node index
|
|
|
|
:type node_indx: int
|
|
|
|
:return: the node label
|
|
|
|
:rtype: string
|
|
|
|
"""
|
|
|
|
return self._nodes_labels_list[node_indx]
|
|
|
|
|
|
|
|
def get_node_indx(self, node_id: str) -> int:
|
|
|
|
"""Given the ``node_index`` returns the node label.
|
|
|
|
|
|
|
|
:param node_id: the node label
|
|
|
|
:type node_id: string
|
|
|
|
:return: the node index
|
|
|
|
:rtype: int
|
|
|
|
"""
|
|
|
|
pos_indx = self._nodes_labels_list.index(node_id)
|
|
|
|
return self._nodes_indexes_arr[pos_indx]
|
|
|
|
|
|
|
|
def get_positional_node_indx(self, node_id: str) -> int:
|
|
|
|
return self._nodes_labels_list.index(node_id)
|
|
|
|
|
|
|
|
def get_states_number(self, node: str) -> int:
|
|
|
|
"""Given the node label ``node`` returns the cardinality of the node.
|
|
|
|
|
|
|
|
:param node: the node label
|
|
|
|
:type node: string
|
|
|
|
:return: the node cardinality
|
|
|
|
:rtype: int
|
|
|
|
"""
|
|
|
|
pos_indx = self._nodes_labels_list.index(node)
|
|
|
|
return self._nodes_vals_arr[pos_indx]
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return "Variables:\n" + str(self._nodes_labels_list) +"\nValues:\n"+ str(self._nodes_vals_arr) +\
|
|
|
|
"\nEdges: \n" + str(self._edges_list)
|
|
|
|
|
|
|
|
def __eq__(self, other):
|
|
|
|
"""Overrides the default implementation"""
|
|
|
|
if isinstance(other, Structure):
|
|
|
|
return set(self._nodes_labels_list) == set(other._nodes_labels_list) and \
|
|
|
|
np.array_equal(self._nodes_vals_arr, other._nodes_vals_arr) and \
|
|
|
|
np.array_equal(self._nodes_indexes_arr, other._nodes_indexes_arr) and \
|
|
|
|
self._edges_list == other._edges_list
|
|
|
|
|
|
|
|
return NotImplemented
|
|
|
|
|