From 48661fcdc17f498ca60f32c438e4cad94157f7f5 Mon Sep 17 00:00:00 2001 From: fabratu Date: Fri, 22 Mar 2024 09:13:43 +0100 Subject: [PATCH 1/3] Add test for PowerlawDegreeSequence with graph as input + format file using black formatter. --- networkit/test/test_generators.py | 86 +++++++++++++++++++------------ 1 file changed, 52 insertions(+), 34 deletions(-) diff --git a/networkit/test/test_generators.py b/networkit/test/test_generators.py index 87e4347197..956b072413 100755 --- a/networkit/test/test_generators.py +++ b/networkit/test/test_generators.py @@ -2,11 +2,12 @@ import unittest import networkit as nk + class TestGraph(unittest.TestCase): - + def setUp(self): self.G = nk.readGraph("input/looptest1.gml", nk.Format.GML) - + def testClusteredRandomGraphGenerator(self): n, k = 100, 10 pIntra, pInter = 0.1, 0.05 @@ -16,22 +17,22 @@ def testClusteredRandomGraphGenerator(self): nCommunities = len(set(gen.getCommunities().getVector())) self.assertGreater(nCommunities, 0) self.assertLessEqual(nCommunities, k) - + def testBarabasiAlbertGenerator(self): g = nk.generators.BarabasiAlbertGenerator(2, 50, 1) - g.fit(self.G) + g.fit(self.G) self.assertEqual(g.generate().numberOfNodes(), 50) self.assertEqual(g.generate().numberOfEdges(), 98) - + def testBTERReplicator(self): g = nk.generators.BTERReplicator(self.G) g.setPaths("./BTER.data") g.fit(self.G) - + def testChungLuGenerator(self): g = nk.generators.ChungLuGenerator([1.3, 1.5, 1.7]) g.fit(self.G) - self.assertEqual(g.generate().numberOfNodes(), 3) + self.assertEqual(g.generate().numberOfNodes(), 3) def testDorogovtsevMendesGenerator(self): g = nk.generators.DorogovtsevMendesGenerator(100) @@ -45,7 +46,7 @@ def testDynamicHyperbolicGenerator(self): res = g.getGraph() coords = g.getCoordinates() self.assertEqual(res.numberOfNodes(), 100) - self.assertEqual(len(coords), 100) + self.assertEqual(len(coords), 100) def testDynamicPubWebGenerator(self): n = 100 @@ -59,9 +60,9 @@ def testDynamicPubWebGenerator(self): # check that all points are within the unit square and that they are non-empt self.assertTrue(all(0.0 <= pt[0] <= 1 for pt in coords)) - self.assertTrue(any(0.0 < pt[0] < 1 for pt in coords)) + self.assertTrue(any(0.0 < pt[0] < 1 for pt in coords)) self.assertTrue(all(0.0 <= pt[1] <= 1 for pt in coords)) - self.assertTrue(any(0.0 < pt[1] < 1 for pt in coords)) + self.assertTrue(any(0.0 < pt[1] < 1 for pt in coords)) gen.generate(10) @@ -72,16 +73,18 @@ def testDynamicPubWebGenerator(self): def testDynamicForestFireGenerator(self): dyn = nk.generators.DynamicForestFireGenerator(0.5, directed=True) G = dyn.generate(10) - self.assertGreaterEqual(len(G), 20) - + self.assertGreaterEqual(len(G), 20) + def testEdgeSwitchingMarkovChainGenerator(self): n = 100 while True: - degseq = nk.generators.PowerlawDegreeSequence(2, n).run().getDegreeSequence(n) + degseq = ( + nk.generators.PowerlawDegreeSequence(2, n).run().getDegreeSequence(n) + ) gen = nk.generators.EdgeSwitchingMarkovChainGenerator(degseq, False, 10) if not gen.isRealizable(): continue - + G = gen.generate() self.assertEqual(G.numberOfNodes(), n) for u in range(G.numberOfNodes()): @@ -95,13 +98,13 @@ def testErdosRenyiGenerator(self): self.assertEqual(g.generate().numberOfNodes(), 10) def testHavelHakimiGenerator(self): - g = nk.generators.HavelHakimiGenerator([2,2,2,2]) - self.assertTrue(g.isRealizable()) + g = nk.generators.HavelHakimiGenerator([2, 2, 2, 2]) + self.assertTrue(g.isRealizable()) self.assertTrue(g.getRealizable()) def testHavelHakimiGeneratorFit(self): - g = nk.generators.HavelHakimiGenerator([2,2,2,2]) - g.fit(self.G) + g = nk.generators.HavelHakimiGenerator([2, 2, 2, 2]) + g.fit(self.G) self.assertEqual(g.generate().numberOfNodes(), 4) self.assertEqual(g.generate().numberOfEdges(), 4) @@ -114,9 +117,9 @@ def testHyperbolicGenerator(self): def testLFRGenerator(self): g = nk.generators.LFRGenerator(5) - g.setDegreeSequence([0,0,0,0,0]) + g.setDegreeSequence([0, 0, 0, 0, 0]) g.setMu(1.5) - g.setCommunitySizeSequence([1,1,1,1,1]) + g.setCommunitySizeSequence([1, 1, 1, 1, 1]) self.assertEqual(g.generate().numberOfNodes(), 5) g.run() self.assertEqual(g.getGraph().numberOfEdges(), 0) @@ -124,15 +127,15 @@ def testLFRGenerator(self): def testLFRGeneratorFit(self): g = nk.generators.LFRGenerator(5) - g.setDegreeSequence([0,0,0,0,0]) + g.setDegreeSequence([0, 0, 0, 0, 0]) g.setMu(1.5) - g.setCommunitySizeSequence([1,1,1,1,1]) + g.setCommunitySizeSequence([1, 1, 1, 1, 1]) g.fit(self.G) self.assertEqual(g.generate().numberOfNodes(), 5) - self.assertEqual(g.generate().numberOfEdges(), 0) - + self.assertEqual(g.generate().numberOfEdges(), 0) + def testLFRGeneratorPowerlawDegreeSequence(self): - #Example with generatingPowerlaw functions + # Example with generatingPowerlaw functions g2 = nk.generators.LFRGenerator(100) g2.generatePowerlawDegreeSequence(10, 20, -2) g2.generatePowerlawCommunitySizeSequence(10, 50, -1) @@ -155,9 +158,9 @@ def testLFRGeneratorPowerlawDegreeSequenceFitVanilla(self): g2.generatePowerlawDegreeSequence(5, 6, -2) g2.generatePowerlawCommunitySizeSequence(5, 6, -1) g2.setMu(0.5) - g2.fit(self.G, vanilla=True, plfit=False) + g2.fit(self.G, vanilla=True, plfit=False) self.assertEqual(g2.generate().numberOfNodes(), 10) - + def testPowerLawDegreeSequence(self): n = 100 PowGen = nk.generators.PowerlawDegreeSequence(2, n) @@ -172,6 +175,20 @@ def testPowerLawDegreeSequence(self): # Algorithm is not deterministic self.assertIsInstance(PowGen.getDegree(), int) + def testPowerLawDegreeSequenceFromGraph(self): + PowGen = nk.generators.PowerlawDegreeSequence(self.G) + PowGen.run() + + degG = nk.centrality.DegreeCentrality(self.G).run().scores() + minDegG = min(degG) + maxDegG = max(degG) + avgDegG = sum(degG) / len(degG) + self.assertAlmostEqual( + PowGen.getExpectedAverageDegree(), avgDegG, avgDegG / 10.0 + ) + self.assertEqual(PowGen.getMinimumDegree(), minDegG) + self.assertEqual(PowGen.getMaximumDegree(), maxDegG) + def testPubWebGenerator(self): n = 100 gen = nk.generators.PubWebGenerator(n, 8, 0.1, 4) @@ -184,9 +201,9 @@ def testPubWebGenerator(self): # check that all points are within the unit square and that they are non-empt self.assertTrue(all(0.0 <= pt[0] <= 1 for pt in coords)) - self.assertTrue(any(0.0 < pt[0] < 1 for pt in coords)) + self.assertTrue(any(0.0 < pt[0] < 1 for pt in coords)) self.assertTrue(all(0.0 <= pt[1] <= 1 for pt in coords)) - self.assertTrue(any(0.0 < pt[1] < 1 for pt in coords)) + self.assertTrue(any(0.0 < pt[1] < 1 for pt in coords)) def testRmatGenerator(self): g = nk.generators.RmatGenerator(2, 1, 0.25, 0.25, 0.25, 0.25) @@ -199,11 +216,11 @@ def testRmatGeneratorFit(self): g = nk.generators.RmatGenerator(2, 1, 0.25, 0.25, 0.25, 0.25) g.setPaths("./rMat.data") inputGraph = nk.Graph(3) - inputGraph.addEdge(0,1) - inputGraph.addEdge(1,2) - g.fit(inputGraph, kronfit=False) + inputGraph.addEdge(0, 1) + inputGraph.addEdge(1, 2) + g.fit(inputGraph, kronfit=False) self.assertEqual(g.generate().numberOfNodes(), 4) - self.assertEqual(g.generate().numberOfEdges(), 4) + self.assertEqual(g.generate().numberOfEdges(), 4) def testWattsStrogatzGenerator(self): n = 12 @@ -211,7 +228,8 @@ def testWattsStrogatzGenerator(self): G = nk.generators.WattsStrogatzGenerator(n, nbrs, 0.5).generate() self.assertEqual(G.numberOfNodes(), n) - self.assertEqual(G.numberOfEdges(), n*nbrs) + self.assertEqual(G.numberOfEdges(), n * nbrs) + if __name__ == "__main__": unittest.main() From 1dab2b2d37fbfa255b4c81e1c2c3798809864d44 Mon Sep 17 00:00:00 2001 From: fabratu Date: Fri, 22 Mar 2024 09:13:59 +0100 Subject: [PATCH 2/3] Fix PowerlawDegreeSequence computation based on graph. --- networkit/generators.pyx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/networkit/generators.pyx b/networkit/generators.pyx index c5026ab121..bd19221755 100644 --- a/networkit/generators.pyx +++ b/networkit/generators.pyx @@ -653,10 +653,11 @@ cdef class PowerlawDegreeSequence: def __cinit__(self, minDeg, count maxDeg = 0, double gamma = -2): if isinstance(minDeg, Graph): self._this = new _PowerlawDegreeSequence((minDeg)._this) - try: - self._this = new _PowerlawDegreeSequence(minDeg) - except TypeError: - self._this = new _PowerlawDegreeSequence((minDeg), maxDeg, gamma) + else: + try: + self._this = new _PowerlawDegreeSequence(minDeg) + except TypeError: + self._this = new _PowerlawDegreeSequence((minDeg), maxDeg, gamma) def __dealloc__(self): del self._this From 3cad44ae8ecff5ef6e0e1f4566208ec434cdccfb Mon Sep 17 00:00:00 2001 From: fabratu Date: Tue, 26 Mar 2024 18:11:25 +0100 Subject: [PATCH 3/3] Fix PowerlawDegreeSequence test. --- networkit/test/test_generators.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/networkit/test/test_generators.py b/networkit/test/test_generators.py index 956b072413..4e63cf1592 100755 --- a/networkit/test/test_generators.py +++ b/networkit/test/test_generators.py @@ -182,10 +182,6 @@ def testPowerLawDegreeSequenceFromGraph(self): degG = nk.centrality.DegreeCentrality(self.G).run().scores() minDegG = min(degG) maxDegG = max(degG) - avgDegG = sum(degG) / len(degG) - self.assertAlmostEqual( - PowGen.getExpectedAverageDegree(), avgDegG, avgDegG / 10.0 - ) self.assertEqual(PowGen.getMinimumDegree(), minDegG) self.assertEqual(PowGen.getMaximumDegree(), maxDegG)