-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnetw.py
96 lines (78 loc) · 2.99 KB
/
netw.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import networkx as nx
from functools import partial
from operator import is_not
class Network:
def __init__(self, g):
self.__graph = g
self.__message_count = 0
self.memory = False
self.mem_threshold = 0
nx.set_node_attributes(self.__graph, frozenset(), 'seen')
def do_memorize(self):
self.memory = True
def undo_memorize(self):
self.memory = False
@property
def graph(self):
return self.__graph
@property
def message_count(self):
return self.__message_count
@graph.setter
def graph(self, g):
self.__graph = g
@message_count.setter
def message_count(self, count):
self.__message_count = count
def inc_message_count(self):
self.__message_count += 1
def dec_message_count(self):
self.__message_count -= 1
def add_msg_random(self, msg):
for edge in nx.edges(self.graph):
self.add_message(msg, edge)
break
def add_message(self, message, edge):
message.sender = edge[0]
message.receiver = edge[1]
self.inc_message_count()
message.stamp = self.message_count
msg = nx.get_edge_attributes(self.graph, 'messages')
new_messages = list()
if edge in msg.keys():
old_messages = msg[edge]
new_messages.extend(map((lambda x: x.inc_time()), filter(partial(is_not, None), old_messages)))
new_messages.append(message)
self.graph[edge[0]][edge[1]]['messages'] = new_messages
def memorize(self, n, id):
if not self.memory:
return
seen = list(self.graph.nodes[n]['seen'])
seen.append(id)
newSet = frozenset(seen)
self.graph.nodes[n]['seen'] = newSet
def broadcast(self, time):
msg = nx.get_edge_attributes(self.graph, 'messages')
for edge in nx.edges(self.graph):
if edge not in msg.keys():
continue
messages = list(filter(partial(is_not, None), msg[edge]))
for message in messages:
m = [i for i in messages if i.stamp != message.stamp]
self.dec_message_count()
self.graph[edge[0]][edge[1]]['messages'] = m
if message.receiver == message.destination:
print('Message ', message.id, 'delivered to ', message.destination)
continue
message.inc_time()
sender = message.sender
message.sender = message.receiver
for neighbour in nx.all_neighbors(self.graph, message.receiver):
if neighbour == sender:
continue
seen = self.graph.node[neighbour]['seen']
if message.id in seen:
continue
self.memorize(neighbour, message.id)
message.receiver = neighbour
self.add_message(message, (message.sender, message.receiver))