y_petri 2.0.3 → 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/y_petri/dependency_injection.rb +45 -0
- data/lib/y_petri/manipulator/petri_net_related_methods.rb +26 -7
- data/lib/y_petri/manipulator/simulation_related_methods.rb +4 -4
- data/lib/y_petri/net.rb +30 -21
- data/lib/y_petri/place/arcs.rb +96 -0
- data/lib/y_petri/place/guard.rb +122 -0
- data/lib/y_petri/place.rb +89 -132
- data/lib/y_petri/simulation.rb +191 -168
- data/lib/y_petri/timed_simulation.rb +29 -20
- data/lib/y_petri/transition/arcs.rb +51 -0
- data/lib/y_petri/transition/cocking.rb +32 -0
- data/lib/y_petri/transition/constructor_syntax.rb +378 -0
- data/lib/y_petri/transition.rb +391 -831
- data/lib/y_petri/version.rb +1 -1
- data/lib/y_petri/workspace/parametrized_subclassing.rb +8 -13
- data/lib/y_petri/workspace/simulation_related_methods.rb +13 -11
- data/lib/y_petri.rb +8 -3
- data/test/place_test.rb +83 -0
- data/test/transition_test.rb +325 -0
- data/test/y_petri_test.rb +15 -410
- metadata +12 -2
data/test/y_petri_test.rb
CHANGED
@@ -1,405 +1,14 @@
|
|
1
1
|
#! /usr/bin/ruby
|
2
|
-
#
|
2
|
+
# -*- coding: utf-8 -*-
|
3
3
|
|
4
4
|
require 'minitest/spec'
|
5
5
|
require 'minitest/autorun'
|
6
6
|
require_relative '../lib/y_petri' # tested component itself
|
7
7
|
# require 'y_petri'
|
8
|
-
|
9
8
|
# require 'sy'
|
10
9
|
|
11
10
|
include Pyper if require 'pyper'
|
12
11
|
|
13
|
-
# **************************************************************************
|
14
|
-
# Test of Place class, part I.
|
15
|
-
# **************************************************************************
|
16
|
-
#
|
17
|
-
describe ::YPetri::Place do
|
18
|
-
before do
|
19
|
-
# skip "to speed up testing"
|
20
|
-
@pç = pç = Class.new ::YPetri::Place
|
21
|
-
@p = pç.new! default_marking: 3.2,
|
22
|
-
marking: 1.1,
|
23
|
-
quantum: 0.1,
|
24
|
-
name: "P1"
|
25
|
-
end
|
26
|
-
|
27
|
-
describe "place behavior" do
|
28
|
-
before do
|
29
|
-
@p.m = 1.1
|
30
|
-
end
|
31
|
-
|
32
|
-
it "should have constant magic included" do
|
33
|
-
assert_respond_to @p, :name
|
34
|
-
assert_equal @p.name, :P1
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should have own marking and be able to update it" do
|
38
|
-
assert_equal 1.1, @p.marking
|
39
|
-
assert_equal 0.1, @p.quantum
|
40
|
-
assert_equal :P1, @p.name
|
41
|
-
@p.add 1
|
42
|
-
assert_equal 2.1, @p.value # alias for #marking
|
43
|
-
@p.subtract 0.5
|
44
|
-
assert_equal 1.6, @p.m
|
45
|
-
@p.reset_marking
|
46
|
-
assert_equal 3.2, @p.marking
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should respond to the arc getters" do
|
50
|
-
# #action_arcs & aliases
|
51
|
-
assert_equal [], @p.upstream_arcs
|
52
|
-
assert_equal [], @p.upstream_transitions
|
53
|
-
assert_equal [], @p.ϝ
|
54
|
-
# #test_arcs & aliases
|
55
|
-
assert_equal [], @p.downstream_arcs
|
56
|
-
assert_equal [], @p.downstream_transitions
|
57
|
-
# #arcs & aliasesnn
|
58
|
-
assert_equal [], @p.arcs
|
59
|
-
# #precedents & aliases
|
60
|
-
assert_equal [], @p.precedents
|
61
|
-
assert_equal [], @p.upstream_places
|
62
|
-
# #dependents & aliases
|
63
|
-
assert_equal [], @p.dependents
|
64
|
-
assert_equal [], @p.downstream_places
|
65
|
-
end
|
66
|
-
|
67
|
-
it "should respond to register and fire conn. transitions methods" do
|
68
|
-
assert_respond_to @p, :fire_upstream!
|
69
|
-
assert_respond_to @p, :fire_downstream!
|
70
|
-
assert_respond_to @p, :fire_upstream_recursively
|
71
|
-
assert_respond_to @p, :fire_downstream_recursively
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
# **************************************************************************
|
77
|
-
# Test of Transition class, part I.
|
78
|
-
# **************************************************************************
|
79
|
-
#
|
80
|
-
describe ::YPetri::Transition do
|
81
|
-
before do
|
82
|
-
# skip "to speed up testing"
|
83
|
-
@ç = ç = Class.new ::YPetri::Transition
|
84
|
-
@pç = pç = Class.new ::YPetri::Place
|
85
|
-
[ ç, pç ].each { |ç|
|
86
|
-
ç.class_exec {
|
87
|
-
define_method :Place do pç end
|
88
|
-
define_method :Transition do ç end
|
89
|
-
private :Place, :Transition
|
90
|
-
}
|
91
|
-
}
|
92
|
-
@p1 = pç.new default_marking: 1.0
|
93
|
-
@p2 = pç.new default_marking: 2.0
|
94
|
-
@p3 = pç.new default_marking: 3.0
|
95
|
-
@p4 = pç.new default_marking: 4.0
|
96
|
-
@p5 = pç.new default_marking: 5.0
|
97
|
-
end
|
98
|
-
|
99
|
-
describe "1. timeless nonstoichiometric (ts) transitions" do
|
100
|
-
|
101
|
-
# Note that timeless nonstoichiometric transitions require a function
|
102
|
-
# block, and thus are always functional
|
103
|
-
|
104
|
-
before do
|
105
|
-
@t1 = @ç.new codomain: [ @p1, @p3 ], domain: @p2, action: λ { |a| [ a, a ] }
|
106
|
-
# saying that the trans. is timed saves the day here:
|
107
|
-
@t2 = @ç.new codomain: [ @p1, @p3 ], action: λ { |t| [ t, t ] }, timed: true
|
108
|
-
# Only with domain is 1-ary closure allowed to be timeless:
|
109
|
-
@t3 = @ç.new codomain: [ @p1, @p3 ], action: λ { |t| [ t, t ] }, timed: false, domain: [ @p2 ]
|
110
|
-
# With nullary action closure, timeless is implied, so this is allowed
|
111
|
-
@t4 = @ç.new action: λ { [ 0.5, 0.5 ] }, codomain: [ @p1, @p3 ]
|
112
|
-
# ... also for stoichiometric variety
|
113
|
-
@t5 = @ç.new action: λ { 0.5 }, codomain: [ @p1, @p3 ], s: [ 1, 1 ]
|
114
|
-
end
|
115
|
-
|
116
|
-
it "should raise errors for bad parameters" do
|
117
|
-
# omitting the domain should raise ArgumentError about too much ambiguity:
|
118
|
-
assert_raises AErr do @ç.new codomain: [ @p1, @p3 ], action: λ { |t| [ t, t ] } end
|
119
|
-
# saying that the transition is timeless points to a conflict:
|
120
|
-
assert_raises AErr do @ç.new codomain: [ @p1, @p3 ], action: λ { |t| [ t, t ] }, timeless: true end
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should initi and perform" do
|
124
|
-
assert_equal [ @p2 ], @t1.domain
|
125
|
-
assert_equal [ @p1, @p3 ], @t1.action_arcs
|
126
|
-
assert @t1.functional?
|
127
|
-
assert @t1.timeless?
|
128
|
-
assert @t2.timed?
|
129
|
-
assert [@t3, @t4, @t5].all? { |t| t.timeless? }
|
130
|
-
assert @t2.rateless?
|
131
|
-
# that's enough, now let's flex them:
|
132
|
-
@t1.fire!
|
133
|
-
assert_equal [3, 5], [ @p1.marking, @p3.marking ]
|
134
|
-
@t3.fire!
|
135
|
-
assert_equal [5, 7], [ @p1.marking, @p3.marking ]
|
136
|
-
@t4.fire!
|
137
|
-
assert_equal [5.5, 7.5], [ @p1.marking, @p3.marking ]
|
138
|
-
@t5.fire!
|
139
|
-
assert_equal [6, 8], [ @p1.marking, @p3.marking ]
|
140
|
-
# now t2 for firing requires delta time
|
141
|
-
@t2.fire! 1
|
142
|
-
assert_equal [7, 9], [ @p1.marking, @p3.marking ]
|
143
|
-
@t2.fire! 0.1
|
144
|
-
assert_equal [7.1, 9.1], [@p1.marking, @p3.marking ]
|
145
|
-
# let's change @p2 marking
|
146
|
-
@p2.marking = 0.1
|
147
|
-
@t1.fire!
|
148
|
-
assert_in_epsilon 7.2, @p1.marking, 1e-9
|
149
|
-
assert_in_epsilon 9.2, @p3.marking, 1e-9
|
150
|
-
# let's test #domain_marking, #codomain_marking, #zero_action
|
151
|
-
assert_equal [ @p1.marking, @p3.marking ], @t1.codomain_marking
|
152
|
-
assert_equal [ @p2.marking ], @t1.domain_marking
|
153
|
-
assert_equal [ 0, 0 ], @t1.zero_action
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
describe "2. timed rateless non-stoichiometric (Tsr) transitions" do
|
158
|
-
#LATER: To save time, I omit the full test suite.
|
159
|
-
end
|
160
|
-
|
161
|
-
describe "3. timeless stoichiometric (tS) transitions" do
|
162
|
-
describe "functionless tS transitions" do
|
163
|
-
|
164
|
-
# For transitions with no function given (ie. functionless), it is
|
165
|
-
# required that their stoichiometric vector be given and their action
|
166
|
-
# closure is then automatically generated from the stoichio. vector
|
167
|
-
|
168
|
-
before do
|
169
|
-
# timeless transition with stoichiometric vector only, as hash
|
170
|
-
@ftS1 = @ç.new stoichiometry: { @p1 => 1 }
|
171
|
-
# timeless transition with stoichiometric vector as array + codomain
|
172
|
-
@ftS2 = @ç.new stoichiometry: 1, codomain: @p1
|
173
|
-
# :stoichiometric_vector is aliased as :sv
|
174
|
-
@ftS3 = @ç.new s: 1, codomain: @p1
|
175
|
-
# :codomain is aliased as :action_arcs
|
176
|
-
@ftS4 = @ç.new s: 1, action_arcs: @p1
|
177
|
-
# dropping of square brackets around size 1 vectors is optional
|
178
|
-
@ftS5 = @ç.new s: [ 1 ], downstream: [ @p1 ]
|
179
|
-
# another alias for :codomain is :downstream_places
|
180
|
-
@ftS6 = @ç.new s: [ 1 ], downstream_places: [ @p1 ]
|
181
|
-
# and now, all of the above transitions...
|
182
|
-
@tt = @ftS1, @ftS2, @ftS3, @ftS4, @ftS5, @ftS6
|
183
|
-
end
|
184
|
-
|
185
|
-
it "should work" do
|
186
|
-
# ...should be the same, having a single action arc:
|
187
|
-
assert @tt.all?{ |t| t.action_arcs == [ @p1 ] }
|
188
|
-
# timeless:
|
189
|
-
assert @tt.all?{ |t| t.timeless? }
|
190
|
-
# rateless:
|
191
|
-
assert @tt.all?{ |t| t.rateless? }
|
192
|
-
assert @tt.all?{ |t| not t.has_rate? }
|
193
|
-
# no assignment action
|
194
|
-
assert @tt.all?{ |t| not t.assignment_action? }
|
195
|
-
# not considered functional
|
196
|
-
assert @tt.all?{ |t| t.functionless? }
|
197
|
-
assert @tt.all?{ |t| not t.functional? }
|
198
|
-
# and having nullary action closure
|
199
|
-
assert @tt.all?{ |t| t.action_closure.arity == 0 }
|
200
|
-
# the transitions should be able to #fire!
|
201
|
-
@ftS1.fire!
|
202
|
-
# the difference is apparent: marking of place @p1 jumped to 2:
|
203
|
-
assert_equal 2, @p1.marking
|
204
|
-
# but should not #fire (no exclamation mark) unless cocked
|
205
|
-
assert !@ftS1.cocked?
|
206
|
-
@ftS1.fire
|
207
|
-
assert_equal 2, @p1.marking
|
208
|
-
# cock it
|
209
|
-
@ftS1.cock
|
210
|
-
assert @ftS1.cocked?
|
211
|
-
# uncock again, just to test cocking
|
212
|
-
@ftS1.uncock
|
213
|
-
assert @ftS1.uncocked?
|
214
|
-
@ftS1.cock
|
215
|
-
assert !@ftS1.uncocked?
|
216
|
-
@ftS1.fire
|
217
|
-
assert_equal 3, @p1.marking
|
218
|
-
# enough playing, we'll reset @p1 marking
|
219
|
-
@p1.reset_marking
|
220
|
-
assert_equal 1, @p1.marking
|
221
|
-
# #action
|
222
|
-
assert @tt.all?{ |t| t.action == [ 1 ] }
|
223
|
-
# #zero_action
|
224
|
-
assert @tt.all?{ |t| t.zero_action }
|
225
|
-
# #action_after_feasibility_check
|
226
|
-
assert @tt.all?{ |t| t.action_after_feasibility_check == [ 1 ] }
|
227
|
-
# #domain_marking
|
228
|
-
assert @tt.all?{ |t| t.domain_marking == [] }
|
229
|
-
# #codomain_marking
|
230
|
-
assert @tt.all?{ |t| t.codomain_marking == [ @p1.marking ] }
|
231
|
-
# #enabled?
|
232
|
-
assert @tt.all?{ |t| t.enabled? == true }
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
|
-
describe "functional tS transitions" do
|
237
|
-
|
238
|
-
# If function block is supplied to tS transitions, it governs
|
239
|
-
# their action based on marking of the domain places.
|
240
|
-
|
241
|
-
before do
|
242
|
-
# stoichiometric vector given as hash
|
243
|
-
@FtS1 = @ç.new action_closure: λ { 1 }, s: { @p1 => 1 }
|
244
|
-
# instead of :action_closure, just saying :action is enough
|
245
|
-
@FtS2 = @ç.new action: λ { 1 }, s: { @p1 => 1 }
|
246
|
-
# stoichiometric vector given as coeff. array + codomain
|
247
|
-
@FtS3 = @ç.new s: 1, codomain: @p1, action: λ { 1 }
|
248
|
-
# while saying timed: false and timeless: true should be ok
|
249
|
-
@FtS4 = @ç.new s: { @p1 => 1 }, action: λ { 1 }, timed: false
|
250
|
-
@FtS5 = @ç.new s: { @p1 => 1 }, action: λ { 1 }, timeless: true
|
251
|
-
# even both are ok
|
252
|
-
@FtS6 = @ç.new s: { @p1 => 1 }, action: λ { 1 }, timed: false, timeless: true
|
253
|
-
@tt = @FtS1, @FtS2, @FtS3, @FtS4, @FtS5, @FtS6
|
254
|
-
end
|
255
|
-
|
256
|
-
it "should raise errors for bad parameters" do
|
257
|
-
# saying timed: true should raise a complaint:
|
258
|
-
assert_raises AErr do @ç.new sv: { @p1 => 1 }, action: λ{ 1 }, timed: true end
|
259
|
-
# same for saying timeless: false
|
260
|
-
assert_raises AErr do
|
261
|
-
@ç.new sv: { @p1 => 1 }, action: λ{ 1 }, timeless: false end
|
262
|
-
# while conflicting values will raise error
|
263
|
-
assert_raises AErr do
|
264
|
-
@ç.new sv: { @p1 => 1 }, action: λ { 1 }, timeless: true, timed: true
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
it "should init and perform" do
|
269
|
-
assert @tt.all?{ |t| t.action_arcs == [ @p1 ] }
|
270
|
-
assert @tt.all?{ |t| t.timeless? }
|
271
|
-
assert @tt.all?{ |t| not t.has_rate? }
|
272
|
-
assert @tt.all?{ |t| t.rateless? }
|
273
|
-
assert @tt.all?{ |t| not t.assignment_action? }
|
274
|
-
assert @tt.all?{ |t| not t.functionless? }
|
275
|
-
assert @tt.all?{ |t| t.functional? }
|
276
|
-
# and having nullary action closure
|
277
|
-
assert @tt.all?{ |t| t.action_closure.arity == 0 }
|
278
|
-
# the transitions should be able to #fire!
|
279
|
-
@FtS1.fire!
|
280
|
-
# no need for more testing here
|
281
|
-
end
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
|
-
describe "4. timed rateless stoichiometric (TSr) transitions" do
|
286
|
-
|
287
|
-
# Rateless stoichiometric transitions have action closure, and they
|
288
|
-
# require a function block, and thus are always functional. Their
|
289
|
-
# function block must take Δt as its first argument.
|
290
|
-
|
291
|
-
#LATER: To save time, I omit the tests of TSr transitions for now.
|
292
|
-
end
|
293
|
-
|
294
|
-
describe "5. nonstoichiometric transitions with rate (sR transitions)" do
|
295
|
-
|
296
|
-
# They require a function block with arity equal to their domain, whose
|
297
|
-
# output is an array of rates of the size equal to that of codomain.
|
298
|
-
|
299
|
-
#LATER: To save time, I omit the full test suite.
|
300
|
-
end
|
301
|
-
|
302
|
-
describe "6. stoichiometric transitions with rate (SR transitions)" do
|
303
|
-
before do
|
304
|
-
# now this should give standard mass action by magic:
|
305
|
-
@SR1 = @ç.new s: { @p1 => -1, @p2 => -1, @p4 => 1 }, rate: 0.1
|
306
|
-
# while this has custom closure
|
307
|
-
@SR2 = @ç.new s: { @p1 => -1, @p3 => 1 }, rate: λ { |a| a * 0.5 }
|
308
|
-
# while this one even has domain specified:
|
309
|
-
@SR3 = @ç.new s: { @p1 => -1, @p2 => -1, @p4 => 1 }, upstream_arcs: @p3, rate: λ { |a| a * 0.5 }
|
310
|
-
end
|
311
|
-
|
312
|
-
it "should init and work" do
|
313
|
-
assert_equal true, @SR1.has_rate?
|
314
|
-
assert_equal [ @p1, @p2 ], @SR1.upstream_arcs
|
315
|
-
assert_equal [ @p1, @p2, @p4 ], @SR1.action_arcs
|
316
|
-
assert_equal [ @p1 ], @SR2.domain
|
317
|
-
assert_equal [ @p1, @p3 ], @SR2.action_arcs
|
318
|
-
assert_equal [ @p3 ], @SR3.domain
|
319
|
-
assert_equal [ @p1, @p2, @p4 ], @SR3.action_arcs
|
320
|
-
# and flex them
|
321
|
-
@SR1.fire! 1.0
|
322
|
-
assert_equal [ 0.8, 1.8, 4.2 ], [ @p1, @p2, @p4 ].map( &:marking )
|
323
|
-
@SR2.fire! 1.0
|
324
|
-
assert_equal [ 0.4, 3.4 ], [ @p1, @p3 ].map( &:marking )
|
325
|
-
# the action t3 cannot fire with delta time 1.0
|
326
|
-
assert_raises RuntimeError do @SR3.fire! 1.0 end
|
327
|
-
assert_equal [ 0.4, 1.8, 3.4, 4.2 ], [ @p1, @p2, @p3, @p4 ].map( &:marking )
|
328
|
-
# but it can fire with eg. delta time 0.1
|
329
|
-
@SR3.fire! 0.1
|
330
|
-
assert_in_epsilon 0.23, @p1.marking, 1e-15
|
331
|
-
assert_in_epsilon 1.63, @p2.marking, 1e-15
|
332
|
-
assert_in_epsilon 3.4, @p3.marking, 1e-15
|
333
|
-
assert_in_epsilon 4.37, @p4.marking, 1e-15
|
334
|
-
end
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
|
-
|
339
|
-
# **************************************************************************
|
340
|
-
# Test of mutual knowedge of upstream/downstream arcs of places/transitions.
|
341
|
-
# **************************************************************************
|
342
|
-
#
|
343
|
-
describe "upstream and downstream reference mτs of places and transitions" do
|
344
|
-
before do
|
345
|
-
# skip "to speed up testing"
|
346
|
-
@tç = tç = Class.new ::YPetri::Transition
|
347
|
-
@pç = pç = Class.new ::YPetri::Place
|
348
|
-
[ tç, pç ].each { |ç|
|
349
|
-
ç.class_exec {
|
350
|
-
define_method :Place do pç end
|
351
|
-
define_method :Transition do tç end
|
352
|
-
private :Place, :Transition
|
353
|
-
}
|
354
|
-
}
|
355
|
-
@a = @pç.new( dflt_m: 1.0 )
|
356
|
-
@b = @pç.new( dflt_m: 2.0 )
|
357
|
-
@c = @pç.new( dflt_m: 3.0 )
|
358
|
-
end
|
359
|
-
|
360
|
-
describe "Place" do
|
361
|
-
it "should have #register_ustream/downstream_transition methods" do
|
362
|
-
@t1 = @tç.new s: {}
|
363
|
-
@a.instance_variable_get( :@upstream_arcs ).must_equal []
|
364
|
-
@a.instance_variable_get( :@downstream_arcs ).must_equal []
|
365
|
-
@a.send :register_upstream_transition, @t1
|
366
|
-
@a.instance_variable_get( :@upstream_arcs ).must_equal [ @t1 ]
|
367
|
-
end
|
368
|
-
end
|
369
|
-
|
370
|
-
describe "upstream and downstream reference methods" do
|
371
|
-
before do
|
372
|
-
@t1 = @tç.new s: { @a => -1, @b => 1 }, rate: 1
|
373
|
-
end
|
374
|
-
|
375
|
-
it "should show on the referencers" do
|
376
|
-
@a.upstream_arcs.must_equal [ @t1 ]
|
377
|
-
@b.downstream_arcs.must_equal [ ]
|
378
|
-
@b.ϝ.must_equal [ @t1 ]
|
379
|
-
@t1.upstream_arcs.must_equal [ @a ]
|
380
|
-
@t1.action_arcs.must_equal [ @a, @b ]
|
381
|
-
end
|
382
|
-
end
|
383
|
-
|
384
|
-
describe "assignment action transitions" do
|
385
|
-
before do
|
386
|
-
@p = @pç.new default_marking: 1.0
|
387
|
-
@t = @tç.new codomain: @p, action: λ { 1 }, assignment_action: true
|
388
|
-
end
|
389
|
-
|
390
|
-
it "should work" do
|
391
|
-
@p.marking = 3
|
392
|
-
assert_equal 3, @p.marking
|
393
|
-
assert @t.assignment_action?
|
394
|
-
assert_equal @t.domain, []
|
395
|
-
assert_equal 0, @t.action_closure.arity
|
396
|
-
@t.fire!
|
397
|
-
assert_equal 1, @p.marking
|
398
|
-
end
|
399
|
-
end # context assignment action transiotions
|
400
|
-
end
|
401
|
-
|
402
|
-
|
403
12
|
# **************************************************************************
|
404
13
|
# Test of Net class.
|
405
14
|
# **************************************************************************
|
@@ -411,7 +20,7 @@ describe ::YPetri::Net do
|
|
411
20
|
@pç = pç = Class.new ::YPetri::Place
|
412
21
|
@nç = nç = Class.new ::YPetri::Net
|
413
22
|
[ tç, pç, nç ].each { |ç|
|
414
|
-
ç.class_exec {
|
23
|
+
ç.namespace!.class_exec {
|
415
24
|
define_method :Place do pç end
|
416
25
|
define_method :Transition do tç end
|
417
26
|
define_method :Net do nç end
|
@@ -422,8 +31,8 @@ describe ::YPetri::Net do
|
|
422
31
|
@p2 = pç.new ɴ: "B", quantum: 0.1, marking: 2.2
|
423
32
|
@p3 = pç.new ɴ: "C", quantum: 0.1, marking: 3.3
|
424
33
|
@net = nç.new
|
425
|
-
[
|
426
|
-
@p_not_included = pç.new ɴ: "X",
|
34
|
+
[@p1, @p2, @p3].each { |p| @net.include_place! p }
|
35
|
+
@p_not_included = pç.new ɴ: "X", marking: 0
|
427
36
|
end
|
428
37
|
|
429
38
|
describe "net of 3 places and no transitions" do
|
@@ -450,7 +59,7 @@ describe ::YPetri::Net do
|
|
450
59
|
it "should tell its qualities" do
|
451
60
|
assert_equal true, @net.functional?
|
452
61
|
assert_equal true, @net.timed?
|
453
|
-
assert @net.include?( @p1 ) && !@net.include?(
|
62
|
+
assert @net.include?( @p1 ) && !@net.include?( YPetri::Place.new )
|
454
63
|
end
|
455
64
|
|
456
65
|
it "should have 'standard equipment' methods" do
|
@@ -540,11 +149,7 @@ describe ::YPetri::Net do
|
|
540
149
|
assert_equal [], @net.nonstoichiometric_tt_with_rate
|
541
150
|
assert_equal [@t1], @net.stoichiometric_transitions_with_rate
|
542
151
|
assert_equal [:T1], @net.stoichiometric_tt_with_rate
|
543
|
-
assert_equal [], @net.transitions_with_explicit_assignment_action
|
544
|
-
assert_equal [], @net.transitions_with_assignment_action
|
545
152
|
assert_equal [], @net.assignment_transitions
|
546
|
-
assert_equal [], @net.tt_with_explicit_assignment_action
|
547
|
-
assert_equal [], @net.tt_with_assignment_action
|
548
153
|
assert_equal [], @net.assignment_tt
|
549
154
|
assert_equal [@t1, @t2], @net.stoichiometric_transitions
|
550
155
|
assert_equal [:T1, nil], @net.stoichiometric_tt
|
@@ -584,7 +189,7 @@ describe ::YPetri::Simulation do
|
|
584
189
|
@tç = tç = Class.new( ::YPetri::Transition )
|
585
190
|
@nç = nç = Class.new( ::YPetri::Net )
|
586
191
|
[ @pç, @tç, @nç ].each { |klass|
|
587
|
-
klass.class_exec {
|
192
|
+
klass.namespace!.class_exec {
|
588
193
|
private
|
589
194
|
define_method :Place do pç end
|
590
195
|
define_method :Transition do tç end
|
@@ -601,17 +206,17 @@ describe ::YPetri::Simulation do
|
|
601
206
|
rate: 0.1
|
602
207
|
@t2 = @tç.new name: "T2",
|
603
208
|
s: { @p1 => -1, @p3 => 1 },
|
604
|
-
rate:
|
209
|
+
rate: -> a { a * 0.5 }
|
605
210
|
@t3 = @tç.new name: "T3",
|
606
211
|
s: { @p1 => -1, @p2 => -1, @p4 => 1 },
|
607
212
|
domain: @p3,
|
608
|
-
rate:
|
213
|
+
rate: -> a { a * 0.5 }
|
609
214
|
@net = @nç.new << @p1 << @p2 << @p3 << @p4 << @p5
|
610
215
|
@net.include_transition! @t1
|
611
216
|
@net.include_transition! @t2
|
612
217
|
@net << @t3
|
613
218
|
@s = YPetri::Simulation.new net: @net,
|
614
|
-
|
219
|
+
marking_clamps: { @p1 => 2.0, @p5 => 2.0 },
|
615
220
|
initial_marking: { @p2 => @p2.default_marking,
|
616
221
|
@p3 => @p3.default_marking,
|
617
222
|
@p4 => @p4.default_marking }
|
@@ -792,8 +397,8 @@ describe ::YPetri::Simulation do
|
|
792
397
|
end
|
793
398
|
|
794
399
|
it "1. handles ts transitions" do
|
795
|
-
@s.Δ
|
796
|
-
@s.Δ
|
400
|
+
@s.Δ_closures_for_tsa.must_equal []
|
401
|
+
@s.Δ_if_tsa_fire_once.must_equal Matrix.zero( @s.free_pp.size, 1 )
|
797
402
|
end
|
798
403
|
|
799
404
|
it "2. handles Tsr transitions" do
|
@@ -938,7 +543,7 @@ describe ::YPetri::TimedSimulation do
|
|
938
543
|
describe "timed 'isomerization' with given as λ" do
|
939
544
|
before do
|
940
545
|
@t2 = ::YPetri::Transition.new s: { @a => -1, @c => 1 },
|
941
|
-
rate_closure:
|
546
|
+
rate_closure: -> a { a * 0.5 }
|
942
547
|
@net = ::YPetri::Net.new << @a << @b << @c << @t2
|
943
548
|
end
|
944
549
|
|
@@ -964,7 +569,7 @@ describe ::YPetri::TimedSimulation do
|
|
964
569
|
before do
|
965
570
|
@t3 = ::YPetri::Transition.new s: { @a => -1, @c => 1 },
|
966
571
|
domain: @b,
|
967
|
-
rate:
|
572
|
+
rate: -> a { a * 0.5 }
|
968
573
|
@net = ::YPetri::Net.new << @a << @b << @c << @t3
|
969
574
|
@sim = ::YPetri::TimedSimulation.new net: @net,
|
970
575
|
initial_marking: { @a => 1, @b => 0.6, @c => 3 },
|
@@ -1007,7 +612,7 @@ describe ::YPetri::Workspace do
|
|
1007
612
|
ɴ: "AA_BB_assembly"
|
1008
613
|
t2 = @w.Transition.new! ɴ: "AA_appearing",
|
1009
614
|
codomain: a,
|
1010
|
-
rate:
|
615
|
+
rate: -> { 0.1 },
|
1011
616
|
stoichiometry: 1
|
1012
617
|
@pp, @tt = [a, b, c], [t1, t2]
|
1013
618
|
@f_name = "test_output.csv"
|
@@ -1130,7 +735,7 @@ describe ::YPetri::Manipulator do
|
|
1130
735
|
@p = @m.Place ɴ: "P", default_marking: 1
|
1131
736
|
@q = @m.Place ɴ: "Q", default_marking: 1
|
1132
737
|
@decay_t = @m.Transition ɴ: "Tp", s: { P: -1 }, rate: 0.1
|
1133
|
-
@constant_flux_t = @m.Transition ɴ: "Tq", s: { Q: 1 }, rate:
|
738
|
+
@constant_flux_t = @m.Transition ɴ: "Tq", s: { Q: 1 }, rate: -> { 0.02 }
|
1134
739
|
@m.initial_marking @p => 1.2
|
1135
740
|
@m.initial_marking @q => 2
|
1136
741
|
@m.set_step 0.01
|
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.
|
4
|
+
version: 2.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- boris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: y_support
|
@@ -69,6 +69,7 @@ files:
|
|
69
69
|
- lib/y_petri/demonstrator_2.rb
|
70
70
|
- lib/y_petri/demonstrator_3.rb
|
71
71
|
- lib/y_petri/demonstrator_4.rb
|
72
|
+
- lib/y_petri/dependency_injection.rb
|
72
73
|
- lib/y_petri/manipulator.rb
|
73
74
|
- lib/y_petri/manipulator/hash_key_pointer.rb
|
74
75
|
- lib/y_petri/manipulator/petri_net_related_methods.rb
|
@@ -76,15 +77,22 @@ files:
|
|
76
77
|
- lib/y_petri/manipulator/simulation_related_methods.rb
|
77
78
|
- lib/y_petri/net.rb
|
78
79
|
- lib/y_petri/place.rb
|
80
|
+
- lib/y_petri/place/arcs.rb
|
81
|
+
- lib/y_petri/place/guard.rb
|
79
82
|
- lib/y_petri/simulation.rb
|
80
83
|
- lib/y_petri/timed_simulation.rb
|
81
84
|
- lib/y_petri/transition.rb
|
85
|
+
- lib/y_petri/transition/arcs.rb
|
86
|
+
- lib/y_petri/transition/cocking.rb
|
87
|
+
- lib/y_petri/transition/constructor_syntax.rb
|
82
88
|
- lib/y_petri/version.rb
|
83
89
|
- lib/y_petri/workspace.rb
|
84
90
|
- lib/y_petri/workspace/parametrized_subclassing.rb
|
85
91
|
- lib/y_petri/workspace/petri_net_related_methods.rb
|
86
92
|
- lib/y_petri/workspace/simulation_related_methods.rb
|
93
|
+
- test/place_test.rb
|
87
94
|
- test/simple_manual_examples.rb
|
95
|
+
- test/transition_test.rb
|
88
96
|
- test/y_petri_test.rb
|
89
97
|
- y_petri.gemspec
|
90
98
|
homepage: ''
|
@@ -111,5 +119,7 @@ signing_key:
|
|
111
119
|
specification_version: 4
|
112
120
|
summary: a Petri net domain model and simulator
|
113
121
|
test_files:
|
122
|
+
- test/place_test.rb
|
114
123
|
- test/simple_manual_examples.rb
|
124
|
+
- test/transition_test.rb
|
115
125
|
- test/y_petri_test.rb
|