y_petri 2.0.15 → 2.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/lib/y_petri/{manipulator → agent}/hash_key_pointer.rb +2 -2
  3. data/lib/y_petri/agent/petri_net_related.rb +115 -0
  4. data/lib/y_petri/{manipulator → agent}/selection.rb +2 -1
  5. data/lib/y_petri/{manipulator/simulation_related_methods.rb → agent/simulation_related.rb} +93 -110
  6. data/lib/y_petri/agent.rb +22 -0
  7. data/lib/y_petri/core/timed/euler.rb +20 -0
  8. data/lib/y_petri/core/timed/pseudo_euler.rb +31 -0
  9. data/lib/y_petri/core/timed/quasi_euler.rb +23 -0
  10. data/lib/y_petri/core/timed.rb +70 -0
  11. data/lib/y_petri/core/timeless/pseudo_euler.rb +20 -0
  12. data/lib/y_petri/core/timeless.rb +12 -0
  13. data/lib/y_petri/core.rb +100 -0
  14. data/lib/y_petri/dsl.rb +66 -0
  15. data/lib/y_petri/fixed_assets.rb +7 -0
  16. data/lib/y_petri/net/element_access.rb +239 -0
  17. data/lib/y_petri/net/state/feature/delta.rb +88 -0
  18. data/lib/y_petri/net/state/feature/firing.rb +57 -0
  19. data/lib/y_petri/net/state/feature/flux.rb +58 -0
  20. data/lib/y_petri/net/state/feature/gradient.rb +75 -0
  21. data/lib/y_petri/net/state/feature/marking.rb +62 -0
  22. data/lib/y_petri/net/state/feature.rb +79 -0
  23. data/lib/y_petri/net/state/features/dataset.rb +135 -0
  24. data/lib/y_petri/net/state/features/record.rb +50 -0
  25. data/lib/y_petri/net/state/features.rb +126 -0
  26. data/lib/y_petri/net/state.rb +121 -0
  27. data/lib/y_petri/net/timed.rb +8 -0
  28. data/lib/y_petri/net/visualization.rb +3 -3
  29. data/lib/y_petri/net.rb +73 -77
  30. data/lib/y_petri/place.rb +8 -3
  31. data/lib/y_petri/simulation/dependency.rb +107 -0
  32. data/lib/y_petri/simulation/element_representation.rb +20 -0
  33. data/lib/y_petri/simulation/elements/access.rb +57 -0
  34. data/lib/y_petri/simulation/elements.rb +45 -0
  35. data/lib/y_petri/simulation/feature_set.rb +21 -0
  36. data/lib/y_petri/simulation/initial_marking/access.rb +55 -0
  37. data/lib/y_petri/simulation/initial_marking.rb +15 -0
  38. data/lib/y_petri/simulation/marking_clamps/access.rb +34 -0
  39. data/lib/y_petri/simulation/marking_clamps.rb +18 -0
  40. data/lib/y_petri/simulation/marking_vector/access.rb +106 -0
  41. data/lib/y_petri/simulation/marking_vector.rb +156 -0
  42. data/lib/y_petri/simulation/matrix.rb +64 -0
  43. data/lib/y_petri/simulation/place_mapping.rb +62 -0
  44. data/lib/y_petri/simulation/place_representation.rb +74 -0
  45. data/lib/y_petri/simulation/places/access.rb +121 -0
  46. data/lib/y_petri/simulation/places/clamped.rb +8 -0
  47. data/lib/y_petri/simulation/places/free.rb +8 -0
  48. data/lib/y_petri/simulation/places/types.rb +25 -0
  49. data/lib/y_petri/simulation/places.rb +41 -0
  50. data/lib/y_petri/simulation/recorder.rb +54 -0
  51. data/lib/y_petri/simulation/timed/recorder.rb +53 -0
  52. data/lib/y_petri/simulation/timed.rb +161 -261
  53. data/lib/y_petri/simulation/timeless/recorder.rb +25 -0
  54. data/lib/y_petri/simulation/timeless.rb +35 -0
  55. data/lib/y_petri/simulation/transition_representation/A.rb +58 -0
  56. data/lib/y_petri/simulation/transition_representation/S.rb +45 -0
  57. data/lib/y_petri/simulation/transition_representation/T.rb +80 -0
  58. data/lib/y_petri/simulation/transition_representation/TS.rb +46 -0
  59. data/lib/y_petri/simulation/transition_representation/Ts.rb +32 -0
  60. data/lib/y_petri/simulation/transition_representation/a.rb +30 -0
  61. data/lib/y_petri/simulation/transition_representation/s.rb +29 -0
  62. data/lib/y_petri/simulation/transition_representation/t.rb +37 -0
  63. data/lib/y_petri/simulation/transition_representation/tS.rb +38 -0
  64. data/lib/y_petri/simulation/transition_representation/ts.rb +32 -0
  65. data/lib/y_petri/simulation/transition_representation/types.rb +62 -0
  66. data/lib/y_petri/simulation/transition_representation.rb +79 -0
  67. data/lib/y_petri/simulation/transitions/A.rb +40 -0
  68. data/lib/y_petri/simulation/transitions/S.rb +24 -0
  69. data/lib/y_petri/simulation/transitions/T.rb +34 -0
  70. data/lib/y_petri/simulation/transitions/TS.rb +57 -0
  71. data/lib/y_petri/simulation/transitions/Ts.rb +60 -0
  72. data/lib/y_petri/simulation/transitions/a.rb +8 -0
  73. data/lib/y_petri/simulation/transitions/access.rb +186 -0
  74. data/lib/y_petri/simulation/transitions/s.rb +9 -0
  75. data/lib/y_petri/simulation/transitions/t.rb +22 -0
  76. data/lib/y_petri/simulation/transitions/tS.rb +55 -0
  77. data/lib/y_petri/simulation/transitions/ts.rb +58 -0
  78. data/lib/y_petri/simulation/transitions/types.rb +98 -0
  79. data/lib/y_petri/simulation/transitions.rb +21 -0
  80. data/lib/y_petri/simulation.rb +176 -781
  81. data/lib/y_petri/transition/assignment.rb +7 -5
  82. data/lib/y_petri/transition/construction.rb +119 -187
  83. data/lib/y_petri/transition/init.rb +311 -0
  84. data/lib/y_petri/transition/ordinary_timeless.rb +8 -6
  85. data/lib/y_petri/transition/timed.rb +11 -18
  86. data/lib/y_petri/transition.rb +104 -132
  87. data/lib/y_petri/version.rb +1 -1
  88. data/lib/y_petri/world/dependency.rb +40 -0
  89. data/lib/y_petri/world/petri_net_related.rb +61 -0
  90. data/lib/y_petri/{workspace/simulation_related_methods.rb → world/simulation_related.rb} +42 -49
  91. data/lib/y_petri/world.rb +27 -0
  92. data/lib/y_petri.rb +47 -99
  93. data/test/{manipulator_test.rb → agent_test.rb} +19 -17
  94. data/{lib/y_petri → test/examples}/demonstrator.rb +0 -0
  95. data/{lib/y_petri → test/examples}/demonstrator_2.rb +1 -0
  96. data/{lib/y_petri → test/examples}/demonstrator_3.rb +0 -0
  97. data/{lib/y_petri → test/examples}/demonstrator_4.rb +0 -0
  98. data/test/examples/example_2.rb +16 -0
  99. data/test/{manual_examples.rb → examples/manual_examples.rb} +0 -0
  100. data/test/net_test.rb +126 -121
  101. data/test/place_test.rb +1 -1
  102. data/test/sim_test +565 -0
  103. data/test/simulation_test.rb +338 -264
  104. data/test/transition_test.rb +77 -174
  105. data/test/world_mock.rb +12 -0
  106. data/test/{workspace_test.rb → world_test.rb} +19 -20
  107. data/test/y_petri_test.rb +4 -5
  108. metadata +101 -26
  109. data/lib/y_petri/dependency_injection.rb +0 -45
  110. data/lib/y_petri/manipulator/petri_net_related_methods.rb +0 -74
  111. data/lib/y_petri/manipulator.rb +0 -20
  112. data/lib/y_petri/net/selections.rb +0 -209
  113. data/lib/y_petri/simulation/collections.rb +0 -460
  114. data/lib/y_petri/workspace/parametrized_subclassing.rb +0 -22
  115. data/lib/y_petri/workspace/petri_net_related_methods.rb +0 -88
  116. data/lib/y_petri/workspace.rb +0 -16
  117. data/test/timed_simulation_test.rb +0 -153
@@ -1,5 +1,5 @@
1
1
  #! /usr/bin/ruby
2
- # -*- coding: utf-8 -*-
2
+ # encoding: utf-8
3
3
 
4
4
  require 'minitest/spec'
5
5
  require 'minitest/autorun'
@@ -36,220 +36,124 @@ describe ::YPetri::Transition do
36
36
  # Note: ts transitions require a function, and thus are always functional
37
37
  before do
38
38
  @t1 = @ç.new codomain: [ @p1, @p3 ], domain: @p2, action: -> a { [ a, a ] }
39
- # saying that the transition is timed saves the day here:
40
- @t2 = @ç.new codomain: [ @p1, @p3 ], action: -> t { [ t, t ] }, timed: true
41
- # Only when the domain is unary, is the closure allowed to be timeless:
42
- @t3 = @ç.new codomain: [ @p1, @p3 ], action: -> t { [ t, t ] }, timed: false, domain: [ @p2 ]
43
- # With nullary action closure, timeless is implied, so this is allowed
44
- @t4 = @ç.new action: -> { [ 0.5, 0.5 ] }, codomain: [ @p1, @p3 ]
45
- # ... also for stoichiometric variety
46
- @t5 = @ç.new action: -> { 0.5 }, codomain: [ @p1, @p3 ], s: [ 1, 1 ]
39
+ @t2 = @ç.new codomain: [ @p1, @p3 ] do |t| [ t, t ] end
40
+ @t3 = @ç.new action: -> { [ 0.5, 0.5 ] }, codomain: [ @p1, @p3 ]
47
41
  end
48
42
 
49
43
  it "should raise errors for bad parameters" do
50
- # omitting the domain should raise ArgumentError about too much ambiguity:
51
- -> { @ç.new codomain: [ @p1, @p3 ], action: -> t { [ t, t ] } }
52
- .must_raise ArgumentError
53
- # saying that the transition is timeless points to a conflict:
54
- -> { @ç.new codomain: [ @p1, @p3 ], action: -> t { [ t, t ] }, timeless: true }
44
+ # codomain omitted
45
+ -> { @ç.new domain: @p2, action: -> t { [ t, t ] } }
55
46
  .must_raise ArgumentError
47
+ # mangled codomain
48
+ -> { @ç.new codomain: [ @p1, :a ], action: -> t { [ t, t ] } }
49
+ .must_raise TypeError
50
+ # domain omitted
51
+ -> { @ç.new codomain: [ @p1, :a ], action: -> t { [ t, t ] } }
52
+ .must_raise TypeError
53
+ # action closure arity greater than the domain
54
+ -> { @ç.new codomain: [ @p1, @p3 ], action: -> t { [ t, t ] }, domain: [] }
55
+ .must_raise TypeError
56
56
  end
57
57
 
58
- it "should initialize and perform" do
58
+ it "should work" do
59
+ @t1.type.must_equal :ts
59
60
  @t1.domain.must_equal [@p2]
60
61
  @t1.action_arcs.must_equal [@p1, @p3]
61
62
  assert @t1.functional?
62
- assert @t1.timeless?
63
- assert @t2.timed?
64
- assert [@t3, @t4, @t5].all? { |t| t.timeless? }
65
- assert @t2.rateless?
63
+ assert [@t1, @t2, @t3].all? { |t| t.timeless? }
64
+ assert [@t1, @t2, @t3].all? { |t| t.s? }
66
65
  # Now let's flex them:
67
66
  @t1.fire!
68
67
  [@p1.m, @p3.m].must_equal [3, 5]
69
68
  @t3.fire!
70
- [@p1.m, @p3.m].must_equal [5, 7]
71
- @t4.fire!
72
- [@p1.m, @p3.m].must_equal [5.5, 7.5]
73
- @t5.fire!
74
- [@p1.m, @p3.m].must_equal [6, 8]
75
- # now t2 for firing requires delta time
76
- @t2.fire! 1
77
- [@p1.m, @p3.m].must_equal [7, 9]
78
- @t2.fire! 0.1
79
- [@p1.m, @p3.m ].must_equal [7.1, 9.1]
80
- # let's change @p2 marking
81
- @p2.m = 0.1
82
- @t1.fire!
83
- assert_in_epsilon 7.2, @p1.marking, 1e-9
84
- assert_in_epsilon 9.2, @p3.marking, 1e-9
85
- # let's test #domain_marking, #codomain_marking, #zero_action
69
+ [@p1.m, @p3.m].must_equal [3.5, 5.5]
70
+ @t2.fire!
71
+ [@p1.m, @p3.m].must_equal [7.0, 9.0]
86
72
  @t1.codomain_marking.must_equal [@p1.m, @p3.m]
87
73
  @t1.domain_marking.must_equal [@p2.m]
88
74
  @t1.zero_action.must_equal [0, 0]
89
75
  end
90
76
  end
91
77
 
92
- describe "Tsr transitions (timed rateless non-stoichiometric)" do
93
- #LATER: To save time, I omit the full test suite.
94
- end
95
-
96
- describe "tS transitions (timeless stoichiometric)" do
97
- describe "functionless tS transitions" do
98
- # For functionless tS transitions, stoichiometric vector must be given,
99
- # from which the action closure is then generated.
100
-
101
- before do
102
- # tS transition with only stoichiometric vector, as hash
103
- @ftS1 = @ç.new stoichiometry: { @p1 => 1 }
104
- # tS transition with only stoichiometric vector, as array + codomain
105
- @ftS2 = @ç.new stoichiometry: 1, codomain: @p1
106
- # :stoichiometry keyword is aliased as :s
107
- @ftS3 = @ç.new s: 1, codomain: @p1
108
- # :codomain is aliased as :action_arcs
109
- @ftS4 = @ç.new s: 1, action_arcs: @p1
110
- # square brackets (optional for size 1 vectors)
111
- @ftS5 = @ç.new s: [ 1 ], downstream: [ @p1 ]
112
- # another alias of :codomain is :downstream_places
113
- @ftS6 = @ç.new s: [ 1 ], downstream_places: [ @p1 ]
114
- # And now, collect all of the above:
115
- @tt = @ftS1, @ftS2, @ftS3, @ftS4, @ftS5, @ftS6
116
- end
117
-
118
- it "should work" do
119
- # ...should be the same, having a single action arc:
120
- assert @tt.all? { |t| t.action_arcs == [@p1] }
121
- # timeless:
122
- assert @tt.all? { |t| t.timeless? }
123
- # rateless:
124
- assert @tt.all? { |t| t.rateless? }
125
- assert @tt.all? { |t| not t.has_rate? }
126
- # no assignment action
127
- assert @tt.all? { |t| not t.assignment_action? }
128
- # not considered functional
129
- assert @tt.all? { |t| t.functionless? }
130
- assert @tt.all? { |t| not t.functional? }
131
- # and having nullary action closure
132
- assert @tt.all? { |t| t.action_closure.arity == 0 }
133
- # the transitions should be able to #fire!
134
- @ftS1.fire!
135
- # the difference is apparent: marking of place @p1 jumped to 2:
136
- @p1.marking.must_equal 2
137
- # but should not #fire (no exclamation mark) unless cocked
138
- assert !@ftS1.cocked?
139
- @ftS1.fire
140
- @p1.marking.must_equal 2
141
- # cock it
142
- @ftS1.cock
143
- assert @ftS1.cocked?
144
- # uncock again, just to test cocking
145
- @ftS1.uncock
146
- assert @ftS1.uncocked?
147
- @ftS1.cock
148
- assert !@ftS1.uncocked?
149
- @ftS1.fire
150
- @p1.marking.must_equal 3
151
- # enough playing, we'll reset @p1 marking
152
- @p1.reset_marking
153
- @p1.marking.must_equal 1
154
- # #action
155
- assert @tt.all? { |t| t.action == [1] }
156
- # #zero_action
157
- assert @tt.all? { |t| t.zero_action }
158
- # #domain_marking
159
- assert @tt.all? { |t| t.domain_marking == [] }
160
- # #codomain_marking
161
- assert @tt.all? { |t| t.codomain_marking == [@p1.m] }
162
- # #enabled?
163
- @p1.m.must_equal 1
164
- @p1.guard.( 1 ).must_equal 1
165
- @tt.each { |t| t.enabled?.must_equal true }
166
- end
78
+ describe "tS transitions" do
79
+ before do
80
+ @t1 = @ç.new s: { @p5 => -1, @p1 => 1 }, action: proc { 1 }
81
+ @t2 = @ç.new s: { @p5 => -1, @p1 => 1 } # should be "functionless"
167
82
  end
168
83
 
169
- describe "functional tS transitions" do
170
- # Closure supplied to tS transitions governs their action.
171
-
172
- before do
173
- # stoichiometry given as hash
174
- @FtS1 = @ç.new action_closure: ->{ 1 }, s: { @p1 => 1 }
175
- # :action_closure has alias :action
176
- @FtS2 = @ç.new action: ->{ 1 }, s: { @p1 => 1 }
177
- # stoichiometry given as array of coefficients + codomain
178
- @FtS3 = @ç.new s: 1, codomain: @p1, action: ->{ 1 }
179
- # Specifying +timed: false+ as well as +timeless: true+ should be OK.
180
- @FtS4 = @ç.new s: { @p1 => 1 }, action: ->{ 1 }, timed: false
181
- @FtS5 = @ç.new s: { @p1 => 1 }, action: ->{ 1 }, timeless: true
182
- # Even together in one statement:
183
- @FtS6 = @ç.new s: { @p1 => 1 }, action: ->{ 1 }, timed: false, timeless: true
184
- @tt = @FtS1, @FtS2, @FtS3, @FtS4, @FtS5, @FtS6
185
- end
186
-
187
- it "should reject bad parameters" do
188
- # # +timed: true+ should raise a complaint:
189
- # -> { @ç.new s: { @p1 => 1 }, action: ->{ 1 }, timed: true }
190
- # .must_raise ArgumentError # constraint relaxed?
191
- end
192
-
193
- it "should init and perform" do
194
- assert @tt.all? { |t| t.action_arcs == [ @p1 ] }
195
- assert @tt.all? { |t| t.timeless? }
196
- assert @tt.all? { |t| not t.has_rate? }
197
- assert @tt.all? { |t| t.rateless? }
198
- assert @tt.all? { |t| not t.assignment_action? }
199
- assert @tt.all? { |t| not t.functionless? }
200
- assert @tt.all? { |t| t.functional? }
201
- # and having nullary action closure
202
- assert @tt.all? { |t| t.action_closure.arity == 0 }
203
- # the transitions should be able to #fire!
204
- @FtS1.fire!
205
- # no need for more testing here
206
- end
84
+ it "should work" do
85
+ @t1.type.must_equal :tS
86
+ @t2.type.must_equal :tS
87
+ @t1.codomain.must_equal [@p5, @p1]
88
+ @t2.codomain.must_equal [@p5, @p1]
89
+ assert @t1.functional?
90
+ assert ! @t2.functional? # "functionless"
91
+ assert ! @t1.timed?
92
+ assert ! @t2.timed?
93
+ @t1.stoichiometry.must_equal [-1, 1]
94
+ @t2.stoichiometry.must_equal [-1, 1]
95
+ @t1.stoichio.must_equal( { @p5 => -1, @p1 => 1 } )
96
+ @t2.stoichio.must_equal( { @p5 => -1, @p1 => 1 } )
97
+ @t1.s.must_equal( { @p5.object_id => -1, @p1.object_id => 1 } )
98
+ @t2.s.must_equal( { @p5.object_id => -1, @p1.object_id => 1 } )
99
+ @t1.domain.must_equal [@p5] # inferred domain
100
+ @t2.domain.must_equal [] # domain is empty in functionless transitions!
101
+ [@p1.m, @p5.m].must_equal [1, 5]
102
+ @t1.fire!
103
+ [@p1.m, @p5.m].must_equal [2, 4]
104
+ @t2.fire!
105
+ [@p1.m, @p5.m].must_equal [3, 3]
207
106
  end
208
107
  end
209
108
 
210
- describe "TSr transitions (timed rateless stoichiometric)" do
211
- # Sr transitions have an action closure, require a function block, and thus
212
- # are always functional. Their closure must take Δt as its first argument.
213
-
214
- #LATER: To save time, I omit the tests of TSr transitions for now.
215
- end
216
109
 
217
- describe "sR transitions (nonstoichiometric with rate)" do
218
- # Expect a function block with arity equal to their domain size, and output
219
- # arity equal to the codomain size.
110
+ describe "Ts transitions" do
111
+ before do
112
+ @t1 = @ç.new domain: @p5, codomain: [@p5, @p1], rate: proc { [-1, 1] }
113
+ end
220
114
 
221
- #LATER: To save time, I omit the full test suite.
115
+ it "should work" do
116
+ @t1.type.must_equal :Ts
117
+ @t1.codomain.must_equal [@p5, @p1]
118
+ assert @t1.functional?
119
+ assert @t1.timed?
120
+ @t1.domain.must_equal [@p5]
121
+ [@p1.m, @p5.m].must_equal [1, 5]
122
+ @t1.rate_closure.arity.must_equal 0
123
+ @t1.fire! 0.5
124
+ [@p1.m, @p5.m].must_equal [1.5, 4.5]
125
+ end
222
126
  end
223
127
 
224
- describe "SR transitions (stoichiometric with rate)" do
128
+ describe "TS transitions (timed stoichiometric)" do
225
129
  before do
226
130
  # This should give standard mass action by magic:
227
- @SR1 = @ç.new s: { @p1 => -1, @p2 => -1, @p4 => 1 }, rate: 0.1
131
+ @TS1 = @ç.new s: { @p1 => -1, @p2 => -1, @p4 => 1 }, rate: 0.1
228
132
  # While this has custom closure:
229
- @SR2 = @ç.new s: { @p1 => -1, @p3 => 1 }, rate: -> a { a * 0.5 }
133
+ @TS2 = @ç.new s: { @p1 => -1, @p3 => 1 }, rate: -> a { a * 0.5 }
230
134
  # While this one even has domain explicitly specified:
231
- @SR3 = @ç.new s: { @p1 => -1, @p2 => -1, @p4 => 1 },
135
+ @TS3 = @ç.new s: { @p1 => -1, @p2 => -1, @p4 => 1 },
232
136
  upstream_arcs: @p3, rate: -> a { a * 0.5 }
233
137
  end
234
138
 
235
139
  it "should init and work" do
236
- @SR1.has_rate?.must_equal true
237
- @SR1.upstream_arcs.must_equal [@p1, @p2]
238
- @SR1.action_arcs.must_equal [@p1, @p2, @p4]
239
- @SR2.domain.must_equal [@p1]
240
- @SR2.action_arcs.must_equal [@p1, @p3]
241
- @SR3.domain.must_equal [@p3]
242
- @SR3.action_arcs.must_equal [@p1, @p2, @p4]
140
+ @TS1.timed?.must_equal true
141
+ @TS1.upstream_arcs.must_equal [@p1, @p2]
142
+ @TS1.action_arcs.must_equal [@p1, @p2, @p4]
143
+ @TS2.domain.must_equal [@p1]
144
+ @TS2.action_arcs.must_equal [@p1, @p3]
145
+ @TS3.domain.must_equal [@p3]
146
+ @TS3.action_arcs.must_equal [@p1, @p2, @p4]
243
147
  # and flex them
244
- @SR1.fire! 1.0
148
+ @TS1.fire! 1.0
245
149
  [@p1, @p2, @p4].map( &:marking ).must_equal [0.8, 1.8, 4.2]
246
- @SR2.fire! 1.0
150
+ @TS2.fire! 1.0
247
151
  [@p1, @p3].map( &:marking ).must_equal [0.4, 3.4]
248
152
  # the action t3 cannot fire with delta time 1.0
249
- -> { @SR3.fire! 1.0 }.must_raise YPetri::GuardError
153
+ -> { @TS3.fire! 1.0 }.must_raise YPetri::GuardError
250
154
  [@p1, @p2, @p3, @p4].map( &:marking ).must_equal [0.4, 1.8, 3.4, 4.2]
251
155
  # but it can fire with eg. delta time 0.1
252
- @SR3.fire! 0.1
156
+ @TS3.fire! 0.1
253
157
  assert_in_epsilon 0.23, @p1.marking, 1e-15
254
158
  assert_in_epsilon 1.63, @p2.marking, 1e-15
255
159
  assert_in_epsilon 3.4, @p3.marking, 1e-15
@@ -265,7 +169,6 @@ end
265
169
  #
266
170
  describe "upstream and downstream reference mτs of places and transitions" do
267
171
  before do
268
- # skip "to speed up testing"
269
172
  @tç = tç = Class.new YPetri::Transition
270
173
  @pç = pç = Class.new YPetri::Place
271
174
  [ tç, pç ].each { |ç|
@@ -0,0 +1,12 @@
1
+ WORLD_MOCK = -> do
2
+ w = YPetri::World.new
3
+ [ w.Place, w.Transition, w.Net ].tap do |p, t, _|
4
+ def p.nw( n, *args, &block )
5
+ new( *args ).tap { |i| i.name = n }
6
+ end
7
+
8
+ def t.nw( n, *args, &block )
9
+ new( *args ).tap { |i| i.name = n }
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,5 @@
1
1
  #! /usr/bin/ruby
2
- # -*- coding: utf-8 -*-
2
+ # encoding: utf-8
3
3
 
4
4
  require 'minitest/spec'
5
5
  require 'minitest/autorun'
@@ -9,34 +9,32 @@ require_relative '../lib/y_petri' # tested component itself
9
9
 
10
10
  include Pyper if require 'pyper'
11
11
 
12
- describe YPetri::Workspace do
12
+ describe YPetri::World do
13
13
  before do
14
- @w = YPetri::Workspace.new
15
- a = @w.Place.new!( default_marking: 1.0, name: "AA" )
16
- b = @w.Place.new!( default_marking: 2.0, name: "BB" )
17
- c = @w.Place.new!( ɴ: "CC", default_marking: 3.0 )
18
- t1 = @w.Transition.new! s: { a => -1, b => -1, c => 1 },
14
+ @w = YPetri::World.new
15
+ a = @w.Place.avid( default_marking: 1.0, name: "AA" )
16
+ b = @w.Place.avid( default_marking: 2.0, name: "BB" )
17
+ c = @w.Place.avid( ɴ: "CC", default_marking: 3.0 )
18
+ t1 = @w.Transition.avid s: { a => -1, b => -1, c => 1 },
19
19
  rate: 0.1,
20
20
  ɴ: "AA_BB_assembly"
21
- t2 = @w.Transition.new! ɴ: "AA_appearing",
21
+ t2 = @w.Transition.avid ɴ: "AA_appearing",
22
22
  codomain: a,
23
23
  rate: -> { 0.1 },
24
24
  stoichiometry: 1
25
25
  @pp, @tt = [a, b, c], [t1, t2]
26
26
  @f_name = "test_output.csv"
27
- @w.set_imc @pp.τBᴍHτ( &:default_marking )
27
+ @w.set_imc @pp >> @pp.map( &:default_marking )
28
28
  @w.set_ssc step: 0.1, sampling: 10, time: 0..50
29
29
  @w.set_cc( {} )
30
- @sim = @w.new_timed_simulation
30
+ @sim = @w.new_simulation
31
31
  File.delete @f_name rescue nil
32
32
  end
33
33
 
34
34
  it "should present places, transitions, nets, simulations" do
35
35
  assert_kind_of YPetri::Net, @w.Net::Top
36
36
  assert_equal @pp[0], @w.place( "AA" )
37
- assert_equal :AA, @w.pl( @pp[0] )
38
37
  assert_equal @tt[0], @w.transition( "AA_BB_assembly" )
39
- assert_equal :AA_appearing, @w.tr( @tt[1] )
40
38
  assert_equal @pp, @w.places
41
39
  assert_equal @tt, @w.transitions
42
40
  assert_equal 1, @w.nets.size
@@ -48,25 +46,26 @@ describe YPetri::Workspace do
48
46
  assert_equal [:Base], @w.clamp_collections.keys
49
47
  assert_equal [:Base], @w.initial_marking_collections.keys
50
48
  assert_equal [:Base], @w.simulation_settings_collections.keys
51
- assert_equal [:AA, :BB, :CC], @w.pp
52
- assert_equal [:AA_BB_assembly, :AA_appearing], @w.tt
53
- assert_equal [:Top], @w.nn
49
+ assert_equal [:AA, :BB, :CC], @w.places.names
50
+ assert_equal [:AA_BB_assembly, :AA_appearing], @w.transitions.names
51
+ assert_equal [:Top], @w.nets.names
54
52
  end
55
53
 
56
54
  it "should simulate" do
57
55
  assert_equal 1, @w.simulations.size
58
56
  assert_kind_of( YPetri::Simulation, @w.simulation )
59
- assert_equal 2, @w.simulation.SR_transitions.size
57
+ assert_equal 2, @w.simulation.TS_tt.size
60
58
  @tt[0].domain.must_equal [ @pp[0], @pp[1] ]
61
59
  @tt[1].domain.must_equal []
62
- assert_equal [0.2, 0.1], @w.simulation.φ.column_to_a
60
+ assert @w.simulation.timed?
61
+ assert_equal [0.2, 0.1], @w.simulation.flux_vector.column_to_a
63
62
  @w.simulation.step!
64
63
  @w.simulation.run!
65
- rec_string = @w.simulation.recording_csv_string
66
- expected_recording_string =
64
+ rec_csv = @w.simulation.recording.to_csv
65
+ expected_rec_csv =
67
66
  "0.0,1.0,2.0,3.0\n" +
68
67
  "10.0,0.86102,0.86102,4.13898\n" +
69
68
  "20.0,1.29984,0.29984,4.70016\n"
70
- assert rec_string.start_with?( expected_recording_string )
69
+ rec_csv.to_s[0, expected_rec_csv.size].must_equal expected_rec_csv
71
70
  end
72
71
  end
data/test/y_petri_test.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #! /usr/bin/ruby
2
- # -*- coding: utf-8 -*-
2
+ # encoding: utf-8
3
3
 
4
4
  require 'minitest/spec'
5
5
  require 'minitest/autorun'
@@ -11,7 +11,7 @@ require_relative '../lib/y_petri' # tested component itself
11
11
  #
12
12
  describe YPetri do
13
13
  it "should have basic classes" do
14
- [ :Place, :Transition, :Net, :Simulation, :Workspace, :Manipulator ]
14
+ [ :Place, :Transition, :Net, :Simulation, :World, :Agent ]
15
15
  .each { |ß| YPetri.const_get( ß ).must_be_kind_of Module }
16
16
  end
17
17
  end
@@ -22,6 +22,5 @@ require_relative 'place_test'
22
22
  require_relative 'transition_test'
23
23
  require_relative 'net_test'
24
24
  require_relative 'simulation_test'
25
- require_relative 'timed_simulation_test'
26
- require_relative 'workspace_test'
27
- require_relative 'manipulator_test'
25
+ require_relative 'world_test'
26
+ require_relative 'agent_test'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: y_petri
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.15
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - boris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-30 00:00:00.000000000 Z
11
+ date: 2013-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: y_support
@@ -65,51 +65,120 @@ files:
65
65
  - README.md
66
66
  - Rakefile
67
67
  - lib/y_petri.rb
68
- - lib/y_petri/demonstrator.rb
69
- - lib/y_petri/demonstrator_2.rb
70
- - lib/y_petri/demonstrator_3.rb
71
- - lib/y_petri/demonstrator_4.rb
72
- - lib/y_petri/dependency_injection.rb
73
- - lib/y_petri/manipulator.rb
74
- - lib/y_petri/manipulator/hash_key_pointer.rb
75
- - lib/y_petri/manipulator/petri_net_related_methods.rb
76
- - lib/y_petri/manipulator/selection.rb
77
- - lib/y_petri/manipulator/simulation_related_methods.rb
68
+ - lib/y_petri/agent.rb
69
+ - lib/y_petri/agent/hash_key_pointer.rb
70
+ - lib/y_petri/agent/petri_net_related.rb
71
+ - lib/y_petri/agent/selection.rb
72
+ - lib/y_petri/agent/simulation_related.rb
73
+ - lib/y_petri/core.rb
74
+ - lib/y_petri/core/timed.rb
75
+ - lib/y_petri/core/timed/euler.rb
76
+ - lib/y_petri/core/timed/pseudo_euler.rb
77
+ - lib/y_petri/core/timed/quasi_euler.rb
78
+ - lib/y_petri/core/timeless.rb
79
+ - lib/y_petri/core/timeless/pseudo_euler.rb
80
+ - lib/y_petri/dsl.rb
81
+ - lib/y_petri/fixed_assets.rb
78
82
  - lib/y_petri/net.rb
79
- - lib/y_petri/net/selections.rb
83
+ - lib/y_petri/net/element_access.rb
84
+ - lib/y_petri/net/state.rb
85
+ - lib/y_petri/net/state/feature.rb
86
+ - lib/y_petri/net/state/feature/delta.rb
87
+ - lib/y_petri/net/state/feature/firing.rb
88
+ - lib/y_petri/net/state/feature/flux.rb
89
+ - lib/y_petri/net/state/feature/gradient.rb
90
+ - lib/y_petri/net/state/feature/marking.rb
91
+ - lib/y_petri/net/state/features.rb
92
+ - lib/y_petri/net/state/features/dataset.rb
93
+ - lib/y_petri/net/state/features/record.rb
94
+ - lib/y_petri/net/timed.rb
80
95
  - lib/y_petri/net/visualization.rb
81
96
  - lib/y_petri/place.rb
82
97
  - lib/y_petri/place/arcs.rb
83
98
  - lib/y_petri/place/guard.rb
84
99
  - lib/y_petri/simulation.rb
85
- - lib/y_petri/simulation/collections.rb
100
+ - lib/y_petri/simulation/dependency.rb
101
+ - lib/y_petri/simulation/element_representation.rb
102
+ - lib/y_petri/simulation/elements.rb
103
+ - lib/y_petri/simulation/elements/access.rb
104
+ - lib/y_petri/simulation/feature_set.rb
105
+ - lib/y_petri/simulation/initial_marking.rb
106
+ - lib/y_petri/simulation/initial_marking/access.rb
107
+ - lib/y_petri/simulation/marking_clamps.rb
108
+ - lib/y_petri/simulation/marking_clamps/access.rb
109
+ - lib/y_petri/simulation/marking_vector.rb
110
+ - lib/y_petri/simulation/marking_vector/access.rb
111
+ - lib/y_petri/simulation/matrix.rb
112
+ - lib/y_petri/simulation/place_mapping.rb
113
+ - lib/y_petri/simulation/place_representation.rb
114
+ - lib/y_petri/simulation/places.rb
115
+ - lib/y_petri/simulation/places/access.rb
116
+ - lib/y_petri/simulation/places/clamped.rb
117
+ - lib/y_petri/simulation/places/free.rb
118
+ - lib/y_petri/simulation/places/types.rb
119
+ - lib/y_petri/simulation/recorder.rb
86
120
  - lib/y_petri/simulation/timed.rb
121
+ - lib/y_petri/simulation/timed/recorder.rb
122
+ - lib/y_petri/simulation/timeless.rb
123
+ - lib/y_petri/simulation/timeless/recorder.rb
124
+ - lib/y_petri/simulation/transition_representation.rb
125
+ - lib/y_petri/simulation/transition_representation/A.rb
126
+ - lib/y_petri/simulation/transition_representation/S.rb
127
+ - lib/y_petri/simulation/transition_representation/T.rb
128
+ - lib/y_petri/simulation/transition_representation/TS.rb
129
+ - lib/y_petri/simulation/transition_representation/Ts.rb
130
+ - lib/y_petri/simulation/transition_representation/a.rb
131
+ - lib/y_petri/simulation/transition_representation/s.rb
132
+ - lib/y_petri/simulation/transition_representation/t.rb
133
+ - lib/y_petri/simulation/transition_representation/tS.rb
134
+ - lib/y_petri/simulation/transition_representation/ts.rb
135
+ - lib/y_petri/simulation/transition_representation/types.rb
136
+ - lib/y_petri/simulation/transitions.rb
137
+ - lib/y_petri/simulation/transitions/A.rb
138
+ - lib/y_petri/simulation/transitions/S.rb
139
+ - lib/y_petri/simulation/transitions/T.rb
140
+ - lib/y_petri/simulation/transitions/TS.rb
141
+ - lib/y_petri/simulation/transitions/Ts.rb
142
+ - lib/y_petri/simulation/transitions/a.rb
143
+ - lib/y_petri/simulation/transitions/access.rb
144
+ - lib/y_petri/simulation/transitions/s.rb
145
+ - lib/y_petri/simulation/transitions/t.rb
146
+ - lib/y_petri/simulation/transitions/tS.rb
147
+ - lib/y_petri/simulation/transitions/ts.rb
148
+ - lib/y_petri/simulation/transitions/types.rb
87
149
  - lib/y_petri/transition.rb
88
150
  - lib/y_petri/transition/arcs.rb
89
151
  - lib/y_petri/transition/assignment.rb
90
152
  - lib/y_petri/transition/cocking.rb
91
153
  - lib/y_petri/transition/construction.rb
154
+ - lib/y_petri/transition/init.rb
92
155
  - lib/y_petri/transition/ordinary_timeless.rb
93
156
  - lib/y_petri/transition/timed.rb
94
157
  - lib/y_petri/version.rb
95
- - lib/y_petri/workspace.rb
96
- - lib/y_petri/workspace/parametrized_subclassing.rb
97
- - lib/y_petri/workspace/petri_net_related_methods.rb
98
- - lib/y_petri/workspace/simulation_related_methods.rb
158
+ - lib/y_petri/world.rb
159
+ - lib/y_petri/world/dependency.rb
160
+ - lib/y_petri/world/petri_net_related.rb
161
+ - lib/y_petri/world/simulation_related.rb
99
162
  - test/acceptance/basic_usage_test.rb
100
163
  - test/acceptance/simulation_test.rb
101
164
  - test/acceptance/simulation_with_physical_units_test.rb
102
165
  - test/acceptance/token_game_test.rb
103
166
  - test/acceptance/visualization_test.rb
104
167
  - test/acceptance_tests.rb
105
- - test/manipulator_test.rb
106
- - test/manual_examples.rb
168
+ - test/agent_test.rb
169
+ - test/examples/demonstrator.rb
170
+ - test/examples/demonstrator_2.rb
171
+ - test/examples/demonstrator_3.rb
172
+ - test/examples/demonstrator_4.rb
173
+ - test/examples/example_2.rb
174
+ - test/examples/manual_examples.rb
107
175
  - test/net_test.rb
108
176
  - test/place_test.rb
177
+ - test/sim_test
109
178
  - test/simulation_test.rb
110
- - test/timed_simulation_test.rb
111
179
  - test/transition_test.rb
112
- - test/workspace_test.rb
180
+ - test/world_mock.rb
181
+ - test/world_test.rb
113
182
  - test/y_petri_test.rb
114
183
  - y_petri.gemspec
115
184
  homepage: ''
@@ -142,12 +211,18 @@ test_files:
142
211
  - test/acceptance/token_game_test.rb
143
212
  - test/acceptance/visualization_test.rb
144
213
  - test/acceptance_tests.rb
145
- - test/manipulator_test.rb
146
- - test/manual_examples.rb
214
+ - test/agent_test.rb
215
+ - test/examples/demonstrator.rb
216
+ - test/examples/demonstrator_2.rb
217
+ - test/examples/demonstrator_3.rb
218
+ - test/examples/demonstrator_4.rb
219
+ - test/examples/example_2.rb
220
+ - test/examples/manual_examples.rb
147
221
  - test/net_test.rb
148
222
  - test/place_test.rb
223
+ - test/sim_test
149
224
  - test/simulation_test.rb
150
- - test/timed_simulation_test.rb
151
225
  - test/transition_test.rb
152
- - test/workspace_test.rb
226
+ - test/world_mock.rb
227
+ - test/world_test.rb
153
228
  - test/y_petri_test.rb
@@ -1,45 +0,0 @@
1
- #encoding: utf-8
2
-
3
- # Provides basic skeleton for dependency injection for the triples of the
4
- # parametrized subclasses of Place, Transition and Net in different workspaces.
5
- #
6
- module YPetri::DependencyInjection
7
-
8
- private
9
-
10
- # Place class -- to be overriden in subclasses for dependency injection.
11
- #
12
- def Place
13
- YPetri::Place
14
- end
15
-
16
- # Transition class -- to be overriden in subclasses for dependency injection.
17
- #
18
- def Transition
19
- YPetri::Transition
20
- end
21
-
22
- # Net class -- to be overriden in subclasses for dependency injection
23
- #
24
- def Net
25
- YPetri::Net
26
- end
27
-
28
- # Place instance identification.
29
- #
30
- def place id
31
- Place().instance( id )
32
- end
33
-
34
- # Transition instance identification.
35
- #
36
- def transition id
37
- Transition().instance( id )
38
- end
39
-
40
- # Net instance identification.
41
- #
42
- def net id
43
- Net().instance( id )
44
- end
45
- end # module YPetri::DependencyInjection