@@ -241,3 +241,98 @@ def test_path_graph_unnormalized(self):
241241 expected = {0 : 4.0 , 1 : 6.0 , 2 : 6.0 , 3 : 4.0 }
242242 for k , v in centrality .items ():
243243 self .assertAlmostEqual (v , expected [k ])
244+
245+
246+ class TestDiGraphDegreeCentrality (unittest .TestCase ):
247+ def setUp (self ):
248+ self .graph = rustworkx .PyDiGraph ()
249+ self .a = self .graph .add_node ("A" )
250+ self .b = self .graph .add_node ("B" )
251+ self .c = self .graph .add_node ("C" )
252+ self .d = self .graph .add_node ("D" )
253+ edge_list = [
254+ (self .a , self .b , 1 ),
255+ (self .b , self .c , 1 ),
256+ (self .c , self .d , 1 ),
257+ (self .a , self .c , 1 ), # Additional edge
258+ ]
259+ self .graph .add_edges_from (edge_list )
260+
261+ def test_degree_centrality (self ):
262+ centrality = rustworkx .degree_centrality (self .graph )
263+ expected = {
264+ 0 : 2 / 3 , # 2 total edges / 3
265+ 1 : 2 / 3 , # 2 total edges / 3
266+ 2 : 1.0 , # 3 total edges / 3
267+ 3 : 1 / 3 , # 1 total edge / 3
268+ }
269+ for k , v in centrality .items ():
270+ self .assertAlmostEqual (v , expected [k ])
271+
272+ def test_in_degree_centrality (self ):
273+ centrality = rustworkx .in_degree_centrality (self .graph )
274+ expected = {
275+ 0 : 0.0 , # 0 incoming edges
276+ 1 : 1 / 3 , # 1 incoming edge
277+ 2 : 2 / 3 , # 2 incoming edges
278+ 3 : 1 / 3 , # 1 incoming edge
279+ }
280+ for k , v in centrality .items ():
281+ self .assertAlmostEqual (v , expected [k ])
282+
283+ def test_out_degree_centrality (self ):
284+ centrality = rustworkx .out_degree_centrality (self .graph )
285+ expected = {
286+ 0 : 2 / 3 , # 2 outgoing edges
287+ 1 : 1 / 3 , # 1 outgoing edge
288+ 2 : 1 / 3 , # 1 outgoing edge
289+ 3 : 0.0 , # 0 outgoing edges
290+ }
291+ for k , v in centrality .items ():
292+ self .assertAlmostEqual (v , expected [k ])
293+
294+ def test_degree_centrality_complete_digraph (self ):
295+ graph = rustworkx .generators .directed_complete_graph (5 )
296+ centrality = rustworkx .degree_centrality (graph )
297+ expected = {0 : 1.0 , 1 : 1.0 , 2 : 1.0 , 3 : 1.0 , 4 : 1.0 }
298+ for k , v in centrality .items ():
299+ self .assertAlmostEqual (v , expected [k ])
300+
301+ def test_degree_centrality_directed_path (self ):
302+ graph = rustworkx .generators .directed_path_graph (5 )
303+ centrality = rustworkx .degree_centrality (graph )
304+ expected = {
305+ 0 : 1 / 4 , # 1 total edge (out only) / 4
306+ 1 : 2 / 4 , # 2 total edges (1 in + 1 out) / 4
307+ 2 : 2 / 4 , # 2 total edges (1 in + 1 out) / 4
308+ 3 : 2 / 4 , # 2 total edges (1 in + 1 out) / 4
309+ 4 : 1 / 4 , # 1 total edge (in only) / 4
310+ }
311+ for k , v in centrality .items ():
312+ self .assertAlmostEqual (v , expected [k ])
313+
314+ def test_in_degree_centrality_directed_path (self ):
315+ graph = rustworkx .generators .directed_path_graph (5 )
316+ centrality = rustworkx .in_degree_centrality (graph )
317+ expected = {
318+ 0 : 0.0 , # 0 incoming edges
319+ 1 : 1 / 4 , # 1 incoming edge
320+ 2 : 1 / 4 , # 1 incoming edge
321+ 3 : 1 / 4 , # 1 incoming edge
322+ 4 : 1 / 4 , # 1 incoming edge
323+ }
324+ for k , v in centrality .items ():
325+ self .assertAlmostEqual (v , expected [k ])
326+
327+ def test_out_degree_centrality_directed_path (self ):
328+ graph = rustworkx .generators .directed_path_graph (5 )
329+ centrality = rustworkx .out_degree_centrality (graph )
330+ expected = {
331+ 0 : 1 / 4 , # 1 outgoing edge
332+ 1 : 1 / 4 , # 1 outgoing edge
333+ 2 : 1 / 4 , # 1 outgoing edge
334+ 3 : 1 / 4 , # 1 outgoing edge
335+ 4 : 0.0 , # 0 outgoing edges
336+ }
337+ for k , v in centrality .items ():
338+ self .assertAlmostEqual (v , expected [k ])
0 commit comments