Class: PetriNet::Graph

Inherits:
Base
  • Object
show all
Defined in:
lib/petri_net/graph.rb,
lib/petri_net/graph/graph.rb

Direct Known Subclasses

ReachabilityGraph

Defined Under Namespace

Classes: Edge, Node

Instance Attribute Summary

Attributes inherited from Base

#logger

Instance Method Summary collapse

Methods inherited from Base

#next_object_id, #reset

Constructor Details

#initialize(net, options = Hash.new) ⇒ Graph

Returns a new instance of Graph.



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/petri_net/graph/graph.rb', line 7

def initialize(net, options = Hash.new)
    @objects = Array.new
    @nodes = Hash.new
    @edges = Hash.new
    @name = net.name
    @type = "Reachability"
    if options['unlimited'].nil? 
        @unlimited = true 
    else 
        @unlimited = options['unlimited']
    end
end

Instance Method Details

#<<(object) ⇒ Object Also known as: add_object

Add an object to the Petri Net.



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/petri_net/graph/graph.rb', line 42

def <<(object)
    case object.class.to_s
    when "Array"
        object.each {|o| self << o}
    when "PetriNet::ReachabilityGraph::Edge"
        add_edge(object)
    when "PetriNet::ReachabilityGraph::Node"
        add_node(object)
    else
        raise "(PetriNet::ReachabilityGraph) Unknown object #{object.class}."
    end
    self
end

#add_edge(edge) ⇒ Object



31
32
33
34
35
36
37
38
39
# File 'lib/petri_net/graph/graph.rb', line 31

def add_edge(edge)
    if (edge.validate && (!@edges.include? edge.name))
        @objects[edge.id] = edge
        @edges[edge.name] = edge.id
        edge.graph = self
        return edge.id
    end
    return false
end

#add_node(node) ⇒ Object Also known as: add_node!



20
21
22
23
24
25
26
27
28
# File 'lib/petri_net/graph/graph.rb', line 20

def add_node(node)
    if node.validate && (!@objects.include? node)
        @objects[node.id] = node
        @nodes[node.name] = node.id
        node.graph = self
        return node.id
    end
    return false
end

#generate_gvObject



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/petri_net/graph/graph.rb', line 70

def generate_gv
    g = GraphViz.new( :G, :type => :digraph )

    @nodes.each_value do |node|
        gv_node = g.add_nodes( @objects[node].markings.to_s )
        gv_node.set do |n|
            n.label = '*' + @objects[node].markings.to_s + '*' if @objects[node].start 
        end
    end
    @edges.each_value do |edge|
        gv_edge = g.add_edges( @objects[edge].source.markings.to_s, @objects[edge].destination.markings.to_s )
        gv_edge.set do |e|
            e.label = @objects[edge].transition
        end
    end
    g
end

#get_node(id) ⇒ Object



57
58
59
# File 'lib/petri_net/graph/graph.rb', line 57

def get_node(id)
    return @objects[id]
end

#to_gv(output = 'png', filename = '') ⇒ Object



61
62
63
64
65
66
67
68
# File 'lib/petri_net/graph/graph.rb', line 61

def to_gv(output = 'png', filename = '')
    g = generate_gv
    if filename.empty?
        filename = "#{@name}_graph.png"
    end
    g.output( :png => filename ) if output == 'png'
    g.output
end

#to_sObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/petri_net/graph/graph.rb', line 88

def to_s
    str = "#{@type} Graph [#{@name}]\n"
    str += "----------------------------\n"
    str += "Description: #{@description}\n"
    str += "Filename: #{@filename}\n"
    str += "\n"

    str += "Nodes\n"
    str += "----------------------------\n"
    @nodes.each_value {|p| str += @objects[p].to_s + "\n" }
    str += "\n"

    str += "Edges\n"
    str += "----------------------------\n"
    @edges.each_value {|t| str += @objects[t].to_s + "\n" }
    str += "\n"

    return str
end