y_petri 2.0.15 → 2.1.3

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.
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