temporal_graph.py
import numpy as np
class Graph:
def __init__(self, file_path, is_directed, latest_node=None):
"""
:param file_path: graph's path
:param file_path: path of graph's file
:param is_directed: False indirected graph, True directed graph
:param latest_node: if it is a value (not None), that value represents latest not dummy node + 1
(i.e. number of not dummies nodes), in this case a transformation ('transform_constant_traversal') has been made
else it is None
"""
self.__file_path = file_path
self.__txt_list = None
self.__num_nodes = None
self.__min_time = None
self.__max_time = None
self.__edges_number = None
self.__is_directed = is_directed
self.__latest_node = latest_node
self.__chcek_latest_node()
self.__degrees_out = None
self.__degrees_in = None
def get_file_path(self):
return self.__file_path
def graph_reader(self):
with open(self.__file_path, "r") as f:
for row in f:
yield row
# if self.__txt_list is None:
# self.__txt_list = []
# with open(self.__file_path, "r") as f:
# for row in f:
# row = row.rstrip('\n')
# self.__txt_list.append(row)
# for elem in self.__txt_list:
# yield elem
def get_num_nodes(self):
# if self.__latest_node is not None:
# return self.__latest_node
if self.__num_nodes is None:
self.__graph_proprieties()
return self.__num_nodes
def get_time_interval(self):
if self.__min_time is None or self.__max_time is None:
self.__graph_proprieties()
return self.__min_time, self.__max_time
def get_latest_node(self):
return self.__latest_node
def __chcek_latest_node(self):
if self.__latest_node is not None:
if self.__latest_node > self.get_num_nodes():
raise Exception('Parameter latest_node must be less then or equal to the number of nodes in the Graph')
def get_edges_number(self):
if self.__edges_number is None:
self.__graph_proprieties()
return self.__edges_number
def get_is_directed(self):
return self.__is_directed
def get_max_deg_out(self, n=1):
if self.__degrees_out is None:
self.__get_degrees()
sorted_deg_out_index = np.argsort(-self.__degrees_out)
sorted_deg_out = self.__degrees_out[sorted_deg_out_index]
return sorted_deg_out[:n], sorted_deg_out_index[:n]
def get_max_deg_in(self, n=1):
if self.__degrees_in is None:
self.__get_degrees()
sorted_deg_in_index = np.argsort(-self.__degrees_in)
sorted_deg_in = self.__degrees_in[sorted_deg_in_index]
return sorted_deg_in[:n], sorted_deg_in_index[:n]
def __graph_proprieties(self):
max_node = -1
min_time = np.inf
max_time = np.NINF
num_edges = 0
for line in self.graph_reader():
if not line.strip(): # check if line is blank
break
li = line.split()
if 3 > len(li) > 4:
raise Exception('Line ' + line + ' not have correct number of fields')
u = int(li[0])
v = int(li[1])
t = int(li[2])
if len(li) == 4:
traversal_time = int(li[3])
else:
traversal_time = 1
if u > max_node:
max_node = u
if v > max_node:
max_node = v
if t + traversal_time > max_time:
max_time = t + traversal_time
if t < min_time:
min_time = t
num_edges += 1
max_node += 1
self.__num_nodes = max_node
self.__min_time = min_time
self.__max_time = max_time
self.__edges_number = num_edges
def __get_degrees(self):
if self.__latest_node is not None:
self.__degrees_out = np.full((self.__latest_node,), 0)
self.__degrees_in = np.full((self.__latest_node,), 0)
else:
self.__degrees_out = np.full((self.get_num_nodes(),), 0)
self.__degrees_in = np.full((self.get_num_nodes(),), 0)
for line in self.graph_reader():
if not line.strip(): # check if line is blank
break
li = line.split()
if 3 > len(li) > 4:
raise Exception('Line ' + line + ' not have correct number of fields')
u = int(li[0])
v = int(li[1])
if self.__latest_node is not None:
if u < self.__latest_node:
self.__degrees_out[u] += 1
if not self.__is_directed:
self.__degrees_in[u] += 1
if v < self.__latest_node:
self.__degrees_in[v] += 1
if not self.__is_directed:
self.__degrees_out[v] += 1
else:
self.__degrees_out[u] += 1
self.__degrees_in[v] += 1
if not self.__is_directed:
self.__degrees_out[v] += 1
self.__degrees_in[u] += 1
if __name__ == '__main__':
# g = Graph(file_path='../graphs/Dummy/transportation/grenoble-sa-sorted.txt', is_directed=True, latest_node=1547)
# print(g.get_max_deg_out(10))
from utils import util
# source_directory = '/home/marco/Coding/PycharmProjects/Temporal_graphs_diameter/graphs/Weighted/'
# source_directory = '/home/marco/Coding/PycharmProjects/Temporal_graphs_diameter/graphs/SNAP/'
# source_directory = '/home/marco/Coding/PycharmProjects/Temporal_graphs_diameter/graphs/new/'
# source_directory = '/home/marco/Coding/PycharmProjects/Temporal_graphs_diameter/graphs/misc/'
# source_directory = '/home/marco/Coding/PycharmProjects/Temporal_graphs_diameter/graphs/twitter/sorted_graphs/'
source_directory = '/home/marco/Coding/PycharmProjects/Temporal_graphs_diameter/graphs/soc-bitcoin/sorted_graphs/'
g_list = util.files_for_dimensions(source_directory)
print('GRAPH NUM_EDGES T_alpha T_omega')
for g_name in g_list:
g = Graph(file_path=source_directory + g_name, is_directed=True)
t_min, t_max = g.get_time_interval()
print(g_name + " " + str(g.get_edges_number()) + " " + str(t_min) + " " + str(t_max))