Class: Petrinet::Net

Inherits:
Object
  • Object
show all
Defined in:
lib/petrinet/net.rb

Overview

Represents a Petri Net in a particular state. Instances of this class are immutable. The following methods return new instances:

  • mark

  • fire

The internal representation uses a VASS - en.wikipedia.org/wiki/Vector_addition_system A good explanation of how this works with Petri Nets is here: github.com/bitwrap/bitwrap-io/blob/master/whitepaper.md

Defined Under Namespace

Classes: Builder

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(state_vector, place_index_by_place_name, transition_vectors_by_transition_name, prefire_transition_name = nil) ⇒ Net

Returns a new instance of Net.



30
31
32
33
34
35
36
# File 'lib/petrinet/net.rb', line 30

def initialize(state_vector, place_index_by_place_name, transition_vectors_by_transition_name, prefire_transition_name = nil)
  @state_vector = state_vector
  @place_index_by_place_name = place_index_by_place_name
  @transition_vectors_by_transition_name = transition_vectors_by_transition_name
  @prefire_transition_name = prefire_transition_name
  freeze
end

Instance Attribute Details

#prefire_transition_nameObject (readonly)

Returns the value of attribute prefire_transition_name.



28
29
30
# File 'lib/petrinet/net.rb', line 28

def prefire_transition_name
  @prefire_transition_name
end

Class Method Details

.build(&proc) ⇒ Object



22
23
24
25
26
# File 'lib/petrinet/net.rb', line 22

def self.build(&proc)
  builder = Builder.new
  proc.call(builder)
  builder.net
end

.from_pnml(xml) ⇒ Object



17
18
19
20
# File 'lib/petrinet/net.rb', line 17

def self.from_pnml(xml)
  builder = PnmlBuilder.new(xml)
  builder.net
end

Instance Method Details

#fire(transition_name) ⇒ Object



48
49
50
51
# File 'lib/petrinet/net.rb', line 48

def fire(transition_name)
  new_state_vector = new_state_vector(transition_name)
  self.class.new(new_state_vector, @place_index_by_place_name, @transition_vectors_by_transition_name)
end

#fireableObject



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/petrinet/net.rb', line 66

def fireable
  result = Set.new
  @transition_vectors_by_transition_name.keys.each do |transition_name|
    begin
      fire(transition_name)
      result.add(transition_name)
    rescue => ignore
      # It wasn't fireable - ignore it
    end
  end
  result
end

#fireable?(transition_name) ⇒ Boolean

Returns:

  • (Boolean)


57
58
59
60
61
62
63
64
# File 'lib/petrinet/net.rb', line 57

def fireable?(transition_name)
  begin
    new_state_vector(transition_name)
    true
  rescue
    false
  end
end

#mark(marking) ⇒ Object

Marks the petri net and returns a new instance



39
40
41
42
43
44
45
46
# File 'lib/petrinet/net.rb', line 39

def mark(marking)
  new_state_vector = Array.new(@state_vector.size, 0)
  marking.each do |place_name, token_count|
    index = @place_index_by_place_name[place_name]
    new_state_vector[index] = token_count
  end
  self.class.new(new_state_vector, @place_index_by_place_name, @transition_vectors_by_transition_name)
end

#prefire(transition_name) ⇒ Object



53
54
55
# File 'lib/petrinet/net.rb', line 53

def prefire(transition_name)
  self.class.new(@state_vector, @place_index_by_place_name, @transition_vectors_by_transition_name, transition_name)
end

#to_animated_gif(transition_names, gif_path) ⇒ Object



84
85
86
87
# File 'lib/petrinet/net.rb', line 84

def to_animated_gif(transition_names, gif_path)
  builder = AnimatedGifBuilder.new(self)
  builder.write(transition_names, gif_path)
end

#to_svgObject



79
80
81
82
# File 'lib/petrinet/net.rb', line 79

def to_svg
  builder = GraphvizBuilder.new(self, @transition_vectors_by_transition_name, @place_index_by_place_name.invert, @state_vector)
  builder.svg
end