From e4b0e301b01009c74e1a6af93f17982fc67032ef Mon Sep 17 00:00:00 2001 From: kovanarastirmalabi Date: Sat, 22 May 2021 20:40:47 +0300 Subject: [PATCH 1/4] Added my name to Contributors list --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 6b324da..e2a9b5c 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,3 +1,4 @@ # Contributors - [Berker Acır](https://github.com/berkeracir) +- [Ilyas Eren Yilmaz](https://github.com/ilyaserenyilmaz) -- GitLab From fb0425cbb22e9bc38f220b01be2ac564448f0070 Mon Sep 17 00:00:00 2001 From: kovanarastirmalabi Date: Wed, 26 May 2021 02:28:38 +0300 Subject: [PATCH 2/4] Implemented Tree and Echo Algorithms --- WaveAlgorithms/EchoAlgorithm.py | 75 +++++++++++++++++++++++ WaveAlgorithms/TreeAlgorithm.py | 47 ++++++++++++++ tests/WaveAlgorithms/testEchoAlgorithm.py | 28 +++++++++ tests/WaveAlgorithms/testTreeAlgorithm.py | 32 ++++++++++ 4 files changed, 182 insertions(+) create mode 100644 WaveAlgorithms/EchoAlgorithm.py create mode 100644 WaveAlgorithms/TreeAlgorithm.py create mode 100644 tests/WaveAlgorithms/testEchoAlgorithm.py create mode 100644 tests/WaveAlgorithms/testTreeAlgorithm.py diff --git a/WaveAlgorithms/EchoAlgorithm.py b/WaveAlgorithms/EchoAlgorithm.py new file mode 100644 index 0000000..3ef7778 --- /dev/null +++ b/WaveAlgorithms/EchoAlgorithm.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +import time +import random +from Ahc import * +from itertools import chain + +#Please close prints if you are working with big graphs for better results. + +def startEchoAlgorithm(echoTopology): + # print(echoTopology.nodes) + initiator = random.choice(list(echoTopology.nodes.values())) + initiator.startEchoAlgorithm() + +class EchoNode(ComponentModel): + + def __init__(self, componentname, componentid): + super().__init__(componentname, componentid) + self.isInitiator = False + self.isFirstMessage = True + + def on_init(self, eventobj: Event): + print(f"Initializing {self.componentname}.{self.componentinstancenumber}") + + def on_message_from_bottom(self, eventobj: Event): + if self.isFirstMessage: + self.remainingNeighbours = self.connectors[ConnectorTypes.DOWN] + + for ch in self.remainingNeighbours: + # print(f"EventSource: {eventobj.eventsource} Channel Conns: {chain(*ch.connectors.values())}") + if eventobj.eventsource in chain(*ch.connectors.values()): + channel = ch + break + + self.remainingNeighbours.remove(channel) + + if self.isFirstMessage: + for ch in self.remainingNeighbours: + print(f"{self.componentname}.{self.componentinstancenumber} sends message to {ch.componentname}.{ch.componentinstancenumber}") + ch.trigger_event(Event(self, EventTypes.MFRT, eventobj.eventcontent)) + self.isFirstMessage = False + self.parent = channel + + if len(self.remainingNeighbours) == 0: + print(f"{self.componentname}.{self.componentinstancenumber} has received message from all neighbours.") + if self.isInitiator: + self.decide() + + else: + print(f"{self.componentname}.{self.componentinstancenumber} sends message to parent {self.parent.componentname}.{self.parent.componentinstancenumber}") + self.parent.trigger_event(Event(self, EventTypes.MFRT, eventobj.eventcontent)) + + else: + # print(f"{self.componentname}.{self.componentinstancenumber}: Channel {channel.componentinstancenumber} removed") + #do nothing + pass + + def send_down(self, event: Event): + try: + for p in self.connectors[ConnectorTypes.DOWN]: + print(f"{self.componentname}.{self.componentinstancenumber} sends message to {p.componentname}.{p.componentinstancenumber}") + p.trigger_event(event) + except: + pass + + def startEchoAlgorithm(self): + self.isInitiator = True + self.isFirstMessage = False + self.remainingNeighbours = self.connectors[ConnectorTypes.DOWN] + print(f"{self.componentname}.{self.componentinstancenumber} is the initiator.") + + self.send_down(Event(self, EventTypes.MFRT, None)) + + def decide(self): + print(f"{self.componentname}.{self.componentinstancenumber} decides.") + print(f"End Time: {time.time()}") diff --git a/WaveAlgorithms/TreeAlgorithm.py b/WaveAlgorithms/TreeAlgorithm.py new file mode 100644 index 0000000..310f76f --- /dev/null +++ b/WaveAlgorithms/TreeAlgorithm.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +import time +from Ahc import * +from itertools import chain + +def startTreeAlgorithm(treeTopology): + for node in treeTopology.nodes.values(): + node.startTreeAlgorithm() + +class TreeNode(ComponentModel): + + def on_init(self, eventobj: Event): + print(f"Initializing {self.componentname}.{self.componentinstancenumber}") + + def on_message_from_bottom(self, eventobj: Event): + for ch in self.unvisitedNeighbours: + # print(f"EventSource: {eventobj.eventsource} Channel Conns: {chain(*ch.connectors.values())}") + if eventobj.eventsource in chain(*ch.connectors.values()): + channel = ch + break + + self.unvisitedNeighbours.remove(channel) + # self.parent = eventobj.eventsource + if len(self.unvisitedNeighbours) == 0: + self.decide() + elif len(self.unvisitedNeighbours) == 1: + self.parent = self.unvisitedNeighbours[0] + print(f"{self.componentname}.{self.componentinstancenumber} sends message to {self.parent.componentname}.{self.parent.componentinstancenumber}") + self.parent.trigger_event(Event(self, EventTypes.MFRT, eventobj.eventcontent)) + else: + #do nothing + pass + + def startTreeAlgorithm(self): + self.unvisitedNeighbours = self.connectors[ConnectorTypes.DOWN] + # print(f"{self.componentname}.{self.componentinstancenumber} Neighbours: {self.unvisitedNeighbours}") + + if len(self.connectors[ConnectorTypes.DOWN]) == 1: + self.parent = self.unvisitedNeighbours[0] + print(f"{self.componentname}.{self.componentinstancenumber} sends message to {self.parent.componentname}.{self.parent.componentinstancenumber}") + self.send_down(Event(self, EventTypes.MFRT, None)) + self.unvisitedNeighbours = [] + + def decide(self): + print(f"{self.componentname}.{self.componentinstancenumber} decides.") + print(f"End Time: {time.time()}") + diff --git a/tests/WaveAlgorithms/testEchoAlgorithm.py b/tests/WaveAlgorithms/testEchoAlgorithm.py new file mode 100644 index 0000000..0a08794 --- /dev/null +++ b/tests/WaveAlgorithms/testEchoAlgorithm.py @@ -0,0 +1,28 @@ +import os +import sys +import time +import random + +sys.path.insert(0, os.getcwd()) + +from Channels import Channel +from WaveAlgorithms.EchoAlgorithm import * + +def main(): + + G = nx.random_geometric_graph(80, 0.5) + nx.draw(G, with_labels=True, font_weight='bold') + plt.draw() + + topo = Topology() + topo.construct_from_graph(G, EchoNode, Channel) + # topo.start() + # time.sleep(3) + start = time.time() + startEchoAlgorithm(topo) + print(f"Start Time: {start}") + plt.show() + while (True): pass + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tests/WaveAlgorithms/testTreeAlgorithm.py b/tests/WaveAlgorithms/testTreeAlgorithm.py new file mode 100644 index 0000000..d5bc332 --- /dev/null +++ b/tests/WaveAlgorithms/testTreeAlgorithm.py @@ -0,0 +1,32 @@ +import os +import sys +import random +import networkx as nx +import matplotlib.pyplot as plt + +sys.path.insert(0, os.getcwd()) + +from Channels import Channel +from WaveAlgorithms.TreeAlgorithm import * + +def main(): + + G = nx.random_geometric_graph(190, 0.5) + MST = nx.minimum_spanning_tree(G) + + nx.draw(MST, with_labels=True, font_weight='bold') + plt.draw() + + topo = Topology() + topo.construct_from_graph(MST, TreeNode, Channel) + # topo.start() + start = time.time() + startTreeAlgorithm(topo) + print(f"Start Time: {start}") + + + plt.show() + while (True): pass + +if __name__ == "__main__": + main() \ No newline at end of file -- GitLab From f8bdc547ec45e3e00c5f8aacdfe36715ae30d50e Mon Sep 17 00:00:00 2001 From: WINS Laboratory Date: Thu, 26 Aug 2021 13:43:06 +0300 Subject: [PATCH 3/4] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index e2a9b5c..95426ad 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,4 +1,8 @@ # Contributors - [Berker Acır](https://github.com/berkeracir) +- [Osman Ufuk Yağmur](https://github.com/VengerA) +- [Berke Tezergil](https://github.com/btezergil) +- [Saim Sunel](https://github.com/SaimSUNEL) +- [Ozan Akın](https://github.com/oznakn) - [Ilyas Eren Yilmaz](https://github.com/ilyaserenyilmaz) -- GitLab From 09121432db29618115ca3bfed6ea431a63090339 Mon Sep 17 00:00:00 2001 From: WINS Laboratory Date: Thu, 26 Aug 2021 13:43:36 +0300 Subject: [PATCH 4/4] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 95426ad..3a1d36c 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -5,4 +5,3 @@ - [Berke Tezergil](https://github.com/btezergil) - [Saim Sunel](https://github.com/SaimSUNEL) - [Ozan Akın](https://github.com/oznakn) -- [Ilyas Eren Yilmaz](https://github.com/ilyaserenyilmaz) -- GitLab