petri_net 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ac9fa5977f53b289d5fc97d42c14a2847b80c9c
4
- data.tar.gz: d66436746d5f190ef3bf3c8361242ecb71dd5d6f
3
+ metadata.gz: fce9fbf19b7836a63649d8b2e2ff923d6b130952
4
+ data.tar.gz: 0f5a0486c67ede47a093743fe16a1da43b6a5900
5
5
  SHA512:
6
- metadata.gz: b1e585661a11b0ab1789454a4f401d85de55fecbafdf913663083f06c23d2686cbb9ba6e98e7db810358f78514aa998af8ad6be448ffae2480cb81c2aab6ba8a
7
- data.tar.gz: 3fbcf881036c7f18f87f14b0b21d226bfcc81b14e33ea772c9d716cda5b5dcdd805949e2c54f825d57f3ca04f8e03b487208e21f4a6fbbd4ea420f5f2fc9aa79
6
+ metadata.gz: 3355739df8da5232040bc7b46b156f4d72ceaff55baba294c55d103c0410a1614920a5ca5afd5b141b1798c8bd1840d4d4b0bc36b40900019c87a9d43ed1bd17
7
+ data.tar.gz: 5a0a766e885d3dde361311d982a1624284441558ff9d617a62aa026042fa630ac1a95b7c4c5d260f6ceb93d1c67e75f99c75b5b39b08e216019f7c9c8202834e
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/lib/petri_net/net.rb CHANGED
@@ -294,6 +294,10 @@ Arcs
294
294
  @net = YAML.load(File.read(filename))
295
295
  end
296
296
 
297
+ def fire transition
298
+ get_transition(transition).fire
299
+ end
300
+
297
301
  private
298
302
 
299
303
  def changed_structure
@@ -312,7 +316,7 @@ Arcs
312
316
  current_node_id = @graph.add_node current_node
313
317
  @graph.add_edge PetriNet::ReachabilityGraph::Edge.new(source: source, destination: current_node, probability: @objects[tid].probability) unless current_node_id < 0
314
318
  if current_node_id < 0 && @graph.get_node(current_node_id * -1) < current_node
315
- @graph.getNode(current_node_id * -1).add_omega current_node
319
+ @graph.get_node(current_node_id * -1).add_omega current_node
316
320
  end
317
321
  reachability_helper get_markings, current_node unless (current_node_id < 0)
318
322
  end
@@ -96,7 +96,7 @@ class PetriNet::Place < PetriNet::Base
96
96
 
97
97
  # Stringify this place.
98
98
  def to_s
99
- "#{@id}: #{@name} (#{@capacity == nil ? -1 : 0})"
99
+ "#{@id}: #{@name} (#{@capacity == nil ? -1 : 0}) #{'*' * @markings.length}"
100
100
  end
101
101
 
102
102
  # GraphViz definition
@@ -15,11 +15,14 @@ class PetriNet::ReachabilityGraph < PetriNet::Base
15
15
  end
16
16
 
17
17
  def add_node(node)
18
+ double = false
18
19
  @nodes.each_value do |n|
19
20
  begin
20
21
  if node > @objects[n]
21
22
  if @unlimited
22
- return @objects[n].id *-1
23
+ double = n
24
+ break
25
+ #return @objects[n].id *-1
23
26
  else
24
27
  raise PetriNet::ReachabilityGraph::InfiniteReachabilityGraphError
25
28
  end
@@ -28,6 +31,7 @@ class PetriNet::ReachabilityGraph < PetriNet::Base
28
31
  #just two different markings, completly ok
29
32
  end
30
33
  end
34
+ return (@objects[double].id * -1) if double
31
35
  node_index = @objects.index node
32
36
  if (!node_index.nil?)
33
37
  return @objects[node_index].id * -1
@@ -41,11 +41,11 @@ class PetriNet::ReachabilityGraph::Node < PetriNet::Base
41
41
  # Add an omega-marking to a specified place
42
42
  def add_omega object
43
43
  if object.class.to_s == "PetriNet::ReachabilityGraph::Node"
44
- if self > object
44
+ if self < object
45
45
  counter = 0
46
46
  object.markings.each do |marking|
47
47
  if @markings[counter] < marking
48
- @markings[counter] = Fload::INFINITY
48
+ @markings[counter] = Float::INFINITY
49
49
  end
50
50
  counter += 1
51
51
  end
@@ -1,6 +1,6 @@
1
1
  module PetriNet
2
2
  # Current Version
3
- VERSION = "0.7.1"
3
+ VERSION = "0.7.2"
4
4
  # True if this is a debug-version and should not be used in productive systems
5
5
  DEBUG = false
6
6
  end
@@ -1,12 +1,8 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'rubygems'
4
2
  require 'logger'
5
3
  require 'test/unit'
6
4
  require "#{File.dirname(__FILE__)}/../../lib/petri_net"
7
5
 
8
- #require 'pry'
9
-
10
6
  class TestReachabilityGraphNode < Test::Unit::TestCase
11
7
  def setup
12
8
  @net = PetriNet::Net.new(:name => 'Water', :description => 'Creation of water from base elements.')
data/test/tc_petri_net.rb CHANGED
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'rubygems'
4
2
  require 'logger'
5
3
  require 'test/unit'
@@ -24,6 +22,62 @@ class TestPetriNet < Test::Unit::TestCase
24
22
  @net << arc
25
23
  end
26
24
 
25
+ def complex_net
26
+ @net << PetriNet::Place.new(:name => "P1")
27
+ @net << PetriNet::Place.new(:name => "P2")
28
+ @net << PetriNet::Place.new(:name => "C1")
29
+ @net << PetriNet::Place.new(:name => "C2")
30
+ @net << PetriNet::Place.new(:name => "buffer")
31
+ @net << PetriNet::Transition.new(:name => "produce")
32
+ @net << PetriNet::Transition.new(:name => "consume")
33
+ @net << PetriNet::Transition.new(:name => "put")
34
+ @net << PetriNet::Transition.new(:name => "take")
35
+ @net << PetriNet::Arc.new do |a|
36
+ a.add_source(@net.get_place 'P1')
37
+ a.add_destination(@net.get_transition 'produce')
38
+ end
39
+ @net << PetriNet::Arc.new do |a|
40
+ a.add_source(@net.get_transition 'produce')
41
+ a.add_destination(@net.get_place 'P2')
42
+ end
43
+ @net << PetriNet::Arc.new do |a|
44
+ a.add_source(@net.get_place 'P2')
45
+ a.add_destination(@net.get_transition 'put')
46
+ end
47
+ @net << PetriNet::Arc.new do |a|
48
+ a.add_source(@net.get_transition 'put')
49
+ a.add_destination(@net.get_place 'P1')
50
+ end
51
+ @net << PetriNet::Arc.new do |a|
52
+ a.add_source(@net.get_transition 'put')
53
+ a.add_destination(@net.get_place 'buffer')
54
+ end
55
+ @net << PetriNet::Arc.new do |a|
56
+ a.add_source(@net.get_place 'buffer')
57
+ a.add_destination(@net.get_transition 'take')
58
+ end
59
+ @net << PetriNet::Arc.new do |a|
60
+ a.add_source(@net.get_transition 'take')
61
+ a.add_destination(@net.get_place 'C1')
62
+ end
63
+ @net << PetriNet::Arc.new do |a|
64
+ a.add_source(@net.get_place 'C1')
65
+ a.add_destination(@net.get_transition 'consume')
66
+ end
67
+ @net << PetriNet::Arc.new do |a|
68
+ a.add_source(@net.get_transition 'consume')
69
+ a.add_destination(@net.get_place 'C2')
70
+ end
71
+ @net << PetriNet::Arc.new do |a|
72
+ a.add_source(@net.get_place 'C2')
73
+ a.add_destination(@net.get_transition 'take')
74
+ end
75
+
76
+ @net.get_place('P1').add_marking
77
+ @net.get_place('buffer').add_marking
78
+ @net.get_place('C2').add_marking
79
+ end
80
+
27
81
  def teardown
28
82
  @net.reset
29
83
  end
@@ -43,6 +97,13 @@ class TestPetriNet < Test::Unit::TestCase
43
97
  assert_empty net.get_markings, "No Places should mean no markings..."
44
98
  end
45
99
 
100
+ def test_complex_net
101
+ complex_net
102
+ assert_equal "Petri Net [Water]\n----------------------------\nDescription: Creation of water from base elements.\nFilename: Water\n\nPlaces\n----------------------------\n1: P1 (0) *\n2: P2 (0) \n3: C1 (0) \n4: C2 (0) *\n5: buffer (0) *\n\nTransitions\n----------------------------\n6: produce\n7: consume\n8: put\n9: take\n\nArcs\n----------------------------\n10: Arc10 (1) 1 -> 6\n11: Arc11 (1) 6 -> 2\n12: Arc12 (1) 2 -> 8\n13: Arc13 (1) 8 -> 1\n14: Arc14 (1) 8 -> 5\n15: Arc15 (1) 5 -> 9\n16: Arc16 (1) 9 -> 3\n17: Arc17 (1) 3 -> 7\n18: Arc18 (1) 7 -> 4\n19: Arc19 (1) 4 -> 9\n\n", @net.to_s
103
+ assert_equal "digraph Water {\n\t// General graph options\n\trankdir = LR;\n\tsize = \"10.5,7.5\";\n\tnode [ style = filled, fillcolor = white, fontsize = 8.0 ]\n\tedge [ arrowhead = vee, arrowsize = 0.5, fontsize = 8.0 ]\n\n\t// Places\n\tnode [ shape = circle ];\n\tP1 [ label = \"P1 1 \" ];\n\tP2 [ label = \"P2 0 \" ];\n\tP3 [ label = \"C1 0 \" ];\n\tP4 [ label = \"C2 1 \" ];\n\tP5 [ label = \"buffer 1 \" ];\n\n\t// Transitions\n\tnode [ shape = box, fillcolor = grey90 ];\n\tT6 [ label = \"produce\" ];\n\tT7 [ label = \"consume\" ];\n\tT8 [ label = \"put\" ];\n\tT9 [ label = \"take\" ];\n\n\t// Arcs\n\tP1 -> T6 [ label = \"Arc10\", headlabel = \"1\" ];\n\tT6 -> P2 [ label = \"Arc11\", headlabel = \"1\" ];\n\tP2 -> T8 [ label = \"Arc12\", headlabel = \"1\" ];\n\tT8 -> P1 [ label = \"Arc13\", headlabel = \"1\" ];\n\tT8 -> P5 [ label = \"Arc14\", headlabel = \"1\" ];\n\tP5 -> T9 [ label = \"Arc15\", headlabel = \"1\" ];\n\tT9 -> P3 [ label = \"Arc16\", headlabel = \"1\" ];\n\tP3 -> T7 [ label = \"Arc17\", headlabel = \"1\" ];\n\tT7 -> P4 [ label = \"Arc18\", headlabel = \"1\" ];\n\tP4 -> T9 [ label = \"Arc19\", headlabel = \"1\" ];\n}\n", @net.to_gv
104
+ assert_equal "digraph Water {\n\t// General graph options\n\trankdir = LR;\n\tsize = \"10.5,7.5\";\n\tnode [ style = filled, fillcolor = white, fontsize = 8.0 ]\n\tedge [ arrowhead = vee, arrowsize = 0.5, fontsize = 8.0 ]\n\n\t// Nodes\n\tnode [ shape = circle ];\n\tN20 [ label = \"[1, 0, 0, 1, Infinity]\" ];\n\tN21 [ label = \"[0, 1, 0, 1, 1]\" ];\n\tN24 [ label = \"[0, 1, 1, 0, 0]\" ];\n\tN26 [ label = \"[0, 1, 0, 1, Infinity]\" ];\n\tN28 [ label = \"[1, 0, 0, 1, 1]\" ];\n\tN31 [ label = \"[1, 0, 1, 0, Infinity]\" ];\n\tN34 [ label = \"[1, 0, 0, 1, Infinity]\" ];\n\tN36 [ label = \"[0, 1, 0, 1, 0]\" ];\n\tN40 [ label = \"[1, 0, 1, 0, 0]\" ];\n\tN43 [ label = \"[1, 0, 0, 1, 0]\" ];\n\n\t// Edges\n\tN20 -> N21;\n\tN21 -> N24;\n\tN24 -> N26;\n\tN26 -> N28;\n\tN28 -> N31;\n\tN31 -> N34;\n\tN34 -> N36;\n\tN20 -> N40;\n\tN40 -> N43;\n}\n", @net.generate_reachability_graph.to_gv
105
+ end
106
+
46
107
  def test_add_place
47
108
  # Create the place
48
109
  place = PetriNet::Place.new(:name => 'Hydrogen')
@@ -176,25 +237,7 @@ class TestPetriNet < Test::Unit::TestCase
176
237
  a.add_destination(net2.get_transition 'testtrans')
177
238
  end
178
239
  net2 << arc
179
- assert_equal "Petri Net [Water]
180
- ----------------------------
181
- Description: Creation of water from base elements.
182
- Filename: Water
183
-
184
- Places
185
- ----------------------------
186
- 1: testplace (0)
187
- 4: testplace2 (0)
188
-
189
- Transitions
190
- ----------------------------
191
- 2: testtrans
192
-
193
- Arcs
194
- ----------------------------
195
- 3: testarc (2) 1 -> 2
196
-
197
- ", @net.merge(net2).to_s, "Merge failed, this is only a basic test"
240
+ assert_equal "Petri Net [Water]\n----------------------------\nDescription: Creation of water from base elements.\nFilename: Water\n\nPlaces\n----------------------------\n1: testplace (0) \n4: testplace2 (0) \n\nTransitions\n----------------------------\n2: testtrans\n\nArcs\n----------------------------\n3: testarc (2) 1 -> 2\n\n", @net.merge(net2).to_s, "Merge failed, this is only a basic test"
198
241
  end
199
242
 
200
243
  def test_generate_reachability_graph
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: petri_net
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - cclausen
@@ -31,11 +31,11 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
+ - .gitignore
34
35
  - .ruby-version
35
36
  - .travis.yml
36
37
  - CHANGELOG
37
38
  - Gemfile
38
- - Gemfile.lock
39
39
  - LICENSE
40
40
  - README.rdoc
41
41
  - Rakefile
data/Gemfile.lock DELETED
@@ -1,18 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- petri_net (0.7.0)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- net-sftp (2.1.2)
10
- net-ssh (>= 2.6.5)
11
- net-ssh (2.7.0)
12
-
13
- PLATFORMS
14
- ruby
15
-
16
- DEPENDENCIES
17
- net-sftp
18
- petri_net!