y_petri 2.1.3 → 2.1.6
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 +4 -4
- data/lib/y_petri/agent/petri_net_related.rb +25 -5
- data/lib/y_petri/agent/selection.rb +12 -10
- data/lib/y_petri/agent/simulation_related.rb +14 -58
- data/lib/y_petri/agent.rb +15 -17
- data/lib/y_petri/core/timed/euler.rb +13 -15
- data/lib/y_petri/core/timed/pseudo_euler.rb +22 -24
- data/lib/y_petri/core/timed/quasi_euler.rb +15 -17
- data/lib/y_petri/core/timed.rb +42 -44
- data/lib/y_petri/core/timeless/pseudo_euler.rb +12 -14
- data/lib/y_petri/core/timeless.rb +10 -7
- data/lib/y_petri/core.rb +3 -3
- data/lib/y_petri/dsl.rb +46 -46
- data/lib/y_petri/fixed_assets.rb +8 -0
- data/lib/y_petri/net/data_set.rb +238 -0
- data/lib/y_petri/net/own_state.rb +63 -0
- data/lib/y_petri/net/state/feature/delta.rb +98 -71
- data/lib/y_petri/net/state/feature/firing.rb +51 -54
- data/lib/y_petri/net/state/feature/flux.rb +51 -55
- data/lib/y_petri/net/state/feature/gradient.rb +55 -59
- data/lib/y_petri/net/state/feature/marking.rb +55 -59
- data/lib/y_petri/net/state/feature.rb +65 -67
- data/lib/y_petri/net/state/features/record.rb +150 -43
- data/lib/y_petri/net/state/features.rb +252 -96
- data/lib/y_petri/net/state.rb +114 -106
- data/lib/y_petri/net/visualization.rb +3 -2
- data/lib/y_petri/net.rb +29 -24
- data/lib/y_petri/place/arcs.rb +3 -3
- data/lib/y_petri/place/guard.rb +35 -117
- data/lib/y_petri/place/guarded.rb +86 -0
- data/lib/y_petri/place.rb +6 -3
- data/lib/y_petri/simulation/element_representation.rb +2 -2
- data/lib/y_petri/simulation/elements.rb +3 -1
- data/lib/y_petri/simulation/feature_set.rb +3 -1
- data/lib/y_petri/simulation/marking_vector.rb +3 -1
- data/lib/y_petri/simulation/place_mapping.rb +3 -1
- data/lib/y_petri/simulation/places.rb +1 -1
- data/lib/y_petri/simulation/recorder.rb +60 -54
- data/lib/y_petri/simulation/timed/recorder.rb +12 -1
- data/lib/y_petri/simulation/timed.rb +173 -172
- data/lib/y_petri/simulation/transitions/access.rb +97 -29
- data/lib/y_petri/simulation.rb +11 -9
- data/lib/y_petri/transition/{assignment.rb → A.rb} +2 -2
- data/lib/y_petri/transition/{timed.rb → T.rb} +2 -2
- data/lib/y_petri/transition/arcs.rb +3 -3
- data/lib/y_petri/transition/cocking.rb +3 -3
- data/lib/y_petri/transition/{init.rb → construction_convenience.rb} +6 -53
- data/lib/y_petri/transition/{ordinary_timeless.rb → t.rb} +2 -2
- data/lib/y_petri/transition/type.rb +103 -0
- data/lib/y_petri/transition/type_information.rb +103 -0
- data/lib/y_petri/transition/types.rb +107 -0
- data/lib/y_petri/transition/usable_without_world.rb +14 -0
- data/lib/y_petri/transition.rb +87 -101
- data/lib/y_petri/version.rb +1 -1
- data/lib/y_petri/world/dependency.rb +30 -28
- data/lib/y_petri/world.rb +10 -8
- data/test/acceptance/basic_usage_test.rb +3 -3
- data/test/acceptance/simulation_test.rb +3 -3
- data/test/acceptance/simulation_with_physical_units_test.rb +2 -2
- data/test/acceptance/token_game_test.rb +2 -2
- data/test/acceptance/visualization_test.rb +3 -3
- data/test/acceptance_tests.rb +2 -2
- data/test/agent_test.rb +1 -1
- data/test/net_test.rb +41 -17
- data/test/place_test.rb +1 -1
- data/test/simulation_test.rb +39 -39
- data/test/transition_test.rb +1 -1
- data/test/world_test.rb +1 -1
- data/test/y_petri_test.rb +1 -1
- metadata +13 -8
- data/lib/y_petri/net/state/features/dataset.rb +0 -135
- data/lib/y_petri/transition/construction.rb +0 -311
@@ -14,88 +14,132 @@ class YPetri::Simulation::Transitions
|
|
14
14
|
end
|
15
15
|
alias include_transition? includes_transition?
|
16
16
|
|
17
|
-
#
|
17
|
+
# Net's transition.
|
18
18
|
#
|
19
19
|
def t( id )
|
20
20
|
transitions( id ).source
|
21
21
|
end
|
22
22
|
|
23
|
-
#
|
23
|
+
# Net's transitions.
|
24
24
|
#
|
25
25
|
def tt( ids=nil )
|
26
26
|
transitions( ids ).sources
|
27
27
|
end
|
28
28
|
|
29
|
-
#
|
29
|
+
# Net's *ts* transitions.
|
30
30
|
#
|
31
31
|
def ts_tt( ids=nil )
|
32
32
|
ts_transitions( ids ).sources
|
33
33
|
end
|
34
34
|
|
35
|
-
#
|
35
|
+
# Net's *tS* transitions.
|
36
36
|
#
|
37
37
|
def tS_tt( ids=nil )
|
38
38
|
tS_transitions( ids ).sources
|
39
39
|
end
|
40
40
|
|
41
|
-
|
41
|
+
|
42
|
+
# Net's *Ts* transitions.
|
42
43
|
#
|
43
44
|
def Ts_tt( ids=nil )
|
44
45
|
Ts_transitions( ids ).sources
|
45
46
|
end
|
46
47
|
|
47
|
-
#
|
48
|
+
# Net's *TS* transitions.
|
48
49
|
#
|
49
50
|
def TS_tt( ids=nil )
|
50
51
|
TS_transitions( ids ).sources
|
51
52
|
end
|
52
53
|
|
53
|
-
#
|
54
|
+
# Net's *A* transitions.
|
55
|
+
#
|
56
|
+
def A_tt( ids=nil )
|
57
|
+
A_transitions( ids ).sources
|
58
|
+
end
|
59
|
+
|
60
|
+
# Net's *S* transitions.
|
61
|
+
#
|
62
|
+
def S_tt( ids=nil )
|
63
|
+
S_transitions( ids ).sources
|
64
|
+
end
|
65
|
+
|
66
|
+
# Net's *s* (non-stoichiometric) transitions.
|
67
|
+
#
|
68
|
+
def s_tt( ids=nil )
|
69
|
+
s_transitions( ids ).sources
|
70
|
+
end
|
71
|
+
|
72
|
+
# Net's *T* transitions.
|
73
|
+
#
|
74
|
+
def T_tt( ids=nil )
|
75
|
+
T_transitions( ids ).sources
|
76
|
+
end
|
77
|
+
|
78
|
+
# Net's *t* (timeless) transitions.
|
79
|
+
#
|
80
|
+
def t_tt ids=nil
|
81
|
+
return transitions.t if ids.nil?
|
82
|
+
transitions.t.subset( ids )
|
83
|
+
end
|
84
|
+
|
85
|
+
# Names of specified transitions.
|
54
86
|
#
|
55
87
|
def tn ids=nil
|
56
|
-
|
88
|
+
tt( ids ).names
|
57
89
|
end
|
58
90
|
|
59
|
-
# Names of *ts* transitions.
|
91
|
+
# Names of specified *ts* transitions.
|
60
92
|
#
|
61
93
|
def nts ids=nil
|
62
|
-
|
94
|
+
ts_tt( ids ).names( true )
|
63
95
|
end
|
64
96
|
|
65
|
-
# Names of *tS* transitions.
|
97
|
+
# Names of specified *tS* transitions.
|
66
98
|
#
|
67
99
|
def ntS ids=nil
|
68
|
-
|
100
|
+
tS_tt( ids ).names( true )
|
69
101
|
end
|
70
102
|
|
71
|
-
# Names of *Ts* transitions.
|
103
|
+
# Names of specified *Ts* transitions.
|
72
104
|
#
|
73
105
|
def nTs ids=nil
|
74
|
-
|
106
|
+
Ts_tt( ids ).names( true )
|
75
107
|
end
|
76
108
|
|
77
|
-
# Names of *TS* transitions.
|
109
|
+
# Names of specified *TS* transitions.
|
78
110
|
#
|
79
111
|
def nTS ids=nil
|
80
|
-
|
112
|
+
TS_tt( ids ).names( true )
|
81
113
|
end
|
82
114
|
|
83
|
-
# Names of *A* transitions.
|
115
|
+
# Names of specified *A* transitions.
|
84
116
|
#
|
85
117
|
def nA ids=nil
|
86
|
-
|
118
|
+
A_tt( ids ).names( true )
|
87
119
|
end
|
88
120
|
|
89
|
-
# Names of *S* transitions.
|
121
|
+
# Names of specified *S* transitions.
|
90
122
|
#
|
91
123
|
def nS ids=nil
|
92
|
-
|
124
|
+
S_tt( ids ).names( true )
|
93
125
|
end
|
94
126
|
|
95
|
-
# Names of *s* transitions.
|
127
|
+
# Names of specified *s* transitions.
|
96
128
|
#
|
97
129
|
def ns ids=nil
|
98
|
-
|
130
|
+
s_tt( ids ).names( true )
|
131
|
+
end
|
132
|
+
|
133
|
+
# Names of specified *T* transitions.
|
134
|
+
#
|
135
|
+
def nT ids=nil
|
136
|
+
T_tt( ids ).names( true )
|
137
|
+
end
|
138
|
+
|
139
|
+
# Names of specified *t* transitions.
|
140
|
+
#
|
141
|
+
def nt ids=nil
|
142
|
+
t_tt( ids ).names( true )
|
99
143
|
end
|
100
144
|
|
101
145
|
protected
|
@@ -132,7 +176,7 @@ class YPetri::Simulation::Transitions
|
|
132
176
|
#
|
133
177
|
def ts_transitions ids=nil
|
134
178
|
return transitions.ts if ids.nil?
|
135
|
-
transitions.ts.subset( ids )
|
179
|
+
transitions.ts.subset( transitions ids )
|
136
180
|
end
|
137
181
|
|
138
182
|
# Simulation's *tS* transitions. If arguments are given, they must identify
|
@@ -140,7 +184,7 @@ class YPetri::Simulation::Transitions
|
|
140
184
|
#
|
141
185
|
def tS_transitions ids=nil
|
142
186
|
return transitions.tS if ids.nil?
|
143
|
-
transitions.tS.subset( ids )
|
187
|
+
transitions.tS.subset( transitions ids )
|
144
188
|
end
|
145
189
|
|
146
190
|
# Simulation's *Ts* transitions. If arguments are given, they must identify
|
@@ -148,7 +192,7 @@ class YPetri::Simulation::Transitions
|
|
148
192
|
#
|
149
193
|
def Ts_transitions ids=nil
|
150
194
|
return transitions.Ts if ids.nil?
|
151
|
-
transitions.Ts.subset( ids )
|
195
|
+
transitions.Ts.subset( transitions ids )
|
152
196
|
end
|
153
197
|
|
154
198
|
# Simulation's *TS* transitions. If arguments are given, they must identify
|
@@ -156,7 +200,7 @@ class YPetri::Simulation::Transitions
|
|
156
200
|
#
|
157
201
|
def TS_transitions ids=nil
|
158
202
|
return transitions.TS if ids.nil?
|
159
|
-
transitions.TS.subset( ids )
|
203
|
+
transitions.TS.subset( transitions ids )
|
160
204
|
end
|
161
205
|
|
162
206
|
# Simulation's *A* transitions. If arguments are given, they must identify
|
@@ -164,7 +208,15 @@ class YPetri::Simulation::Transitions
|
|
164
208
|
#
|
165
209
|
def A_transitions ids=nil
|
166
210
|
return transitions.A if ids.nil?
|
167
|
-
transitions.A.subset( ids )
|
211
|
+
transitions.A.subset( transitions ids )
|
212
|
+
end
|
213
|
+
|
214
|
+
# Simulation's *a* transitions. If argument are given, they must identify
|
215
|
+
# *a* transitions, and are treated as in +#transitions+ method.
|
216
|
+
#
|
217
|
+
def a_transitions ids=nil
|
218
|
+
return transitions.a if ids.nil?
|
219
|
+
transitions.a.subset( transitions ids )
|
168
220
|
end
|
169
221
|
|
170
222
|
# Simulation's *S* transitions. If arguments are given, they must identify
|
@@ -172,7 +224,7 @@ class YPetri::Simulation::Transitions
|
|
172
224
|
#
|
173
225
|
def S_transitions ids=nil
|
174
226
|
return transitions.S if ids.nil?
|
175
|
-
transitions.S.subset( ids )
|
227
|
+
transitions.S.subset( transitions ids )
|
176
228
|
end
|
177
229
|
|
178
230
|
# Simulation's *s* transitions. If arguments are given, they must identify
|
@@ -180,7 +232,23 @@ class YPetri::Simulation::Transitions
|
|
180
232
|
#
|
181
233
|
def s_transitions ids=nil
|
182
234
|
return transitions.s if ids.nil?
|
183
|
-
transitions.s.subset( ids )
|
235
|
+
transitions.s.subset( transitions ids )
|
236
|
+
end
|
237
|
+
|
238
|
+
# Simulation's *T* transitions. If arguments are given, they must identify
|
239
|
+
# *T* transitions, and are treated as in +#transitions+ method.
|
240
|
+
#
|
241
|
+
def T_transitions ids=nil
|
242
|
+
return transitions.T if ids.nil?
|
243
|
+
transitions.T.subset( transitions ids )
|
244
|
+
end
|
245
|
+
|
246
|
+
# Simulation's *t* transitions. If arguments are given, they must identify
|
247
|
+
# *t* transitions, and are treated as in +#transitions+ method.
|
248
|
+
#
|
249
|
+
def t_transitions ids=nil
|
250
|
+
return transitions.t if ids.nil?
|
251
|
+
transitions.t.subset( transitions ids )
|
184
252
|
end
|
185
253
|
end # Access
|
186
254
|
end # class YPetri::Simulation::Transitions
|
data/lib/y_petri/simulation.rb
CHANGED
@@ -35,12 +35,12 @@ require_relative 'simulation/timed'
|
|
35
35
|
# to be specified. Both come as hashes:
|
36
36
|
#
|
37
37
|
class YPetri::Simulation
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
★ Places::Access # ★ means include
|
39
|
+
★ Transitions::Access
|
40
|
+
★ Elements::Access
|
41
|
+
★ InitialMarking::Access
|
42
|
+
★ MarkingClamps::Access
|
43
|
+
★ MarkingVector::Access
|
44
44
|
|
45
45
|
DEFAULT_SETTINGS = -> do { method: :pseudo_euler, guarded: false } end
|
46
46
|
|
@@ -94,6 +94,7 @@ class YPetri::Simulation
|
|
94
94
|
method = settings[:method] # the simulation method
|
95
95
|
@guarded = settings[:guarded] # guarding on / off
|
96
96
|
m_clamps = settings[:marking_clamps] || {}
|
97
|
+
m = settings[:marking]
|
97
98
|
init_m = settings[:initial_marking] || {}
|
98
99
|
use_default_marking = if settings.has? :use_default_marking then
|
99
100
|
settings[:use_default_marking]
|
@@ -150,7 +151,7 @@ class YPetri::Simulation
|
|
150
151
|
# Init the core.
|
151
152
|
@core = Core().new( method: method, guarded: guarded )
|
152
153
|
# Reset.
|
153
|
-
reset!
|
154
|
+
if m then reset! marking: m else reset! end
|
154
155
|
end
|
155
156
|
|
156
157
|
# Simulation settings.
|
@@ -194,9 +195,10 @@ class YPetri::Simulation
|
|
194
195
|
|
195
196
|
# Resets the simulation
|
196
197
|
#
|
197
|
-
def reset! **
|
198
|
+
def reset! **nn
|
199
|
+
m = nn[:marking]
|
198
200
|
tap do
|
199
|
-
m_vector.reset!
|
201
|
+
if m then m_vector.reset! m else m_vector.reset! end
|
200
202
|
recorder.reset!
|
201
203
|
recorder.alert
|
202
204
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# Mixin for the transitions with assignment action.
|
4
4
|
#
|
5
|
-
module YPetri::Transition::
|
5
|
+
module YPetri::Transition::Type_A
|
6
6
|
# Transition's action (before validation).
|
7
7
|
#
|
8
8
|
def action
|
@@ -36,4 +36,4 @@ module YPetri::Transition::Assignment
|
|
36
36
|
def enabled?
|
37
37
|
true
|
38
38
|
end
|
39
|
-
end # class YPetri::Transition::
|
39
|
+
end # class YPetri::Transition::Type_A
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# Mixin for timed Petri net transitions.
|
4
4
|
#
|
5
|
-
module YPetri::Transition::
|
5
|
+
module YPetri::Transition::Type_T
|
6
6
|
# Transition's action (before validation). Requires Δt as an argument.
|
7
7
|
#
|
8
8
|
def action Δt
|
@@ -47,4 +47,4 @@ module YPetri::Transition::Timed
|
|
47
47
|
rescue YPetri::GuardError; false end
|
48
48
|
end
|
49
49
|
end
|
50
|
-
end # class YPetri::Transition::
|
50
|
+
end # class YPetri::Transition::Type_T
|
@@ -1,8 +1,8 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
# Connectivity aspect of a transition.
|
4
4
|
#
|
5
|
-
|
5
|
+
module YPetri::Transition::Arcs
|
6
6
|
# Names of upstream places.
|
7
7
|
#
|
8
8
|
def domain_pp; domain.map { |p| p.name || p.object_id } end
|
@@ -48,4 +48,4 @@ class YPetri::Transition
|
|
48
48
|
downstream_places.each &:fire_downstream_recursively
|
49
49
|
return true
|
50
50
|
end
|
51
|
-
end #
|
51
|
+
end # module YPetri::Transition::Arcs
|
@@ -1,9 +1,9 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
|
3
3
|
# Cocking mechanics of a transition. A transition has to be cocked, before
|
4
4
|
# it can succesfuly +#fire+. (+#fire!+ method disregards cocking.)
|
5
5
|
#
|
6
|
-
|
6
|
+
module YPetri::Transition::Cocking
|
7
7
|
# Is the transition cocked?
|
8
8
|
#
|
9
9
|
def cocked?
|
@@ -29,4 +29,4 @@ class YPetri::Transition
|
|
29
29
|
@cocked = false
|
30
30
|
end
|
31
31
|
alias :uncock! :uncock
|
32
|
-
end # class YPetri::Transition
|
32
|
+
end # class YPetri::Transition::Cocking
|
@@ -1,58 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
3
|
+
# Given the four transition types (TS, Ts, tS, ts), transition construction
|
4
|
+
# is not an easy task. Actually, having convenient constructor syntax is an
|
5
|
+
# important part of the functionality of the Transition class. Construction
|
6
|
+
# related functionality is thus gathered together in this mixin.
|
5
7
|
#
|
6
|
-
|
7
|
-
# Transition class represents many different kinds of Petri net transitions.
|
8
|
-
# It makes the constructor syntax a bit more polymorphic. The type of the
|
9
|
-
# transition to construct is mostly inferred from the constructor arguments.
|
10
|
-
#
|
11
|
-
# Mandatorily, the constructor will always need a way to determine the domain
|
12
|
-
# (upstream arcs) and codomain (downstream arcs) of the transition. Also, the
|
13
|
-
# constructor must have a way to determine the transition's action. This is
|
14
|
-
# best explained by examples -- let us have 3 places A, B, C, for whe we will
|
15
|
-
# create different kinds of transitions:
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# ==== TS (timed stoichiometric)
|
19
|
-
#
|
20
|
-
# Rate closure and stoichiometry has to be supplied. Rate closure arity should
|
21
|
-
# correspond to the domain size. Return arity should be 1 (to be multiplied by
|
22
|
-
# the stoichiometry vector, as in all other stoichiometric transitions).
|
23
|
-
#
|
24
|
-
# Transition.new stoichiometry: { A: -1, B: 1 },
|
25
|
-
# rate: -> a { a * 0.5 }
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# ==== Ts (timed nonstoichiometric)
|
29
|
-
#
|
30
|
-
# Rate closure has to be supplied, whose arity should match the domain, and
|
31
|
-
# output arity codomain.
|
32
|
-
#
|
33
|
-
# ==== tS (timeless stoichiometric)
|
34
|
-
#
|
35
|
-
# Stoichiometry has to be supplied, action closure is optional. If supplied,
|
36
|
-
# its return arity should be 1 (to be multiplied by the stoichiometry vector).
|
37
|
-
#
|
38
|
-
# ==== ts transitions (timeless nonstoichiometric)
|
39
|
-
#
|
40
|
-
# Action closure is expected with return arity equal to the codomain size:
|
41
|
-
#
|
42
|
-
# Transition.new upstream_arcs: [A, C], downstream_arcs: [A, B],
|
43
|
-
# action_closure: proc { |m, x|
|
44
|
-
# if x > 0 then [-(m / 2), (m / 2)]
|
45
|
-
# else [1, 0] end
|
46
|
-
# }
|
47
|
-
#
|
48
|
-
def initialize *args, &block
|
49
|
-
check_in_arguments *args, &block # the big job
|
50
|
-
extend timed? ? Timed : ( assignment? ? Assignment : OrdinaryTimeless )
|
51
|
-
inform_upstream_places # that they have been connected
|
52
|
-
inform_downstream_places # that they have been connected
|
53
|
-
uncock # transitions initialize uncocked
|
54
|
-
end
|
55
|
-
|
8
|
+
module YPetri::Transition::ConstructionConvenience
|
56
9
|
private
|
57
10
|
|
58
11
|
# Checking in the arguments supplied to #initialize looks like a big job.
|
@@ -308,4 +261,4 @@ class YPetri::Transition
|
|
308
261
|
def inform_downstream_places
|
309
262
|
downstream_places.each { |p| p.send :register_upstream_transition, self }
|
310
263
|
end
|
311
|
-
end # class YPetri::Transition
|
264
|
+
end # class YPetri::Transition::ConstructionConvenience
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# Mixin for timed non-assignment timeless Petri net transitions.
|
4
4
|
#
|
5
|
-
module YPetri::Transition::
|
5
|
+
module YPetri::Transition::Type_t
|
6
6
|
# Result of the transition's "function", regardless of the #enabled? status.
|
7
7
|
#
|
8
8
|
def action
|
@@ -45,4 +45,4 @@ module YPetri::Transition::OrdinaryTimeless
|
|
45
45
|
rescue YPetri::GuardError; false end
|
46
46
|
end
|
47
47
|
end
|
48
|
-
end # class YPetri::Transition::
|
48
|
+
end # class YPetri::Transition::Type_t
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module YPetri::Transition::TypeInformation
|
4
|
+
# Is this a timed stoichiometric transition?
|
5
|
+
#
|
6
|
+
def TS?
|
7
|
+
type == :TS
|
8
|
+
end
|
9
|
+
|
10
|
+
# Is this a timed non-stoichiometric transition?
|
11
|
+
#
|
12
|
+
def Ts?
|
13
|
+
type == :Ts
|
14
|
+
end
|
15
|
+
|
16
|
+
# Is this a timeless stoichiometric transition?
|
17
|
+
#
|
18
|
+
def tS?
|
19
|
+
type == :tS
|
20
|
+
end
|
21
|
+
|
22
|
+
# Is this a timeless non-stoichiometric transition?
|
23
|
+
#
|
24
|
+
def ts?
|
25
|
+
type == :ts
|
26
|
+
end
|
27
|
+
|
28
|
+
# Is this a stoichiometric transition?
|
29
|
+
#
|
30
|
+
def stoichiometric?; @stoichiometric end
|
31
|
+
alias S? stoichiometric?
|
32
|
+
|
33
|
+
# Is this a non-stoichiometric transition?
|
34
|
+
#
|
35
|
+
def nonstoichiometric?
|
36
|
+
! stoichiometric?
|
37
|
+
end
|
38
|
+
alias s? nonstoichiometric?
|
39
|
+
|
40
|
+
# Does the transition's action depend on delta time?
|
41
|
+
#
|
42
|
+
def timed?
|
43
|
+
@timed
|
44
|
+
end
|
45
|
+
alias T? timed?
|
46
|
+
|
47
|
+
# Is the transition timeless? (Opposite of #timed?)
|
48
|
+
#
|
49
|
+
def timeless?
|
50
|
+
not timed?
|
51
|
+
end
|
52
|
+
alias t? timeless?
|
53
|
+
|
54
|
+
# Is the transition functional?
|
55
|
+
#
|
56
|
+
# Explanation: If rate or action closure is supplied, a transition is always
|
57
|
+
# considered 'functional'. Otherwise, it is considered not 'functional'.
|
58
|
+
# Note that even transitions that are not functional still have standard
|
59
|
+
# action acc. to Petri's definition. Also note that a timed transition is
|
60
|
+
# necessarily functional.
|
61
|
+
#
|
62
|
+
def functional?
|
63
|
+
@functional
|
64
|
+
end
|
65
|
+
|
66
|
+
# Opposite of #functional?
|
67
|
+
#
|
68
|
+
def functionless?
|
69
|
+
not functional?
|
70
|
+
end
|
71
|
+
|
72
|
+
# Reports the transition's membership in one of the 4 basic types:
|
73
|
+
#
|
74
|
+
# 1. TS .... timed stoichiometric
|
75
|
+
# 2. tS .... timeless stoichiometric
|
76
|
+
# 3. Ts .... timed nonstoichiometric
|
77
|
+
# 4. ts .... timeless nonstoichiometric
|
78
|
+
#
|
79
|
+
# plus the fifth type
|
80
|
+
#
|
81
|
+
# 5. A .... assignment transitions
|
82
|
+
#
|
83
|
+
def type
|
84
|
+
return :A if assignment_action?
|
85
|
+
timed? ? ( stoichiometric? ? :TS : :Ts ) : ( stoichiometric? ? :tS : :ts )
|
86
|
+
end
|
87
|
+
|
88
|
+
# Is this a transition with assignment action? (Transitions with assignment
|
89
|
+
# action, or "assignment transitions", completely replace the marking of their
|
90
|
+
# codomain with their action closure result, like in spreadsheets.)
|
91
|
+
#
|
92
|
+
def assignment_action?
|
93
|
+
@assignment_action
|
94
|
+
end
|
95
|
+
alias assignment? assignment_action?
|
96
|
+
alias A? assignment_action?
|
97
|
+
|
98
|
+
# Is this a non-assignment transition? (Opposite of +#A?+)
|
99
|
+
#
|
100
|
+
def a?
|
101
|
+
! assignment_action?
|
102
|
+
end
|
103
|
+
end # class YPetri::Transition::Type
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module YPetri::Transition::Types
|
4
|
+
# Is this a timed stoichiometric transition?
|
5
|
+
#
|
6
|
+
def TS?
|
7
|
+
type == :TS
|
8
|
+
end
|
9
|
+
|
10
|
+
# Is this a timed non-stoichiometric transition?
|
11
|
+
#
|
12
|
+
def Ts?
|
13
|
+
type == :Ts
|
14
|
+
end
|
15
|
+
|
16
|
+
# Is this a timeless stoichiometric transition?
|
17
|
+
#
|
18
|
+
def tS?
|
19
|
+
type == :tS
|
20
|
+
end
|
21
|
+
|
22
|
+
# Is this a timeless non-stoichiometric transition?
|
23
|
+
#
|
24
|
+
def ts?
|
25
|
+
type == :ts
|
26
|
+
end
|
27
|
+
|
28
|
+
# Is this a stoichiometric transition?
|
29
|
+
#
|
30
|
+
def stoichiometric?; @stoichiometric end
|
31
|
+
alias S? stoichiometric?
|
32
|
+
|
33
|
+
# Is this a non-stoichiometric transition?
|
34
|
+
#
|
35
|
+
def nonstoichiometric?
|
36
|
+
! stoichiometric?
|
37
|
+
end
|
38
|
+
alias s? nonstoichiometric?
|
39
|
+
|
40
|
+
# Does the transition's action depend on delta time?
|
41
|
+
#
|
42
|
+
def timed?
|
43
|
+
@timed
|
44
|
+
end
|
45
|
+
alias T? timed?
|
46
|
+
|
47
|
+
# Is the transition timeless? (Opposite of #timed?)
|
48
|
+
#
|
49
|
+
def timeless?
|
50
|
+
not timed?
|
51
|
+
end
|
52
|
+
alias t? timeless?
|
53
|
+
|
54
|
+
# Is the transition functional?
|
55
|
+
#
|
56
|
+
# Explanation: If rate or action closure is supplied, a transition is always
|
57
|
+
# considered 'functional'. Otherwise, it is considered not 'functional'.
|
58
|
+
# Note that even transitions that are not functional still have standard
|
59
|
+
# action acc. to Petri's definition. Also note that a timed transition is
|
60
|
+
# necessarily functional.
|
61
|
+
#
|
62
|
+
def functional?
|
63
|
+
@functional
|
64
|
+
end
|
65
|
+
|
66
|
+
# Opposite of #functional?
|
67
|
+
#
|
68
|
+
def functionless?
|
69
|
+
not functional?
|
70
|
+
end
|
71
|
+
|
72
|
+
# Reports the transition's membership in one of the 4 basic types:
|
73
|
+
#
|
74
|
+
# 1. TS .... timed stoichiometric
|
75
|
+
# 2. tS .... timeless stoichiometric
|
76
|
+
# 3. Ts .... timed nonstoichiometric
|
77
|
+
# 4. ts .... timeless nonstoichiometric
|
78
|
+
#
|
79
|
+
# plus the fifth type
|
80
|
+
#
|
81
|
+
# 5. A .... assignment transitions
|
82
|
+
#
|
83
|
+
def type
|
84
|
+
return :A if assignment_action?
|
85
|
+
timed? ? ( stoichiometric? ? :TS : :Ts ) : ( stoichiometric? ? :tS : :ts )
|
86
|
+
end
|
87
|
+
|
88
|
+
# Is this a transition with assignment action? (Transitions with assignment
|
89
|
+
# action, or "assignment transitions", completely replace the marking of their
|
90
|
+
# codomain with their action closure result, like in spreadsheets.)
|
91
|
+
#
|
92
|
+
def assignment_action?
|
93
|
+
@assignment_action
|
94
|
+
end
|
95
|
+
alias assignment? assignment_action?
|
96
|
+
alias A? assignment_action?
|
97
|
+
|
98
|
+
# Is this a non-assignment transition? (Opposite of +#A?+)
|
99
|
+
#
|
100
|
+
def a?
|
101
|
+
! assignment_action?
|
102
|
+
end
|
103
|
+
end # class YPetri::Transition::Type
|