y_petri 2.2.4 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +675 -0
- data/README.md +6 -3
- data/Rakefile +1 -1
- data/lib/y_petri/agent/{petri_net_related.rb → petri_net_aspect.rb} +34 -10
- data/lib/y_petri/agent/{simulation_related.rb → simulation_aspect.rb} +49 -34
- data/lib/y_petri/agent.rb +5 -5
- data/lib/y_petri/core/guarded.rb +24 -0
- data/lib/y_petri/core/timed/euler.rb +4 -8
- data/lib/y_petri/core/timed/gillespie.rb +11 -17
- data/lib/y_petri/core/timed/methods.rb +23 -0
- data/lib/y_petri/core/timed/pseudo_euler.rb +10 -13
- data/lib/y_petri/core/timed/quasi_euler.rb +9 -8
- data/lib/y_petri/core/timed/runge_kutta.rb +10 -18
- data/lib/y_petri/core/timed.rb +6 -14
- data/lib/y_petri/core/timeless/methods.rb +15 -0
- data/lib/y_petri/core/timeless/pseudo_euler.rb +4 -8
- data/lib/y_petri/core/timeless.rb +9 -4
- data/lib/y_petri/core.rb +44 -42
- data/lib/y_petri/net/data_set.rb +246 -142
- data/lib/y_petri/net/node_access.rb +282 -0
- data/lib/y_petri/net/own_state.rb +14 -4
- data/lib/y_petri/net/state/feature/assignment.rb +123 -0
- data/lib/y_petri/net/state/feature/delta.rb +55 -35
- data/lib/y_petri/net/state/feature/firing.rb +68 -25
- data/lib/y_petri/net/state/feature/flux.rb +9 -2
- data/lib/y_petri/net/state/feature/gradient.rb +36 -19
- data/lib/y_petri/net/state/feature/marking.rb +10 -5
- data/lib/y_petri/net/state/feature.rb +105 -11
- data/lib/y_petri/net/state/features/record.rb +144 -99
- data/lib/y_petri/net/state/features.rb +327 -200
- data/lib/y_petri/net/state.rb +48 -82
- data/lib/y_petri/net/visualization.rb +1 -1
- data/lib/y_petri/net.rb +62 -47
- data/lib/y_petri/place/arcs.rb +44 -0
- data/lib/y_petri/place/features.rb +115 -0
- data/lib/y_petri/place.rb +62 -29
- data/lib/y_petri/simulation/dependency.rb +31 -67
- data/lib/y_petri/simulation/feature_set.rb +1 -1
- data/lib/y_petri/simulation/initial_marking/access.rb +42 -26
- data/lib/y_petri/simulation/marking_clamps/access.rb +22 -17
- data/lib/y_petri/simulation/marking_clamps.rb +0 -2
- data/lib/y_petri/simulation/marking_vector/access.rb +102 -40
- data/lib/y_petri/simulation/marking_vector.rb +35 -37
- data/lib/y_petri/simulation/matrix.rb +1 -1
- data/lib/y_petri/simulation/node_representation.rb +25 -0
- data/lib/y_petri/simulation/nodes/access.rb +78 -0
- data/lib/y_petri/simulation/{elements.rb → nodes.rb} +14 -13
- data/lib/y_petri/simulation/place_mapping.rb +2 -2
- data/lib/y_petri/simulation/place_representation.rb +8 -7
- data/lib/y_petri/simulation/places/access.rb +89 -70
- data/lib/y_petri/simulation/places/free.rb +1 -1
- data/lib/y_petri/simulation/places/types.rb +20 -22
- data/lib/y_petri/simulation/places.rb +23 -18
- data/lib/y_petri/simulation/recorder.rb +23 -18
- data/lib/y_petri/simulation/timed/recorder.rb +19 -11
- data/lib/y_petri/simulation/timed.rb +93 -29
- data/lib/y_petri/simulation/timeless/recorder.rb +11 -6
- data/lib/y_petri/simulation/timeless.rb +13 -3
- data/lib/y_petri/simulation/transition_representation/A.rb +24 -4
- data/lib/y_petri/simulation/transition_representation/S.rb +11 -1
- data/lib/y_petri/simulation/transition_representation/T.rb +1 -1
- data/lib/y_petri/simulation/transition_representation/Ts.rb +1 -1
- data/lib/y_petri/simulation/transition_representation/a.rb +1 -1
- data/lib/y_petri/simulation/transition_representation/s.rb +12 -1
- data/lib/y_petri/simulation/transition_representation/t.rb +1 -1
- data/lib/y_petri/simulation/transition_representation/tS.rb +1 -1
- data/lib/y_petri/simulation/transition_representation/ts.rb +1 -1
- data/lib/y_petri/simulation/transition_representation/types.rb +1 -1
- data/lib/y_petri/simulation/transition_representation.rb +4 -11
- data/lib/y_petri/simulation/transitions/A.rb +17 -2
- data/lib/y_petri/simulation/transitions/S.rb +1 -1
- data/lib/y_petri/simulation/transitions/T.rb +1 -1
- data/lib/y_petri/simulation/transitions/Ts.rb +6 -5
- data/lib/y_petri/simulation/transitions/a.rb +1 -1
- data/lib/y_petri/simulation/transitions/access.rb +195 -168
- data/lib/y_petri/simulation/transitions/s.rb +1 -1
- data/lib/y_petri/simulation/transitions/t.rb +1 -1
- data/lib/y_petri/simulation/transitions/tS.rb +1 -1
- data/lib/y_petri/simulation/transitions/ts.rb +1 -1
- data/lib/y_petri/simulation/transitions/types.rb +1 -1
- data/lib/y_petri/simulation/transitions.rb +5 -7
- data/lib/y_petri/simulation.rb +84 -90
- data/lib/y_petri/transition/A.rb +8 -2
- data/lib/y_petri/transition/T.rb +25 -2
- data/lib/y_petri/transition/arcs.rb +19 -3
- data/lib/y_petri/transition/construction_convenience.rb +11 -10
- data/lib/y_petri/transition/t.rb +14 -1
- data/lib/y_petri/transition/types.rb +6 -1
- data/lib/y_petri/transition.rb +9 -12
- data/lib/y_petri/version.rb +1 -1
- data/lib/y_petri/world/dependency.rb +3 -3
- data/lib/y_petri/world/{petri_net_related.rb → petri_net_aspect.rb} +4 -4
- data/lib/y_petri/world/simulation_aspect.rb +352 -0
- data/lib/y_petri/world.rb +4 -4
- data/lib/y_petri.rb +1 -1
- data/test/agent_test.rb +2 -1
- data/test/examples/demonstrator.rb +4 -1
- data/test/examples/demonstrator_2.rb +5 -0
- data/test/examples/demonstrator_4.rb +6 -5
- data/test/examples/example_2.rb +2 -0
- data/test/examples/manual_examples.rb +4 -4
- data/test/net_test.rb +457 -54
- data/test/place_test.rb +11 -7
- data/test/simulation_test.rb +358 -331
- data/test/transition_test.rb +11 -10
- data/test/world_test.rb +2 -0
- data/test/y_petri_test.rb +2 -1
- data/y_petri.gemspec +24 -18
- metadata +71 -17
- data/LICENSE +0 -22
- data/lib/y_petri/net/element_access.rb +0 -239
- data/lib/y_petri/simulation/element_representation.rb +0 -20
- data/lib/y_petri/simulation/elements/access.rb +0 -57
- data/lib/y_petri/transition/type.rb +0 -103
- data/lib/y_petri/transition/type_information.rb +0 -103
- data/lib/y_petri/world/simulation_related.rb +0 -176
@@ -0,0 +1,352 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Workspace instance methods related to the Simulation aspect of YPetri
|
4
|
+
# (stored marking collections, clamp collections, inital marking collections,
|
5
|
+
# management of simulations...)
|
6
|
+
#
|
7
|
+
module YPetri::World::SimulationAspect
|
8
|
+
# Collections of clamps, initial marking vectors, and simulation settings.
|
9
|
+
#
|
10
|
+
attr_reader :clamp_collections,
|
11
|
+
:initial_marking_collections,
|
12
|
+
:simulation_settings_collections
|
13
|
+
|
14
|
+
# Instance initialization.
|
15
|
+
#
|
16
|
+
def initialize
|
17
|
+
@simulations = {} # { simulation => its settings }
|
18
|
+
@clamp_collections = { Base: {} } # { collection name => clamp hash }
|
19
|
+
@initial_marking_collections = { Base: {} } # { collection name => im hash }
|
20
|
+
@simulation_settings_collections = # { collection name => ss hash }
|
21
|
+
{ Base: ( YPetri::Simulation::DEFAULT_SETTINGS.call
|
22
|
+
.update YPetri::Simulation::Timed::DEFAULT_SETTINGS.call ) }
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
# Hash of simulation instances and their settings.
|
27
|
+
#
|
28
|
+
def simulations
|
29
|
+
@simulations
|
30
|
+
end
|
31
|
+
|
32
|
+
# Clamp collection names.
|
33
|
+
#
|
34
|
+
def clamp_collection_names
|
35
|
+
@clamp_collections.keys
|
36
|
+
end
|
37
|
+
alias ncc clamp_collection_names
|
38
|
+
|
39
|
+
# Initial marking collection names.
|
40
|
+
#
|
41
|
+
def initial_marking_collection_names
|
42
|
+
@initial_marking_collections.keys
|
43
|
+
end
|
44
|
+
alias nimc initial_marking_collection_names
|
45
|
+
|
46
|
+
# Simulation settings collection names.
|
47
|
+
#
|
48
|
+
def simulation_settings_collection_names
|
49
|
+
@simulation_settings_collections.keys
|
50
|
+
end
|
51
|
+
alias nssc simulation_settings_collection_names
|
52
|
+
|
53
|
+
# Clamp collection identified by the argument.
|
54
|
+
#
|
55
|
+
def clamp_collection name=:Base
|
56
|
+
@clamp_collections[name]
|
57
|
+
end
|
58
|
+
alias cc clamp_collection
|
59
|
+
|
60
|
+
# Marking collection identified by the argument.
|
61
|
+
#
|
62
|
+
def initial_marking_collection name=:Base
|
63
|
+
@initial_marking_collections[name]
|
64
|
+
end
|
65
|
+
alias imc initial_marking_collection
|
66
|
+
|
67
|
+
# Simulation settings collection specified by the argument.
|
68
|
+
#
|
69
|
+
def simulation_settings_collection name=:Base
|
70
|
+
@simulation_settings_collections[name]
|
71
|
+
end
|
72
|
+
alias ssc simulation_settings_collection
|
73
|
+
|
74
|
+
# Creates a new clamp collection. If collection identifier is not given,
|
75
|
+
# resets :Base clamp collection to new values.
|
76
|
+
#
|
77
|
+
def set_clamp_collection( name=:Base, clamp_hash )
|
78
|
+
@clamp_collections[name] = clamp_hash
|
79
|
+
end
|
80
|
+
alias set_cc set_clamp_collection
|
81
|
+
|
82
|
+
# Creates a new initial marking collection. If collection identifier is not
|
83
|
+
# given, resets :Base initial marking collection to new values.
|
84
|
+
#
|
85
|
+
def set_initial_marking_collection( name=:Base, initial_marking_hash )
|
86
|
+
@initial_marking_collections[name] = initial_marking_hash
|
87
|
+
end
|
88
|
+
alias set_imc set_initial_marking_collection
|
89
|
+
|
90
|
+
# Creates a new simulation settings collection. If collection identifier is
|
91
|
+
# not given, resets :Base simulation settings collection to new values.
|
92
|
+
#
|
93
|
+
def set_simulation_settings_collection( name=:Base, sim_set_hash )
|
94
|
+
@simulation_settings_collections[name] = sim_set_hash
|
95
|
+
end
|
96
|
+
alias set_ssc set_simulation_settings_collection
|
97
|
+
|
98
|
+
# Presents a simulation specified by the argument, which must be a hash with
|
99
|
+
# four items: :net, :clamp_collection, :inital_marking_collection and
|
100
|
+
# :simulation_settings_collection.
|
101
|
+
#
|
102
|
+
def simulation settings={}
|
103
|
+
key = case settings
|
104
|
+
when ~:may_have then # it is a hash or equivalent
|
105
|
+
settings.may_have :net
|
106
|
+
settings.may_have :cc, syn!: :clamp_collection
|
107
|
+
settings.may_have :imc, syn!: :initial_marking_collection
|
108
|
+
settings.may_have :ssc, syn!: :simulation_settings_collection
|
109
|
+
{ net: net( settings[:net] || self.Net::Top ), # the key
|
110
|
+
cc: settings[:cc] || :Base,
|
111
|
+
imc: settings[:imc] || :Base,
|
112
|
+
ssc: settings[:ssc] || :Base }
|
113
|
+
else # use the unprocessed argument itself as the key
|
114
|
+
settings
|
115
|
+
end
|
116
|
+
@simulations[ key ]
|
117
|
+
end
|
118
|
+
|
119
|
+
# Makes a new timed simulation. Named arguments for this method are the same
|
120
|
+
# as for TimedSimulation#new, but in addition, :name can be supplied.
|
121
|
+
#
|
122
|
+
# To create a simulation, simulation settings collection, initial marking
|
123
|
+
# collection, and clamp collection have to be specified. A <em>place clamp</em>,
|
124
|
+
# is a fixed value, at which the marking is held. Similarly, <em>initial
|
125
|
+
# marking</em> is the marking, which a free place receives at the beginning.
|
126
|
+
# Free places are those, that are not clamped. After initialization, marking
|
127
|
+
# of free places is allowed to change as the transition fire.
|
128
|
+
#
|
129
|
+
# For example, having places :P1..:P5, clamped :P1, :P2 can be written as eg.:
|
130
|
+
#
|
131
|
+
# * clamps = { P1: 4, P2: 5 }
|
132
|
+
#
|
133
|
+
# Places :P3, :P4, :P5 are <em>free</em>. Their initial marking has to be
|
134
|
+
# specified, which can be written as eg.:
|
135
|
+
#
|
136
|
+
# * initial_markings = { P3: 1, P4: 2, P5: 3 }
|
137
|
+
#
|
138
|
+
# As for simulation settings, their exact nature depends on the simulation
|
139
|
+
# method. For default Euler method, there are 3 important parameters:
|
140
|
+
# - <em>step_size</em>,
|
141
|
+
# - <em>sampling_period</em>,
|
142
|
+
# - <em>target_time</em>
|
143
|
+
#
|
144
|
+
# For example, default simulation settings are:
|
145
|
+
#
|
146
|
+
# * default_ss = { step_size: 0.1, sampling_period: 5, target_time: 60 }
|
147
|
+
#
|
148
|
+
def new_simulation( net: Net()::Top, **nn )
|
149
|
+
net_inst = net( net )
|
150
|
+
nn.may_have :cc, syn!: :clamp_collection
|
151
|
+
nn.may_have :imc, syn!: :initial_marking_collection
|
152
|
+
nn.may_have :ssc, syn!: :simulation_settings_collection
|
153
|
+
cc_id = nn.delete( :cc ) || :Base
|
154
|
+
imc_id = nn.delete( :imc ) || :Base
|
155
|
+
ssc_id = nn.delete( :ssc ) || :Base
|
156
|
+
# Construct the simulation key:
|
157
|
+
key = if nn.has? :name, syn!: :ɴ then # explicit key (name)
|
158
|
+
nn[:name]
|
159
|
+
else # constructed key
|
160
|
+
{}.merge( net: net_inst,
|
161
|
+
cc: cc_id,
|
162
|
+
imc: imc_id,
|
163
|
+
ssc: ssc_id )
|
164
|
+
.merge( nn )
|
165
|
+
end
|
166
|
+
# Let's clarify what we got so far.
|
167
|
+
sim_settings = ssc( ssc_id )
|
168
|
+
mc_hash = cc( cc_id )
|
169
|
+
im_hash = imc( imc_id )
|
170
|
+
# Create and return the simulation
|
171
|
+
sim = net_inst.simulation **sim_settings.merge( initial_marking: im_hash,
|
172
|
+
marking_clamps: mc_hash
|
173
|
+
).merge( nn )
|
174
|
+
@simulations[ key ] = sim
|
175
|
+
end
|
176
|
+
end # module YPetri::World::SimulationAspect
|
177
|
+
# encoding: utf-8
|
178
|
+
|
179
|
+
# Workspace instance methods related to the Simulation aspect of YPetri
|
180
|
+
# (stored marking collections, clamp collections, inital marking collections,
|
181
|
+
# management of simulations...)
|
182
|
+
#
|
183
|
+
module YPetri::World::SimulationAspect
|
184
|
+
# Collections of clamps, initial marking vectors, and simulation settings.
|
185
|
+
#
|
186
|
+
attr_reader :clamp_collections,
|
187
|
+
:initial_marking_collections,
|
188
|
+
:simulation_settings_collections
|
189
|
+
|
190
|
+
# Instance initialization.
|
191
|
+
#
|
192
|
+
def initialize
|
193
|
+
@simulations = {} # { simulation => its settings }
|
194
|
+
@clamp_collections = { Base: {} } # { collection name => clamp hash }
|
195
|
+
@initial_marking_collections = { Base: {} } # { collection name => im hash }
|
196
|
+
@simulation_settings_collections = # { collection name => ss hash }
|
197
|
+
{ Base: ( YPetri::Simulation::DEFAULT_SETTINGS.call
|
198
|
+
.update YPetri::Simulation::Timed::DEFAULT_SETTINGS.call ) }
|
199
|
+
super
|
200
|
+
end
|
201
|
+
|
202
|
+
# Hash of simulation instances and their settings.
|
203
|
+
#
|
204
|
+
def simulations
|
205
|
+
@simulations
|
206
|
+
end
|
207
|
+
|
208
|
+
# Clamp collection names.
|
209
|
+
#
|
210
|
+
def clamp_collection_names
|
211
|
+
@clamp_collections.keys
|
212
|
+
end
|
213
|
+
alias ncc clamp_collection_names
|
214
|
+
|
215
|
+
# Initial marking collection names.
|
216
|
+
#
|
217
|
+
def initial_marking_collection_names
|
218
|
+
@initial_marking_collections.keys
|
219
|
+
end
|
220
|
+
alias nimc initial_marking_collection_names
|
221
|
+
|
222
|
+
# Simulation settings collection names.
|
223
|
+
#
|
224
|
+
def simulation_settings_collection_names
|
225
|
+
@simulation_settings_collections.keys
|
226
|
+
end
|
227
|
+
alias nssc simulation_settings_collection_names
|
228
|
+
|
229
|
+
# Clamp collection identified by the argument.
|
230
|
+
#
|
231
|
+
def clamp_collection name=:Base
|
232
|
+
@clamp_collections[name]
|
233
|
+
end
|
234
|
+
alias cc clamp_collection
|
235
|
+
|
236
|
+
# Marking collection identified by the argument.
|
237
|
+
#
|
238
|
+
def initial_marking_collection name=:Base
|
239
|
+
@initial_marking_collections[name]
|
240
|
+
end
|
241
|
+
alias imc initial_marking_collection
|
242
|
+
|
243
|
+
# Simulation settings collection specified by the argument.
|
244
|
+
#
|
245
|
+
def simulation_settings_collection name=:Base
|
246
|
+
@simulation_settings_collections[name]
|
247
|
+
end
|
248
|
+
alias ssc simulation_settings_collection
|
249
|
+
|
250
|
+
# Creates a new clamp collection. If collection identifier is not given,
|
251
|
+
# resets :Base clamp collection to new values.
|
252
|
+
#
|
253
|
+
def set_clamp_collection( name=:Base, clamp_hash )
|
254
|
+
@clamp_collections[name] = clamp_hash
|
255
|
+
end
|
256
|
+
alias set_cc set_clamp_collection
|
257
|
+
|
258
|
+
# Creates a new initial marking collection. If collection identifier is not
|
259
|
+
# given, resets :Base initial marking collection to new values.
|
260
|
+
#
|
261
|
+
def set_initial_marking_collection( name=:Base, initial_marking_hash )
|
262
|
+
@initial_marking_collections[name] = initial_marking_hash
|
263
|
+
end
|
264
|
+
alias set_imc set_initial_marking_collection
|
265
|
+
|
266
|
+
# Creates a new simulation settings collection. If collection identifier is
|
267
|
+
# not given, resets :Base simulation settings collection to new values.
|
268
|
+
#
|
269
|
+
def set_simulation_settings_collection( name=:Base, sim_set_hash )
|
270
|
+
@simulation_settings_collections[name] = sim_set_hash
|
271
|
+
end
|
272
|
+
alias set_ssc set_simulation_settings_collection
|
273
|
+
|
274
|
+
# Presents a simulation specified by the argument, which must be a hash with
|
275
|
+
# four items: :net, :clamp_collection, :inital_marking_collection and
|
276
|
+
# :simulation_settings_collection.
|
277
|
+
#
|
278
|
+
def simulation settings={}
|
279
|
+
key = case settings
|
280
|
+
when ~:may_have then # it is a hash or equivalent
|
281
|
+
settings.may_have :net
|
282
|
+
settings.may_have :cc, syn!: :clamp_collection
|
283
|
+
settings.may_have :imc, syn!: :initial_marking_collection
|
284
|
+
settings.may_have :ssc, syn!: :simulation_settings_collection
|
285
|
+
{ net: net( settings[:net] || self.Net::Top ), # the key
|
286
|
+
cc: settings[:cc] || :Base,
|
287
|
+
imc: settings[:imc] || :Base,
|
288
|
+
ssc: settings[:ssc] || :Base }
|
289
|
+
else # use the unprocessed argument itself as the key
|
290
|
+
settings
|
291
|
+
end
|
292
|
+
@simulations[ key ]
|
293
|
+
end
|
294
|
+
|
295
|
+
# Makes a new timed simulation. Named arguments for this method are the same
|
296
|
+
# as for TimedSimulation#new, but in addition, :name can be supplied.
|
297
|
+
#
|
298
|
+
# To create a simulation, simulation settings collection, initial marking
|
299
|
+
# collection, and clamp collection have to be specified. A <em>place clamp</em>,
|
300
|
+
# is a fixed value, at which the marking is held. Similarly, <em>initial
|
301
|
+
# marking</em> is the marking, which a free place receives at the beginning.
|
302
|
+
# Free places are those, that are not clamped. After initialization, marking
|
303
|
+
# of free places is allowed to change as the transition fire.
|
304
|
+
#
|
305
|
+
# For example, having places :P1..:P5, clamped :P1, :P2 can be written as eg.:
|
306
|
+
#
|
307
|
+
# * clamps = { P1: 4, P2: 5 }
|
308
|
+
#
|
309
|
+
# Places :P3, :P4, :P5 are <em>free</em>. Their initial marking has to be
|
310
|
+
# specified, which can be written as eg.:
|
311
|
+
#
|
312
|
+
# * initial_markings = { P3: 1, P4: 2, P5: 3 }
|
313
|
+
#
|
314
|
+
# As for simulation settings, their exact nature depends on the simulation
|
315
|
+
# method. For default Euler method, there are 3 important parameters:
|
316
|
+
# - <em>step_size</em>,
|
317
|
+
# - <em>sampling_period</em>,
|
318
|
+
# - <em>target_time</em>
|
319
|
+
#
|
320
|
+
# For example, default simulation settings are:
|
321
|
+
#
|
322
|
+
# * default_ss = { step_size: 0.1, sampling_period: 5, target_time: 60 }
|
323
|
+
#
|
324
|
+
def new_simulation( net: Net()::Top, **nn )
|
325
|
+
net_inst = net( net )
|
326
|
+
nn.may_have :cc, syn!: :clamp_collection
|
327
|
+
nn.may_have :imc, syn!: :initial_marking_collection
|
328
|
+
nn.may_have :ssc, syn!: :simulation_settings_collection
|
329
|
+
cc_id = nn.delete( :cc ) || :Base
|
330
|
+
imc_id = nn.delete( :imc ) || :Base
|
331
|
+
ssc_id = nn.delete( :ssc ) || :Base
|
332
|
+
# Construct the simulation key:
|
333
|
+
key = if nn.has? :name, syn!: :ɴ then # explicit key (name)
|
334
|
+
nn[:name]
|
335
|
+
else # constructed key
|
336
|
+
{}.merge( net: net_inst,
|
337
|
+
cc: cc_id,
|
338
|
+
imc: imc_id,
|
339
|
+
ssc: ssc_id )
|
340
|
+
.merge( nn )
|
341
|
+
end
|
342
|
+
# Let's clarify what we got so far.
|
343
|
+
sim_settings = ssc( ssc_id )
|
344
|
+
mc_hash = cc( cc_id )
|
345
|
+
im_hash = imc( imc_id )
|
346
|
+
# Create and return the simulation
|
347
|
+
sim = net_inst.simulation **sim_settings.merge( initial_marking: im_hash,
|
348
|
+
marking_clamps: mc_hash
|
349
|
+
).merge( nn )
|
350
|
+
@simulations[ key ] = sim
|
351
|
+
end
|
352
|
+
end # module YPetri::World::SimulationAspect
|
data/lib/y_petri/world.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require_relative 'world/dependency'
|
4
|
-
require_relative 'world/
|
5
|
-
require_relative 'world/
|
4
|
+
require_relative 'world/petri_net_aspect'
|
5
|
+
require_relative 'world/simulation_aspect'
|
6
6
|
|
7
7
|
# As the name suggests, represents the world. Holds places, transitions, nets
|
8
8
|
# and other assets needed to set up and simulate Petri nets (settings, clamps,
|
@@ -11,8 +11,8 @@ require_relative 'world/simulation_related'
|
|
11
11
|
#
|
12
12
|
class YPetri::World
|
13
13
|
★ NameMagic # ★ means include
|
14
|
-
★
|
15
|
-
★
|
14
|
+
★ PetriNetAspect
|
15
|
+
★ SimulationAspect
|
16
16
|
|
17
17
|
def initialize
|
18
18
|
# Parametrize the Place / Transition / Net classes.
|
data/lib/y_petri.rb
CHANGED
@@ -35,7 +35,7 @@ require_relative 'y_petri/core'
|
|
35
35
|
require_relative 'y_petri/agent'
|
36
36
|
require_relative 'y_petri/dsl'
|
37
37
|
|
38
|
-
# YPetri represents Petri net (PN)
|
38
|
+
# YPetri represents Petri net (PN) formalisms.
|
39
39
|
#
|
40
40
|
# A PN consists of places and transitions. There are also arcs, "arrows"
|
41
41
|
# connecting places and transitions, but these are not considered first class
|
data/test/agent_test.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
|
3
|
+
# A working demonstration of the simulation functionality, but
|
4
|
+
# the resulting curve looks weird (too straight), look into it.
|
5
|
+
|
3
6
|
require 'y_petri'
|
4
7
|
include YPetri
|
5
8
|
|
@@ -161,4 +164,4 @@ Transition name: :TMPK_DeoxyTMP_DeoxyTDP,
|
|
161
164
|
|
162
165
|
# execution
|
163
166
|
run!
|
164
|
-
|
167
|
+
recording.plot
|
@@ -1,5 +1,10 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
|
3
|
+
# This file demonstrates execution with values of SY::Magnitude type
|
4
|
+
# (ie. values with assigned physical units). It works, but the execution
|
5
|
+
# is slow and the recording is not fully adapted to the use of physical
|
6
|
+
# units yet.
|
7
|
+
|
3
8
|
require 'y_petri'
|
4
9
|
include YPetri
|
5
10
|
require 'sy'
|
@@ -1,5 +1,7 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
|
3
|
+
# Unfinished demonstration of TTP pathway simulation, search for FIXME.
|
4
|
+
|
3
5
|
require 'y_petri'
|
4
6
|
include YPetri
|
5
7
|
require 'sy'
|
@@ -46,10 +48,11 @@ DeoxyUMP = Place m!: 2.70 # Traut1994pcp
|
|
46
48
|
DeoxyUDP = Place m!: 0.5 # Traut1994pcp
|
47
49
|
DeoxyUTP = Place m!: 0.7 # Traut1994pcp
|
48
50
|
|
49
|
-
|
51
|
+
Thymidine = Place m!: 0.5 # Traut1994pcp
|
50
52
|
DeoxyTMP = Place m!: 0.0 # in situ
|
51
53
|
DeoxyTDP = Place m!: 2.4 # Traut1994pcp
|
52
54
|
DeoxyTTP = Place m!: 17.0 # Traut1994pcp
|
55
|
+
DeoxyT23P = Place m!: 2.4 + 17.0
|
53
56
|
|
54
57
|
# === Empirical places (in arbitrary units)
|
55
58
|
|
@@ -75,19 +78,17 @@ TK1tetra = Place m!: 0 # TK1 in the tetramer form (phosphoryla
|
|
75
78
|
|
76
79
|
# Assignment transition keeping TK1_di level based on total TK1 monomer
|
77
80
|
Transition name: :TK1_di_ϝ,
|
78
|
-
assignment: true,
|
79
81
|
domain: TK1,
|
80
82
|
codomain: TK1di,
|
81
|
-
|
83
|
+
assignment: lambda { |monomer| # solution of a quadratic equation for dimer / tetramer balance
|
82
84
|
TK1_4mer_Kd / 4 * ( ( 1 + 4 / TK1_4mer_Kd * monomer ) ** 0.5 - 1 )
|
83
85
|
}
|
84
86
|
|
85
87
|
# Assignment transition keeping TK1_tetra level based on total TK1 tetramer
|
86
88
|
Transition name: :TK1_tetra_ϝ,
|
87
|
-
assignment: true,
|
88
89
|
domain: [ TK1, TK1di ],
|
89
90
|
codomain: TK1tetra,
|
90
|
-
|
91
|
+
assignment: lambda { |monomer, dimer| # based on equation monomer = dimer * 2 + tetramer * 4
|
91
92
|
monomer / 4 - dimer / 2
|
92
93
|
}
|
93
94
|
|
data/test/examples/example_2.rb
CHANGED
@@ -8,7 +8,8 @@ require 'mathn'
|
|
8
8
|
set_step 10
|
9
9
|
set_target_time 600
|
10
10
|
set_sampling 10
|
11
|
-
|
11
|
+
# Euler with timeless transitions firing after each step:
|
12
|
+
set_simulation_method :PseudoEuler
|
12
13
|
|
13
14
|
A = Place m!: 1
|
14
15
|
B = Place m!: 10
|
@@ -16,13 +17,12 @@ C = Place m!: 0
|
|
16
17
|
|
17
18
|
Transition name: :B_disappearing,
|
18
19
|
s: { B: -1 },
|
19
|
-
action:
|
20
|
+
action: -> m { m >= 1 ? 1 : 0 }
|
20
21
|
|
21
22
|
Transition name: :C_held_at_half_B,
|
22
|
-
assignment: true,
|
23
23
|
domain: :B,
|
24
24
|
codomain: :C,
|
25
|
-
|
25
|
+
assignment: -> x { x / 2 }
|
26
26
|
|
27
27
|
run!
|
28
28
|
plot_recording
|