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