class CoverabilityGraph

Public Class Methods

new(net, options = Hash.new) click to toggle source
# File lib/petri_net/coverability_graph/graph.rb, line 4
def initialize(net, options = Hash.new)
    @objects = Array.new
    @nodes = Hash.new
    @edges = Hash.new
    @name = net.name
    if options['unlimited'].nil? 
        @unlimited = true 
    else 
        @unlimited = options['unlimited']
    end
end

Public Instance Methods

add_node(node) click to toggle source
# File lib/petri_net/coverability_graph/graph.rb, line 16
def add_node(node)
    double = false
    inf = false
    @nodes.each_value do |n|
        begin
            if node > @objects[n]
                if @unlimited
                    double = n
                    break
                    #return @objects[n].id *-1
                else
                    raise PetriNet::Graph::InfiniteReachabilityGraphError
                end
            end
            if -Float::INFINITY == (node <=> @objects[n])
                inf = true
            end
        rescue ArgumentError
            #just two different markings, completly ok
        end
    end
    # if there was a smaller marking
    return (@objects[double].id * -1) if double
    node_index = @objects.index node
    # if there already is a node with this marking
    return @objects[node_index].id * -1 unless node_index.nil?

    return -Float::INFINITY if inf

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