Graph.lua 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. -- ================
  2. -- Private helpers
  3. -- ================
  4. local setmetatable = setmetatable
  5. local Node = require("Graph/Node")
  6. -- Internal class constructor
  7. local class = function(...)
  8. local klass = {}
  9. klass.__index = klass
  10. klass.__call = function(_,...) return klass:new(...) end
  11. function klass:new(...)
  12. local instance = setmetatable({}, klass)
  13. klass.__init(instance, ...)
  14. return instance
  15. end
  16. return setmetatable(klass,{__call = klass.__call})
  17. end
  18. local Graph = class()
  19. Graph.__tostring = function(g) return ("Graph") end
  20. function Graph:__init(vertices, edges)
  21. self.vertices = vertices
  22. self.edges = edges
  23. self.nodes = {}
  24. for _,e in pairs(edges) do
  25. if self.nodes[e.p1.id] == nil then
  26. self.nodes[e.p1.id] = Node(e.p1.id)
  27. end
  28. if self.nodes[e.p2.id] == nil then
  29. self.nodes[e.p2.id] = Node(e.p2.id)
  30. end
  31. self.nodes[e.p1.id]:link(self.nodes[e.p2.id])
  32. self.nodes[e.p2.id]:link(self.nodes[e.p1.id])
  33. end
  34. for _,v in pairs(vertices) do
  35. if self.nodes[v.id] == nil then
  36. self.nodes[v.id] = Node(v.id)
  37. end
  38. end
  39. end
  40. function Graph:contains_vertex(v)
  41. if self.vertices[v.id] then return true end
  42. return false
  43. end
  44. function Graph:append_vertex(v)
  45. assert(v.id ~= nil, "vertex not configured")
  46. assert(self.vertices[v.id] == nil, "vertex already existing")
  47. self.vertices[v.id] = v
  48. self.nodes[v.id] = Node(v.id)
  49. end
  50. function Graph:contains_edge(e)
  51. for _,edge in pairs(self.edges) do
  52. if e == edge then return true end
  53. end
  54. return false
  55. end
  56. function Graph:append_edge(e)
  57. for _,edge in pairs(self.edges) do
  58. assert(e ~= edge, "Edge already existing")
  59. end
  60. table.insert(self.edges, e)
  61. self.nodes[e.p1.id]:link(self.nodes[e.p2.id])
  62. self.nodes[e.p2.id]:link(self.nodes[e.p1.id])
  63. end
  64. return Graph