/tests/test_bipartite.py

https://github.com/igraph/python-igraph · Python · 177 lines · 143 code · 28 blank · 6 comment · 18 complexity · 0c98cf370ea203d5c0c95f7d87dc4bcc MD5 · raw file

  1. import unittest
  2. from igraph import *
  3. class BipartiteTests(unittest.TestCase):
  4. def testCreateBipartite(self):
  5. g = Graph.Bipartite([0, 1]*5, [(0,1),(2,3),(4,5),(6,7),(8,9)])
  6. self.assertTrue(g.vcount() == 10 and g.ecount() == 5 and g.is_directed() == False)
  7. self.assertTrue(g.is_bipartite())
  8. self.assertTrue(g.vs["type"] == [False, True]*5)
  9. def testFullBipartite(self):
  10. g = Graph.Full_Bipartite(10, 5)
  11. self.assertTrue(g.vcount() == 15 and g.ecount() == 50 and g.is_directed() == False)
  12. expected = sorted([(i, j) for i in range(10) for j in range(10, 15)])
  13. self.assertTrue(sorted(g.get_edgelist()) == expected)
  14. self.assertTrue(g.vs["type"] == [False]*10 + [True]*5)
  15. g = Graph.Full_Bipartite(10, 5, directed=True, mode=OUT)
  16. self.assertTrue(g.vcount() == 15 and g.ecount() == 50 and g.is_directed() == True)
  17. self.assertTrue(sorted(g.get_edgelist()) == expected)
  18. self.assertTrue(g.vs["type"] == [False]*10 + [True]*5)
  19. g = Graph.Full_Bipartite(10, 5, directed=True, mode=IN)
  20. self.assertTrue(g.vcount() == 15 and g.ecount() == 50 and g.is_directed() == True)
  21. self.assertTrue(sorted(g.get_edgelist()) == sorted([(i,j) for j, i in expected]))
  22. self.assertTrue(g.vs["type"] == [False]*10 + [True]*5)
  23. g = Graph.Full_Bipartite(10, 5, directed=True)
  24. self.assertTrue(g.vcount() == 15 and g.ecount() == 100 and g.is_directed() == True)
  25. expected.extend([(j, i) for i, j in expected])
  26. expected.sort()
  27. self.assertTrue(sorted(g.get_edgelist()) == expected)
  28. self.assertTrue(g.vs["type"] == [False]*10 + [True]*5)
  29. def testIncidence(self):
  30. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]])
  31. self.assertTrue(all((g.vcount() == 5, g.ecount() == 4, not g.is_directed())))
  32. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  33. self.assertListEqual(sorted(g.get_edgelist()), [(0,3),(0,4),(1,2),(1,3)])
  34. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], multiple=True)
  35. self.assertTrue(all((g.vcount() == 5, g.ecount() == 5, not g.is_directed())))
  36. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  37. self.assertListEqual(sorted(g.get_edgelist()), [(0,3),(0,4),(1,2),(1,3),(1,3)])
  38. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], directed=True)
  39. self.assertTrue(all((g.vcount() == 5, g.ecount() == 4, g.is_directed())))
  40. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  41. self.assertListEqual(sorted(g.get_edgelist()), [(0,3),(0,4),(1,2),(1,3)])
  42. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], directed=True, mode="in")
  43. self.assertTrue(all((g.vcount() == 5, g.ecount() == 4, g.is_directed())))
  44. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  45. self.assertListEqual(sorted(g.get_edgelist()), [(2,1),(3,0),(3,1),(4,0)])
  46. # Create a weighted Graph
  47. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], weighted=True)
  48. self.assertTrue(all((g.vcount() == 5, g.ecount() == 4, not g.is_directed(), g.is_weighted())))
  49. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  50. self.assertListEqual(g.es["weight"], [1, 1, 1, 2])
  51. self.assertListEqual(sorted(g.get_edgelist()), [(0, 3), (0, 4), (1, 2),(1,3)])
  52. # Graph is not weighted when weighted=`str`
  53. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], weighted="some_attr_name")
  54. self.assertTrue(all((g.vcount() == 5, g.ecount() == 4, not g.is_directed(), not g.is_weighted())))
  55. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  56. self.assertListEqual(g.es["some_attr_name"], [1, 1, 1, 2])
  57. self.assertListEqual(sorted(g.get_edgelist()), [(0, 3), (0, 4), (1, 2),(1,3)])
  58. # Graph is not weighted when weighted=""
  59. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], weighted="")
  60. self.assertTrue(all((g.vcount() == 5, g.ecount() == 4, not g.is_directed(), not g.is_weighted())))
  61. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  62. self.assertListEqual(g.es[""], [1, 1, 1, 2])
  63. self.assertListEqual(sorted(g.get_edgelist()), [(0, 3), (0, 4), (1, 2),(1,3)])
  64. # Should work when directed=True and mode=out with weighted
  65. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], directed=True, weighted=True)
  66. self.assertTrue(all((g.vcount() == 5, g.ecount() == 4, g.is_directed(), g.is_weighted())))
  67. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  68. self.assertListEqual(g.es["weight"], [1, 1, 1, 2])
  69. self.assertListEqual(sorted(g.get_edgelist()), [(0, 3), (0, 4), (1, 2),(1,3)])
  70. # Should work when directed=True and mode=in with weighted
  71. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], directed=True, mode="in", weighted=True)
  72. self.assertTrue(all((g.vcount() == 5, g.ecount() == 4, g.is_directed(), g.is_weighted())))
  73. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  74. self.assertListEqual(g.es["weight"], [1, 1, 1, 2])
  75. self.assertListEqual(sorted(g.get_edgelist()), [(2, 1), (3, 0), (3, 1), (4, 0)])
  76. # Should work when directed=True and mode=all with weighted
  77. g = Graph.Incidence([[0, 1, 1], [1, 2, 0]], directed=True, mode="all", weighted=True)
  78. self.assertTrue(all((g.vcount() == 5, g.ecount() == 8, g.is_directed(), g.is_weighted())))
  79. self.assertListEqual(g.vs["type"], [False]*2 + [True]*3)
  80. self.assertListEqual(g.es["weight"], [1, 1, 1, 1, 1, 1, 2, 2])
  81. self.assertListEqual(sorted(g.get_edgelist()), [(0, 3), (0, 4), (1, 2), (1, 3), (2, 1), (3, 0), (3, 1), (4, 0)])
  82. def testIncidenceError(self):
  83. msg = "arguments weighted and multiple can not co-exist"
  84. with self.assertRaises(ValueError) as e:
  85. Graph.Incidence([[0, 1, 1], [1, 2, 0]], multiple=True, weighted=True)
  86. self.assertIn(msg, e.exception.args)
  87. with self.assertRaises(ValueError) as e:
  88. Graph.Incidence([[0, 1, 1], [1, 2, 0]], multiple=True, weighted="string")
  89. self.assertIn(msg, e.exception.args)
  90. with self.assertRaises(ValueError) as e:
  91. Graph.Incidence([[0, 1, 1], [1, 2, 0]], multiple=True, weighted="")
  92. self.assertIn(msg, e.exception.args)
  93. def testGetIncidence(self):
  94. mat = [[0, 1, 1], [1, 1, 0]]
  95. v1, v2 = [0, 1], [2, 3, 4]
  96. g = Graph.Incidence(mat)
  97. self.assertTrue(g.get_incidence() == (mat, v1, v2))
  98. g.vs["type2"] = g.vs["type"]
  99. self.assertTrue(g.get_incidence("type2") == (mat, v1, v2))
  100. self.assertTrue(g.get_incidence(g.vs["type2"]) == (mat, v1, v2))
  101. def testBipartiteProjection(self):
  102. g = Graph.Full_Bipartite(10, 5)
  103. g1, g2 = g.bipartite_projection()
  104. self.assertTrue(g1.isomorphic(Graph.Full(10)))
  105. self.assertTrue(g2.isomorphic(Graph.Full(5)))
  106. self.assertTrue(g.bipartite_projection(which=0).isomorphic(g1))
  107. self.assertTrue(g.bipartite_projection(which=1).isomorphic(g2))
  108. self.assertTrue(g.bipartite_projection(which=False).isomorphic(g1))
  109. self.assertTrue(g.bipartite_projection(which=True).isomorphic(g2))
  110. self.assertTrue(g1.es["weight"] == [5] * 45)
  111. self.assertTrue(g2.es["weight"] == [10] * 10)
  112. self.assertTrue(g.bipartite_projection_size() == (10, 45, 5, 10))
  113. g1, g2 = g.bipartite_projection(probe1=10)
  114. self.assertTrue(g1.isomorphic(Graph.Full(5)))
  115. self.assertTrue(g2.isomorphic(Graph.Full(10)))
  116. self.assertTrue(g.bipartite_projection(which=0).isomorphic(g2))
  117. self.assertTrue(g.bipartite_projection(which=1).isomorphic(g1))
  118. self.assertTrue(g.bipartite_projection(which=False).isomorphic(g2))
  119. self.assertTrue(g.bipartite_projection(which=True).isomorphic(g1))
  120. g1, g2 = g.bipartite_projection(multiplicity=False)
  121. self.assertTrue(g1.isomorphic(Graph.Full(10)))
  122. self.assertTrue(g2.isomorphic(Graph.Full(5)))
  123. self.assertTrue(g.bipartite_projection(which=0).isomorphic(g1))
  124. self.assertTrue(g.bipartite_projection(which=1).isomorphic(g2))
  125. self.assertTrue(g.bipartite_projection(which=False).isomorphic(g1))
  126. self.assertTrue(g.bipartite_projection(which=True).isomorphic(g2))
  127. self.assertTrue("weight" not in g1.edge_attributes())
  128. self.assertTrue("weight" not in g2.edge_attributes())
  129. def testIsBipartite(self):
  130. g = Graph.Star(10)
  131. self.assertTrue(g.is_bipartite() == True)
  132. self.assertTrue(g.is_bipartite(True) == (True, [False] + [True]*9))
  133. g = Graph.Tree(100, 3)
  134. self.assertTrue(g.is_bipartite() == True)
  135. g = Graph.Ring(9)
  136. self.assertTrue(g.is_bipartite() == False)
  137. self.assertTrue(g.is_bipartite(True) == (False, None))
  138. g = Graph.Ring(10)
  139. self.assertTrue(g.is_bipartite() == True)
  140. g += (2, 0)
  141. self.assertTrue(g.is_bipartite(True) == (False, None))
  142. def suite():
  143. bipartite_suite = unittest.makeSuite(BipartiteTests)
  144. return unittest.TestSuite([bipartite_suite])
  145. def test():
  146. runner = unittest.TextTestRunner()
  147. runner.run(suite())
  148. if __name__ == "__main__":
  149. test()