class Databoom::Digraph

Attributes

edges[R]
vertices[R]

Public Class Methods

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

Public Instance Methods

add_edge(source_value, sink_value, label = nil) click to toggle source

NOTE: label has to be unique. Only one edge with the same source & sink can exist with no label

# File lib/databoom/digraph.rb, line 48
def add_edge(source_value, sink_value, label = nil)
  find_edge(source_value, sink_value, label) || create_edge(source_value, sink_value, label)
end
add_vertex(vertex_value, label = nil) click to toggle source

NOTE: Vertex values are uniq

# File lib/databoom/digraph.rb, line 31
def add_vertex(vertex_value, label = nil)
  find_vertex(vertex_value) || create_vertex(vertex_value, label)
end
del_vertex(vertex_value) click to toggle source
# File lib/databoom/digraph.rb, line 35
def del_vertex(vertex_value)
  @vertices.reject! { |iter_vertex| iter_vertex.value == vertex_value }
end
edge?(source_vertex_value, sink_vertex_value, label = nil) click to toggle source
# File lib/databoom/digraph.rb, line 43
def edge?(source_vertex_value, sink_vertex_value, label = nil)
  !find_edge(source_vertex_value, sink_vertex_value, label).nil?
end
find_path(origin_value, terminal_value, path = []) click to toggle source
# File lib/databoom/digraph.rb, line 64
def find_path(origin_value, terminal_value, path = []) 
  return nil unless vertex?(origin_value) && vertex?(terminal_value)
  return path if find_vertex(origin_value)
end
in_edges(vertex_value) click to toggle source
# File lib/databoom/digraph.rb, line 58
def in_edges(vertex_value)
  return nil unless vertex?(vertex_value)
  
  @edges.select {|edge| edge.sink = find_vertex(vertex_value) }
end
out_edges(vertex_value) click to toggle source
# File lib/databoom/digraph.rb, line 52
def out_edges(vertex_value)
  return nil unless vertex?(vertex_value)

  @edges.select {|edge| edge.source = find_vertex(vertex_value) }
end
vertex?(vertex_value) click to toggle source
# File lib/databoom/digraph.rb, line 39
def vertex?(vertex_value)
  !find_vertex(vertex_value).nil?
end

Private Instance Methods

create_edge(source_value, sink_value, label = nil) click to toggle source
# File lib/databoom/digraph.rb, line 79
def create_edge(source_value, sink_value, label = nil)
  @edges << Edge.new(find_vertex(source_value), find_vertex(sink_value), label)
end
create_vertex(vertex_value, label = nil) click to toggle source
# File lib/databoom/digraph.rb, line 87
def create_vertex(vertex_value, label = nil)
  @vertices << Vertex.new(vertex_value, label)
end
find_edge(source_value, sink_value, label = nil) click to toggle source
# File lib/databoom/digraph.rb, line 71
def find_edge(source_value, sink_value, label = nil)
  @edges.find do |iter_edge|
    iter_edge.source == find_vertex(source_value) && 
      iter_edge.sink == find_vertex(sink_value) && 
      iter_edge.label == label  
  end
end
find_vertex(vertex_value) click to toggle source
# File lib/databoom/digraph.rb, line 83
def find_vertex(vertex_value)
  @vertices.find { |iter_vertex| iter_vertex.value == vertex_value }
end