class Graph

Constants

VERSION

Attributes

edges[R]
vertices[R]

Public Class Methods

new(vertices = [], edges = []) click to toggle source
# File lib/graph.rb, line 8
def initialize(vertices = [], edges = [])
  @vertices = vertices
  @edges = edges
end

Public Instance Methods

add(vertex_or_edge) click to toggle source
# File lib/graph.rb, line 23
def add(vertex_or_edge)
  return add_vertex(vertex_or_edge) if vertex_or_edge.is_a?(Graph::Vertex)
  return add_edge(vertex_or_edge) if vertex_or_edge.is_a?(Graph::Edge)
end
Also aliased as: <<
delete(vertex_or_edge) click to toggle source
# File lib/graph.rb, line 28
def delete(vertex_or_edge)
  return delete_vertex(vertex_or_edge) if vertex_or_edge.is_a?(Graph::Vertex)
  return delete_edge(vertex_or_edge) if vertex_or_edge.is_a?(Graph::Edge)
end
include?(vertex_or_edge) click to toggle source
# File lib/graph.rb, line 13
def include?(vertex_or_edge)
  return include_vertex?(vertex_or_edge) if vertex_or_edge.is_a?(Graph::Vertex)
  return include_edge?(vertex_or_edge) if vertex_or_edge.is_a?(Graph::Edge)
end
index_of(vertex_or_edge) click to toggle source
# File lib/graph.rb, line 18
def index_of(vertex_or_edge)
  return index_of_vertex(vertex_or_edge) if vertex_or_edge.is_a?(Graph::Vertex)
  return index_of_edge(vertex_or_edge) if vertex_or_edge.is_a?(Graph::Edge)
end
to_h() click to toggle source
# File lib/graph.rb, line 33
def to_h
  # O(vertices.size) + O(edges.size)
  result = {}
  @vertices.each do |vertex|
    result[vertex.key] = vertex.to_h
  end
  @edges.each do |edge|
    result[edge.from.key][:edges] << edge.to_h
    result[edge.to.key][:edges] << edge.to_h
  end
  result
end

Private Instance Methods

<<(vertex_or_edge)
Alias for: add
add_edge(edge) click to toggle source
# File lib/graph.rb, line 72
def add_edge(edge)
  return false if index_of_edge(edge)

  add_vertex(edge.from)
  add_vertex(edge.to)
  edge.send(:add_to, self)
  @edges << edge
  self
end
add_vertex(vertex) click to toggle source
# File lib/graph.rb, line 64
def add_vertex(vertex)
  return false if index_of_vertex(vertex)

  vertex.send(:add_to, self)
  @vertices << vertex
  self
end
delete_edge(edge) click to toggle source
# File lib/graph.rb, line 94
def delete_edge(edge)
  idx = index_of_edge edge
  return false unless idx

  edge.send(:add_to, nil)
  @edges.delete_at idx
  self
end
delete_vertex(vertex) click to toggle source
# File lib/graph.rb, line 82
def delete_vertex(vertex)
  idx = index_of_vertex vertex
  return false unless idx

  edges.each do |edge|
    delete_edge(edge) if (edge.from.key == vertex.key) || (edge.to.key == vertex.key)
  end
  vertex.send(:add_to, nil)
  @vertices.delete_at idx
  self
end
include_edge?(edge) click to toggle source
# File lib/graph.rb, line 52
def include_edge?(edge)
  @edges.include? edge
end
include_vertex?(vertex) click to toggle source
# File lib/graph.rb, line 48
def include_vertex?(vertex)
  @vertices.include? vertex
end
index_of_edge(target) click to toggle source
# File lib/graph.rb, line 60
def index_of_edge(target)
  @edges.index { |edge| edge.key == target.key }
end
index_of_vertex(target) click to toggle source
# File lib/graph.rb, line 56
def index_of_vertex(target)
  @vertices.index { |vertex| vertex.key == target.key }
end