Class: Petrinet::Net
- Inherits:
-
Object
- Object
- Petrinet::Net
- 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
-
#prefire_transition_name ⇒ Object
readonly
Returns the value of attribute prefire_transition_name.
Class Method Summary collapse
Instance Method Summary collapse
- #fire(transition_name) ⇒ Object
- #fireable ⇒ Object
- #fireable?(transition_name) ⇒ Boolean
-
#initialize(state_vector, place_index_by_place_name, transition_vectors_by_transition_name, prefire_transition_name = nil) ⇒ Net
constructor
A new instance of Net.
-
#mark(marking) ⇒ Object
Marks the petri net and returns a new instance.
- #prefire(transition_name) ⇒ Object
- #to_animated_gif(transition_names, gif_path) ⇒ Object
- #to_svg ⇒ Object
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_name ⇒ Object (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 |
#fireable ⇒ Object
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
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_svg ⇒ Object
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 |