class GRAPH::Graph

Attributes

name[RW]
nodes[RW]

Public Class Methods

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

Public Instance Methods

<<(node) click to toggle source
# File lib/sexpir/graph.rb, line 13
def << node
  @nodes << node
end
connect(source,sink,infos={}) click to toggle source
# File lib/sexpir/graph.rb, line 25
def connect source,sink,infos={}
  raise "source nil" unless source
  raise "sink   nil" unless sink
  @nodes << source unless @nodes.include? source
  @nodes << sink   unless @nodes.include? sink
  source.to(sink,infos)
end
connected?(source,sink) click to toggle source
# File lib/sexpir/graph.rb, line 33
def connected? source,sink
  source.succ_edges.select{|edge| edge.sink==sink}.any?
end
delete(node) click to toggle source
# File lib/sexpir/graph.rb, line 42
def delete node
  node.preds.each{|pred| unconnect(pred,node)}
  node.succs.each{|succ| unconnect(node,succ)}
  @nodes.delete(node)
end
each_edge(&block) click to toggle source
# File lib/sexpir/graph.rb, line 52
def each_edge &block
  edges.each(&block)
end
each_node(&block) click to toggle source
# File lib/sexpir/graph.rb, line 48
def each_node &block
  @nodes.each(&block)
end
edges() click to toggle source
# File lib/sexpir/graph.rb, line 56
def edges
  @nodes.collect{|n| n.succ_edges}.flatten
end
include?(node) click to toggle source
# File lib/sexpir/graph.rb, line 21
def include? node
  @nodes.include? node
end
save_as(dotfilename) click to toggle source
# File lib/sexpir/graph.rb, line 77
def save_as dotfilename
  dot_code||=to_dot()
  dot_code.save_as dotfilename
end
size() click to toggle source
# File lib/sexpir/graph.rb, line 17
def size
  @nodes.size
end
to_dot() click to toggle source
# File lib/sexpir/graph.rb, line 60
def to_dot
  dot_code=Code.new
  dot_code << "digraph #{name} {"
  dot_code.indent=2

  each_node do |node|
    dot_code << "#{node.object_id};"
  end
  each_edge do |edge|
    label=edge.infos.to_s
    dot_code << "#{edge.object_id} -> #{edge.object_id} [label=\"#{label}\"];"
  end
  dot_code.indent=0
  dot_code << "}"
  return dot_code
end
unconnect(source,sink) click to toggle source
# File lib/sexpir/graph.rb, line 37
def unconnect source,sink
  source.succ_edges.delete_if{|edge| edge.sink==sink}
  sink.pred_edges.delete_if{|edge| edge.source==source}
end