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