Class SubwordGraph
In: subgraph.rb
Parent: Object
SubwordGraph dot/f_0.png

Methods

create   new   nextnum   print  

Public Class methods

[Source]

    # File subgraph.rb, line 39
39:   def initialize(string)
40:     @autonum=0
41:     @root=Node.new(nextnum)
42:     create(string)
43:   end

Public Instance methods

gibt den Graphen in einem Stream im dot Format aus

[Source]

    # File subgraph.rb, line 46
46:   def print(io)
47:     io.puts "Digraph myTrie { //DOTCODE
48: rankdir=LR; //DOTCODE
49: ordering=out; //DOTCODE
50: splines=true; //DOTCODE
51: "
52:     seen=[]
53:     @root.traverse do |node|
54:       unless seen.include?(node)
55:         io.puts "#{node.name}[peripheries=1]; //DOTCODE\n"
56:         io.puts "#{node.name}->#{node.suf.name}[style=dashed]; //DOTCODE\n" if node.suf
57:         
58:         node.each do |with,to,type|
59:           if type==:solid
60:             io.puts "#{node.name}->#{to.name}[style=bold,weight=2.0,label=\"#{with}\"]; //DOTCODE\n"
61:           else
62:             io.puts "#{node.name}->#{to.name}[style=solid,label=\"#{with}\"]; //DOTCODE\n"
63:           end
64:         end
65:         seen << node
66:       end
67:     end
68:     io.puts "}; //DOTCODE\n"
69:   end

Private Instance methods

erzeugt den Subgraphen

[Source]

     # File subgraph.rb, line 73
 73:   def create(string)
 74:     sink=@root
 75: 
 76:     string.each_char do |a|
 77:       newsink=Node.new(nextnum)
 78:       sink.edge(a,newsink,:solid)
 79:       w=sink.suf
 80: 
 81:       while w != nil && w.son(a) == nil
 82:         w.edge(a,newsink,:non_solid)
 83:         w=w.suf
 84:       end
 85: 
 86:       if w==nil 
 87:         newsink.suf=@root
 88:       else
 89:         v,type=w.son(a)
 90:         if type==:solid
 91:           newsink.suf=v
 92:         else
 93:           newnode=Node.new(nextnum)
 94:           #copy the outgoing edges
 95:           v.each do |with,to,_type|
 96:             newnode.edge(with,to,:non_solid)
 97:           end
 98:           w.edge(a,newnode,:solid)
 99:           newsink.suf=newnode
100:           newnode.suf=v.suf
101:           v.suf=newnode
102:           w=w.suf
103: 
104:           while w != nil && w.son(a) == [v,:non_solid]
105:             w.edge(a,newnode,:non_solid)
106:             w=w.suf
107:           end
108:         end
109:       end
110:       sink = newsink
111:     end # each_char
112:   end

Gibt eine eindeutige Nummer zurück

[Source]

     # File subgraph.rb, line 114
114:   def nextnum
115:     @autonum +=1
116:   end

[Validate]