@@ -276,6 +276,61 @@ def testEigenvector(self):
276276 cl = g .community_leading_eigenvector (2 )
277277 self .assertMembershipsEqual (cl , [0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 ])
278278 self .assertAlmostEqual (cl .q , 0.4523 , places = 3 )
279+
280+ def testFluidCommunities (self ):
281+ # Test with a simple graph: two cliques connected by a single edge
282+ g = Graph .Full (5 ) + Graph .Full (5 )
283+ g .add_edges ([(0 , 5 )])
284+
285+ # Test basic functionality - should find 2 communities
286+ cl = g .community_fluid_communities (2 )
287+ self .assertEqual (len (set (cl .membership )), 2 )
288+ self .assertMembershipsEqual (cl , [0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 ])
289+
290+ # Test with 3 cliques
291+ g = Graph .Full (4 ) + Graph .Full (4 ) + Graph .Full (4 )
292+ g += [(0 , 4 ), (4 , 8 )] # Connect the cliques
293+ cl = g .community_fluid_communities (3 )
294+ self .assertEqual (len (set (cl .membership )), 3 )
295+ self .assertMembershipsEqual (cl , [0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 ])
296+
297+ # Test error conditions
298+ # Number of communities must be positive
299+ with self .assertRaises (Exception ):
300+ g .community_fluid_communities (0 )
301+
302+ # Number of communities cannot exceed number of vertices
303+ with self .assertRaises (Exception ):
304+ g .community_fluid_communities (g .vcount () + 1 )
305+
306+ # Test with disconnected graph (should raise error)
307+ g_disconnected = Graph .Full (3 ) + Graph .Full (3 ) # No connecting edge
308+ with self .assertRaises (Exception ):
309+ g_disconnected .community_fluid_communities (2 )
310+
311+ # Test with single vertex (edge case)
312+ g_single = Graph (1 )
313+ cl = g_single .community_fluid_communities (1 )
314+ self .assertEqual (cl .membership , [0 ])
315+
316+ # Test with small connected graph
317+ g_small = Graph ([(0 , 1 ), (1 , 2 ), (2 , 0 )]) # Triangle
318+ cl = g_small .community_fluid_communities (1 )
319+ self .assertEqual (len (set (cl .membership )), 1 )
320+ self .assertEqual (cl .membership , [0 , 0 , 0 ])
321+
322+ # Test deterministic behavior on simple structure
323+ # Note: Fluid communities can be non-deterministic due to randomization,
324+ # but on very simple structures it should be consistent
325+ g_path = Graph ([(0 , 1 ), (1 , 2 ), (2 , 3 ), (3 , 4 ), (4 , 5 )])
326+ cl = g_path .community_fluid_communities (2 )
327+ self .assertEqual (len (set (cl .membership )), 2 )
328+
329+ # Test that it returns a VertexClustering object
330+ g = Graph .Full (6 )
331+ cl = g .community_fluid_communities (2 )
332+ self .assertIsInstance (cl , VertexClustering )
333+ self .assertEqual (len (cl .membership ), g .vcount ())
279334
280335 def testInfomap (self ):
281336 g = Graph .Famous ("zachary" )
0 commit comments