chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,188 @@
|
||||
import unittest
|
||||
|
||||
import easygraph as eg
|
||||
|
||||
|
||||
def _get_cpp_module():
|
||||
try:
|
||||
import cpp_easygraph
|
||||
return cpp_easygraph
|
||||
except ImportError:
|
||||
return None
|
||||
|
||||
|
||||
def _to_undirected_cpp(G_cpp_digraph):
|
||||
import cpp_easygraph
|
||||
|
||||
G_cpp = cpp_easygraph.Graph()
|
||||
G_cpp.graph.update(G_cpp_digraph.graph)
|
||||
for node, node_attr in G_cpp_digraph.nodes.items():
|
||||
G_cpp.add_node(node, **node_attr)
|
||||
|
||||
seen_edges = set()
|
||||
for u, v, edge_data in G_cpp_digraph.edges:
|
||||
edge = (min(u, v), max(u, v))
|
||||
if edge not in seen_edges:
|
||||
seen_edges.add(edge)
|
||||
G_cpp.add_edge(u, v, **edge_data)
|
||||
|
||||
return G_cpp
|
||||
|
||||
|
||||
class TestLocalsearch(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.G_simple = eg.Graph()
|
||||
self.G_simple.add_edges_from([(0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (1, 3), (1, 4), (1, 5)])
|
||||
|
||||
self.G_disconnected = eg.Graph()
|
||||
self.G_disconnected.add_edges_from([(0, 1), (2, 3), (4, 5)])
|
||||
|
||||
self.G_single = eg.Graph()
|
||||
self.G_single.add_node(42)
|
||||
|
||||
self.G_empty = eg.Graph()
|
||||
|
||||
def _get_cpp_module(self):
|
||||
return _get_cpp_module()
|
||||
|
||||
def test_localsearch_simple(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_simple.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
result = cpeg.cpp_localsearch(G_cpp, seed=163)
|
||||
|
||||
self.assertIsInstance(result, tuple)
|
||||
self.assertEqual(len(result), 6)
|
||||
y_partition = result[3]
|
||||
self.assertIsInstance(y_partition, dict)
|
||||
|
||||
all_nodes = set(self.G_simple.nodes)
|
||||
result_nodes = set(y_partition.keys())
|
||||
self.assertEqual(all_nodes, result_nodes)
|
||||
|
||||
def test_localsearch_disconnected(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_disconnected.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
result = cpeg.cpp_localsearch(G_cpp, seed=163)
|
||||
|
||||
self.assertIsInstance(result, tuple)
|
||||
self.assertEqual(len(result), 6)
|
||||
y_partition = result[3]
|
||||
self.assertIsInstance(y_partition, dict)
|
||||
|
||||
all_nodes = set(self.G_disconnected.nodes)
|
||||
result_nodes = set(y_partition.keys())
|
||||
self.assertEqual(all_nodes, result_nodes)
|
||||
|
||||
def test_localsearch_single_node(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_single.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
result = cpeg.cpp_localsearch(G_cpp, seed=163)
|
||||
|
||||
self.assertIsInstance(result, tuple)
|
||||
self.assertEqual(len(result), 6)
|
||||
y_partition = result[3]
|
||||
self.assertIsInstance(y_partition, dict)
|
||||
self.assertIn(42, y_partition)
|
||||
|
||||
def test_localsearch_empty_graph(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_empty.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
result = cpeg.cpp_localsearch(G_cpp, seed=163)
|
||||
|
||||
self.assertIsInstance(result, tuple)
|
||||
self.assertEqual(len(result), 6)
|
||||
y_partition = result[3]
|
||||
self.assertIsInstance(y_partition, dict)
|
||||
|
||||
def test_localsearch_maximum_tree_true(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_simple.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
result = cpeg.cpp_localsearch(G_cpp, maximum_tree=True, seed=163)
|
||||
|
||||
self.assertIsInstance(result, tuple)
|
||||
self.assertEqual(len(result), 6)
|
||||
y_partition = result[3]
|
||||
self.assertIsInstance(y_partition, dict)
|
||||
|
||||
def test_localsearch_maximum_tree_false(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_simple.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
result = cpeg.cpp_localsearch(G_cpp, maximum_tree=False, seed=163)
|
||||
|
||||
self.assertIsInstance(result, tuple)
|
||||
self.assertEqual(len(result), 6)
|
||||
y_partition = result[3]
|
||||
self.assertIsInstance(y_partition, dict)
|
||||
|
||||
def test_localsearch_auto_choose_centers(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_simple.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
result = cpeg.cpp_localsearch(G_cpp, auto_choose_centers=True, seed=163)
|
||||
|
||||
self.assertIsInstance(result, tuple)
|
||||
self.assertEqual(len(result), 6)
|
||||
y_partition = result[3]
|
||||
self.assertIsInstance(y_partition, dict)
|
||||
|
||||
def test_localsearch_center_num(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_simple.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
result = cpeg.cpp_localsearch(G_cpp, center_num=2, seed=163)
|
||||
|
||||
self.assertIsInstance(result, tuple)
|
||||
self.assertEqual(len(result), 6)
|
||||
y_partition = result[3]
|
||||
self.assertIsInstance(y_partition, dict)
|
||||
|
||||
def test_localsearch_with_seed_reproducibility(self):
|
||||
cpeg = self._get_cpp_module()
|
||||
if cpeg is None:
|
||||
self.skipTest("cpp_easygraph module not available")
|
||||
|
||||
G_cpp = self.G_simple.cpp()
|
||||
G_cpp.generate_linkgraph('weight')
|
||||
|
||||
result1 = cpeg.cpp_localsearch(G_cpp, seed=42)
|
||||
result2 = cpeg.cpp_localsearch(G_cpp, seed=42)
|
||||
|
||||
self.assertIsInstance(result1, tuple)
|
||||
self.assertIsInstance(result2, tuple)
|
||||
y_partition1 = result1[3]
|
||||
y_partition2 = result2[3]
|
||||
self.assertEqual(y_partition1.keys(), y_partition2.keys())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user