From 81ebcff839755dfe54af1dba6adad2e7de65d0a5 Mon Sep 17 00:00:00 2001 From: Brandon Rodriguez <brodriguez8774@gmail.com> Date: Thu, 29 Mar 2018 17:12:05 -0400 Subject: [PATCH] Add graph list, sorted by number of edge connections --- main.py | 6 +++++- resources/graph.py | 28 +++++++++++++++++++++++++++- tests/resources/graph.py | 22 ++++++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index e5c2c6a..d7051ee 100644 --- a/main.py +++ b/main.py @@ -24,7 +24,8 @@ node_1 = test_graph_1.add_node(edges_in=[node_0, ]) node_2 = test_graph_1.add_node(edges_in=[node_1, ]) node_3 = test_graph_1.add_node(edges_in=[node_2, ]) node_4 = test_graph_1.add_node(edges_in=[node_3, ], edges_out=[node_0, ]) -logger.info(test_graph_1.info_string()) +test_graph_1.sort_edge_count_list() +# logger.info(test_graph_1.info_string()) # Map graph to visual representation. mapper = data_mapping.DataMapping(test_graph_1, None) @@ -41,6 +42,9 @@ node_1 = test_graph_2.add_node(edges_in=[node_0, ]) node_2 = test_graph_2.add_node(edges_in=[node_1, ]) node_3 = test_graph_2.add_node(edges_in=[node_1, node_2, ], edges_out=[node_2, ]) node_4 = test_graph_2.add_node(edges_in=[node_3, ], edges_out=[node_0, node_2, ]) + +# Map graph to visual representation. +test_graph_2.sort_edge_count_list() mapper = data_mapping.DataMapping(test_graph_1, test_graph_2) mapper.draw_map() diff --git a/resources/graph.py b/resources/graph.py index 9a45de1..34f2cb9 100644 --- a/resources/graph.py +++ b/resources/graph.py @@ -18,8 +18,9 @@ class Graph(): """ def __init__(self, *args, **kwargs): self.name = None # Optional name to identify graph. - self.nodes = {} # Dict object of all nodes within graph. + self.nodes = {} # Dict object of all nodes within graph. self._auto_counter = 0 # Int to count "nameless" nodes added to graph. + self.edge_count_list = [] # List keeping track of edges each node has. # Attempt to set name. try: @@ -64,13 +65,17 @@ class Graph(): """ Adds new node to graph. """ + # Create node. new_node = Node(name=name) if edges_in is not None or edges_out is not None: new_node.add_edge(edges_in, edges_out) if new_node.name is None: count_value = self.auto_count() new_node.identifier = count_value + + # Add to node dict and edge_count list. self.nodes[new_node.identifier] = new_node + self.edge_count_list.append(new_node) return new_node @@ -101,6 +106,9 @@ class Graph(): # Find in "edges_out" list and remove. edge_node.remove_edge(edges_out=[removed_node, ]) + # Remove from edge_count list. + self.edge_count_list.remove(removed_node) + return removed_node except KeyError: logger.warning('Invalid key passed. Cannot remove node from graph.') @@ -122,6 +130,24 @@ class Graph(): for key, value in temp_dict.items(): del self.nodes[key] + def sort_edge_count_list(self): + """ + Sorts edge_count list. + """ + # print_string = '' + # logger.info('List before sorting: ') + # for node in self.edge_count_list: + # print_string += str(node.info_string() + ' ') + # logger.info(print_string) + + self.edge_count_list = sorted(self.edge_count_list, key=lambda node: (len(node.edges_in) + len(node.edges_out)), reverse=True) + + # print_string = '' + # logger.info('List after sorting: ') + # for node in self.edge_count_list: + # print_string += str(node.info_string() + ' ') + # logger.info(print_string) + def info_string(self, only_name=False, only_edges_in=False, only_edges_out=False): """ Returns information about graph. diff --git a/tests/resources/graph.py b/tests/resources/graph.py index 8ff9ce1..64dc03d 100644 --- a/tests/resources/graph.py +++ b/tests/resources/graph.py @@ -87,6 +87,28 @@ class Graph(unittest.TestCase): node = self.test_graph.get_node(0) self.assertEqual(node.identifier, 0) + def test_edge_count(self): + # Test with no edges. + self.assertEqual(self.test_graph.edge_count_list, []) + + # Test with one node. + node_0 = self.test_graph.add_node() + self.assertEqual(self.test_graph.edge_count_list, [node_0, ]) + + # Test multiple nodes. + node_1 = self.test_graph.add_node() + node_2 = self.test_graph.add_node(edges_in=[node_1, ], edges_out=[node_1, ]) + node_3 = self.test_graph.add_node(edges_in=[node_2, ], edges_out=[node_1, node_2, ]) + node_4 = self.test_graph.add_node() + node_5 = self.test_graph.add_node(edges_out=[node_4]) + self.assertEqual(self.test_graph.edge_count_list, [node_0, node_1, node_2, node_3, node_4, node_5, ]) + + node_6 = self.test_graph.add_node() + self.test_graph.sort_edge_count_list() + self.assertEqual(self.test_graph.edge_count_list, [node_0, node_1, node_2, node_3, node_4, node_5, node_6]) + # Note: The only way (I can find) to check that list is properly sorted is to print before and after, and + # manually check. + class Node(unittest.TestCase): def setUp(self): -- GitLab