class RubyAi::Search::Graph

Attributes

edges[R]
vertices[R]

Public Class Methods

directed(&block) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 12
def directed(&block)
  new(directed: true, &block)
end
new(directed:, &block) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 21
def initialize(directed:, &block)
  @vertices = []
  @edges    = []
  @directed = directed
  instance_eval(&block) if block_given?
end
undirected(&block) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 8
def undirected(&block)
  new(directed: false, &block)
end

Public Instance Methods

edge(from:, to:, cost: 1) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 37
def edge(from:, to:, cost: 1)
  start_vertex = find_or_create_vertex(name: from)
  end_vertex   = find_or_create_vertex(name: to)
  
  create_forward_edge(start_vertex: start_vertex, end_vertex: end_vertex, cost: cost)
  create_reverse_edge(start_vertex: start_vertex, end_vertex: end_vertex, cost: cost) unless @directed
  self
end
method_missing(method, *args, **kwargs, &block) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 28
def method_missing(method, *args, **kwargs, &block)
  send(method, *args, **kwargs, &block)
end
vertex(name) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 32
def vertex(name)
  @vertices.push(Vertex.new(name: name))
  self
end

Private Instance Methods

create_forward_edge(start_vertex:, end_vertex:, cost:) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 56
def create_forward_edge(start_vertex:, end_vertex:, cost:)
  @edges.push(Edge.new(start_vertex: start_vertex, end_vertex: end_vertex, cost: cost))
end
create_reverse_edge(start_vertex:, end_vertex:, cost:) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 60
def create_reverse_edge(start_vertex:, end_vertex:, cost:)
  @edges.push(Edge.new(start_vertex: end_vertex, end_vertex: start_vertex, cost: cost))
end
find_or_create_vertex(name:) click to toggle source
# File lib/ruby_ai/search/graph.rb, line 48
def find_or_create_vertex(name:)
  unless @vertices.find { |vertex| vertex.name == name }
    vertex = Vertex.new(name: name)
    @vertices.push(vertex)
  end
  @vertices.find { |vertex| vertex.name == name }
end