diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 6b324dac56e47877995ad21812e37b4179d33526..3a1d36c7a6d6df84b5f598be354a0f2e149fb0e5 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -1,3 +1,7 @@ # 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) diff --git a/WaveAlgorithms/EchoAlgorithm.py b/WaveAlgorithms/EchoAlgorithm.py new file mode 100644 index 0000000000000000000000000000000000000000..3ef7778e5c6f62caf3ce86381d1079d6788c4fb0 --- /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 0000000000000000000000000000000000000000..310f76fb9696b31275fad307e68f5154bcee33ae --- /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 0000000000000000000000000000000000000000..0a08794d147b582ed7fdfb009cba4485db17b8e9 --- /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 0000000000000000000000000000000000000000..d5bc332e313dac1a3fd940cc7ef287e93729a1cc --- /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