y_petri 2.0.15 → 2.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/y_petri/{manipulator → agent}/hash_key_pointer.rb +2 -2
- data/lib/y_petri/agent/petri_net_related.rb +115 -0
- data/lib/y_petri/{manipulator → agent}/selection.rb +2 -1
- data/lib/y_petri/{manipulator/simulation_related_methods.rb → agent/simulation_related.rb} +93 -110
- data/lib/y_petri/agent.rb +22 -0
- data/lib/y_petri/core/timed/euler.rb +20 -0
- data/lib/y_petri/core/timed/pseudo_euler.rb +31 -0
- data/lib/y_petri/core/timed/quasi_euler.rb +23 -0
- data/lib/y_petri/core/timed.rb +70 -0
- data/lib/y_petri/core/timeless/pseudo_euler.rb +20 -0
- data/lib/y_petri/core/timeless.rb +12 -0
- data/lib/y_petri/core.rb +100 -0
- data/lib/y_petri/dsl.rb +66 -0
- data/lib/y_petri/fixed_assets.rb +7 -0
- data/lib/y_petri/net/element_access.rb +239 -0
- data/lib/y_petri/net/state/feature/delta.rb +88 -0
- data/lib/y_petri/net/state/feature/firing.rb +57 -0
- data/lib/y_petri/net/state/feature/flux.rb +58 -0
- data/lib/y_petri/net/state/feature/gradient.rb +75 -0
- data/lib/y_petri/net/state/feature/marking.rb +62 -0
- data/lib/y_petri/net/state/feature.rb +79 -0
- data/lib/y_petri/net/state/features/dataset.rb +135 -0
- data/lib/y_petri/net/state/features/record.rb +50 -0
- data/lib/y_petri/net/state/features.rb +126 -0
- data/lib/y_petri/net/state.rb +121 -0
- data/lib/y_petri/net/timed.rb +8 -0
- data/lib/y_petri/net/visualization.rb +3 -3
- data/lib/y_petri/net.rb +73 -77
- data/lib/y_petri/place.rb +8 -3
- data/lib/y_petri/simulation/dependency.rb +107 -0
- data/lib/y_petri/simulation/element_representation.rb +20 -0
- data/lib/y_petri/simulation/elements/access.rb +57 -0
- data/lib/y_petri/simulation/elements.rb +45 -0
- data/lib/y_petri/simulation/feature_set.rb +21 -0
- data/lib/y_petri/simulation/initial_marking/access.rb +55 -0
- data/lib/y_petri/simulation/initial_marking.rb +15 -0
- data/lib/y_petri/simulation/marking_clamps/access.rb +34 -0
- data/lib/y_petri/simulation/marking_clamps.rb +18 -0
- data/lib/y_petri/simulation/marking_vector/access.rb +106 -0
- data/lib/y_petri/simulation/marking_vector.rb +156 -0
- data/lib/y_petri/simulation/matrix.rb +64 -0
- data/lib/y_petri/simulation/place_mapping.rb +62 -0
- data/lib/y_petri/simulation/place_representation.rb +74 -0
- data/lib/y_petri/simulation/places/access.rb +121 -0
- data/lib/y_petri/simulation/places/clamped.rb +8 -0
- data/lib/y_petri/simulation/places/free.rb +8 -0
- data/lib/y_petri/simulation/places/types.rb +25 -0
- data/lib/y_petri/simulation/places.rb +41 -0
- data/lib/y_petri/simulation/recorder.rb +54 -0
- data/lib/y_petri/simulation/timed/recorder.rb +53 -0
- data/lib/y_petri/simulation/timed.rb +161 -261
- data/lib/y_petri/simulation/timeless/recorder.rb +25 -0
- data/lib/y_petri/simulation/timeless.rb +35 -0
- data/lib/y_petri/simulation/transition_representation/A.rb +58 -0
- data/lib/y_petri/simulation/transition_representation/S.rb +45 -0
- data/lib/y_petri/simulation/transition_representation/T.rb +80 -0
- data/lib/y_petri/simulation/transition_representation/TS.rb +46 -0
- data/lib/y_petri/simulation/transition_representation/Ts.rb +32 -0
- data/lib/y_petri/simulation/transition_representation/a.rb +30 -0
- data/lib/y_petri/simulation/transition_representation/s.rb +29 -0
- data/lib/y_petri/simulation/transition_representation/t.rb +37 -0
- data/lib/y_petri/simulation/transition_representation/tS.rb +38 -0
- data/lib/y_petri/simulation/transition_representation/ts.rb +32 -0
- data/lib/y_petri/simulation/transition_representation/types.rb +62 -0
- data/lib/y_petri/simulation/transition_representation.rb +79 -0
- data/lib/y_petri/simulation/transitions/A.rb +40 -0
- data/lib/y_petri/simulation/transitions/S.rb +24 -0
- data/lib/y_petri/simulation/transitions/T.rb +34 -0
- data/lib/y_petri/simulation/transitions/TS.rb +57 -0
- data/lib/y_petri/simulation/transitions/Ts.rb +60 -0
- data/lib/y_petri/simulation/transitions/a.rb +8 -0
- data/lib/y_petri/simulation/transitions/access.rb +186 -0
- data/lib/y_petri/simulation/transitions/s.rb +9 -0
- data/lib/y_petri/simulation/transitions/t.rb +22 -0
- data/lib/y_petri/simulation/transitions/tS.rb +55 -0
- data/lib/y_petri/simulation/transitions/ts.rb +58 -0
- data/lib/y_petri/simulation/transitions/types.rb +98 -0
- data/lib/y_petri/simulation/transitions.rb +21 -0
- data/lib/y_petri/simulation.rb +176 -781
- data/lib/y_petri/transition/assignment.rb +7 -5
- data/lib/y_petri/transition/construction.rb +119 -187
- data/lib/y_petri/transition/init.rb +311 -0
- data/lib/y_petri/transition/ordinary_timeless.rb +8 -6
- data/lib/y_petri/transition/timed.rb +11 -18
- data/lib/y_petri/transition.rb +104 -132
- data/lib/y_petri/version.rb +1 -1
- data/lib/y_petri/world/dependency.rb +40 -0
- data/lib/y_petri/world/petri_net_related.rb +61 -0
- data/lib/y_petri/{workspace/simulation_related_methods.rb → world/simulation_related.rb} +42 -49
- data/lib/y_petri/world.rb +27 -0
- data/lib/y_petri.rb +47 -99
- data/test/{manipulator_test.rb → agent_test.rb} +19 -17
- data/{lib/y_petri → test/examples}/demonstrator.rb +0 -0
- data/{lib/y_petri → test/examples}/demonstrator_2.rb +1 -0
- data/{lib/y_petri → test/examples}/demonstrator_3.rb +0 -0
- data/{lib/y_petri → test/examples}/demonstrator_4.rb +0 -0
- data/test/examples/example_2.rb +16 -0
- data/test/{manual_examples.rb → examples/manual_examples.rb} +0 -0
- data/test/net_test.rb +126 -121
- data/test/place_test.rb +1 -1
- data/test/sim_test +565 -0
- data/test/simulation_test.rb +338 -264
- data/test/transition_test.rb +77 -174
- data/test/world_mock.rb +12 -0
- data/test/{workspace_test.rb → world_test.rb} +19 -20
- data/test/y_petri_test.rb +4 -5
- metadata +101 -26
- data/lib/y_petri/dependency_injection.rb +0 -45
- data/lib/y_petri/manipulator/petri_net_related_methods.rb +0 -74
- data/lib/y_petri/manipulator.rb +0 -20
- data/lib/y_petri/net/selections.rb +0 -209
- data/lib/y_petri/simulation/collections.rb +0 -460
- data/lib/y_petri/workspace/parametrized_subclassing.rb +0 -22
- data/lib/y_petri/workspace/petri_net_related_methods.rb +0 -88
- data/lib/y_petri/workspace.rb +0 -16
- data/test/timed_simulation_test.rb +0 -153
@@ -0,0 +1,45 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for S transition representations.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::TransitionRepresentation
|
6
|
+
module Type_S
|
7
|
+
include Type_a
|
8
|
+
|
9
|
+
attr_reader :stoichiometry
|
10
|
+
|
11
|
+
# Sparse stoichiometry vector corresponding to the free places.
|
12
|
+
#
|
13
|
+
attr_reader :sparse_stoichiometry_vector
|
14
|
+
|
15
|
+
# Sparse stoichiometry vector corresponding to all the places.
|
16
|
+
#
|
17
|
+
attr_reader :sparse_sv
|
18
|
+
|
19
|
+
# True for stoichiometric transitions.
|
20
|
+
#
|
21
|
+
def S?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
alias stoichiometric? S?
|
25
|
+
|
26
|
+
# False for stoichiometric transitions.
|
27
|
+
#
|
28
|
+
def s?
|
29
|
+
false
|
30
|
+
end
|
31
|
+
alias nonstoichiometric? s?
|
32
|
+
|
33
|
+
# Initialization subroutine.
|
34
|
+
#
|
35
|
+
def init
|
36
|
+
super
|
37
|
+
@stoichiometry = source.stoichiometry
|
38
|
+
@sparse_stoichiometry_vector =
|
39
|
+
Matrix.correspondence_matrix( codomain, free_places ) *
|
40
|
+
stoichiometry.to_column_vector
|
41
|
+
@sparse_sv = Matrix.correspondence_matrix( codomain, places ) *
|
42
|
+
stoichiometry.to_column_vector
|
43
|
+
end
|
44
|
+
end # module Type_S
|
45
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,80 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for timed transition representations.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::TransitionRepresentation
|
6
|
+
module Type_T
|
7
|
+
include Type_a
|
8
|
+
|
9
|
+
# True for timed transitions.
|
10
|
+
#
|
11
|
+
def T?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
alias timed? T?
|
15
|
+
|
16
|
+
# False for timed transitions.
|
17
|
+
#
|
18
|
+
def t?
|
19
|
+
false
|
20
|
+
end
|
21
|
+
alias timeless? t?
|
22
|
+
|
23
|
+
# Initialization subroutine.
|
24
|
+
#
|
25
|
+
def init
|
26
|
+
simulation.extend YPetri::Simulation::Timed unless simulation.timed?
|
27
|
+
super
|
28
|
+
@function = source.rate_closure
|
29
|
+
end
|
30
|
+
|
31
|
+
# Gradient contribution of the transition to the free places.
|
32
|
+
#
|
33
|
+
def gradient
|
34
|
+
∇.select { |p, v| p.free? }
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns the gradient contribution to the free places, as hash
|
38
|
+
# place names >> gradient contribution.
|
39
|
+
#
|
40
|
+
def g
|
41
|
+
gradient.with_keys do |p| p.name || p end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns the gradient contribution to all the places, as hash
|
45
|
+
# place names >> gradient contribution.
|
46
|
+
#
|
47
|
+
def g_all
|
48
|
+
∇.with_keys do |p| p.name || p end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Change, for free places, as it would happen if the transition fired for
|
52
|
+
# time Δt, returned as hash codomain places >> change.
|
53
|
+
#
|
54
|
+
def delta Δt
|
55
|
+
gradient.with_values { |v| v * Δt }
|
56
|
+
end
|
57
|
+
|
58
|
+
# Change, for free places, as it would happen if the transition fired for
|
59
|
+
# time Δt, returned as hash codomain place names >> change.
|
60
|
+
#
|
61
|
+
def d Δt
|
62
|
+
delta( Δt ).with_keys do |p| p.name || p end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Change, for all places, as it would happen if the transition fired for
|
66
|
+
# time Δt, returned as hash codomain places >> change.
|
67
|
+
#
|
68
|
+
def Δ( Δt )
|
69
|
+
gradient.with_values { |v| v * Δt }
|
70
|
+
end
|
71
|
+
alias delta_all Δ
|
72
|
+
|
73
|
+
# Change, for all places, as it would happen if the transition fired for
|
74
|
+
# time Δt, returned as hash codomain place names >> change.
|
75
|
+
#
|
76
|
+
def d_all( Δt )
|
77
|
+
delta( Δt ).with_keys do |p| p.name || p end
|
78
|
+
end
|
79
|
+
end # Type_T
|
80
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for TS transition representations.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::TransitionRepresentation
|
6
|
+
module Type_TS
|
7
|
+
include Type_T
|
8
|
+
include Type_S
|
9
|
+
|
10
|
+
attr_reader :rate_closure
|
11
|
+
|
12
|
+
# Initialization subroutine.
|
13
|
+
#
|
14
|
+
def init
|
15
|
+
super
|
16
|
+
@rate_closure = to_rate_closure
|
17
|
+
end
|
18
|
+
|
19
|
+
# Transition's rate, given the current system state.
|
20
|
+
#
|
21
|
+
def rate
|
22
|
+
rate_closure.call
|
23
|
+
end
|
24
|
+
alias flux rate
|
25
|
+
alias propensity rate
|
26
|
+
|
27
|
+
# Firing of the transition (rate * Δtime).
|
28
|
+
#
|
29
|
+
def firing Δt
|
30
|
+
rate * Δt
|
31
|
+
end
|
32
|
+
|
33
|
+
# Gradient contribution of the transition to all places.
|
34
|
+
#
|
35
|
+
def ∇
|
36
|
+
codomain >> stoichiometry.map { |coeff| rate * coeff }
|
37
|
+
end
|
38
|
+
alias gradient_all ∇
|
39
|
+
|
40
|
+
# Builds a flux closure.
|
41
|
+
#
|
42
|
+
def to_rate_closure
|
43
|
+
build_closure
|
44
|
+
end
|
45
|
+
end # module Type_TS
|
46
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for Ts transition representations.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::TransitionRepresentation
|
6
|
+
module Type_Ts
|
7
|
+
include Type_T
|
8
|
+
include Type_s
|
9
|
+
|
10
|
+
attr_reader :gradient_closure
|
11
|
+
|
12
|
+
# Initialization subroutine.
|
13
|
+
#
|
14
|
+
def init
|
15
|
+
super
|
16
|
+
@gradient_closure = to_gradient_closure
|
17
|
+
end
|
18
|
+
|
19
|
+
# Gradient contribution of the transition to all places.
|
20
|
+
#
|
21
|
+
def ∇
|
22
|
+
codomain >> gradient_closure.call
|
23
|
+
end
|
24
|
+
alias gradient_all ∇
|
25
|
+
|
26
|
+
# Builds a gradient closure.
|
27
|
+
#
|
28
|
+
def to_gradient_closure
|
29
|
+
build_closure
|
30
|
+
end
|
31
|
+
end # Type_Ts
|
32
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for non-assignment transition representations.
|
4
|
+
#
|
5
|
+
module YPetri::Simulation::TransitionRepresentation::Type_a
|
6
|
+
# Assignment action -- false for non-assignment transitions.
|
7
|
+
#
|
8
|
+
def A?
|
9
|
+
false
|
10
|
+
end
|
11
|
+
alias assignment_action? A?
|
12
|
+
alias assignment? A?
|
13
|
+
|
14
|
+
# Normal (non-assignment) action -- true for A transitions
|
15
|
+
#
|
16
|
+
def a?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
# Initialization subroutine.
|
21
|
+
#
|
22
|
+
def init
|
23
|
+
end
|
24
|
+
|
25
|
+
# Change, for free places, as it would happen if the transition fired.
|
26
|
+
#
|
27
|
+
def delta
|
28
|
+
Δ.select { |p, v| p.free? }
|
29
|
+
end
|
30
|
+
end # class YPetri::Simulation::TransitionRepresentation::Type_a
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for s (nonstoichiometric) transition representations.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::TransitionRepresentation
|
6
|
+
module Type_s
|
7
|
+
include Type_a
|
8
|
+
|
9
|
+
# False for non-stoichiometric transitions.
|
10
|
+
#
|
11
|
+
def S?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
alias stoichiometric? S?
|
15
|
+
|
16
|
+
# True for stoichiometric transitions.
|
17
|
+
#
|
18
|
+
def s?
|
19
|
+
true
|
20
|
+
end
|
21
|
+
alias nonstoichiometric? s?
|
22
|
+
|
23
|
+
# Initialization subroutine.
|
24
|
+
#
|
25
|
+
def init
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end # module Type_s
|
29
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for timed transition representations.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::TransitionRepresentation
|
6
|
+
module Type_t
|
7
|
+
include Type_a
|
8
|
+
|
9
|
+
# False for timed transitions.
|
10
|
+
#
|
11
|
+
def T?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
alias timed? T?
|
15
|
+
|
16
|
+
# True for timed transitions.
|
17
|
+
#
|
18
|
+
def t?
|
19
|
+
true
|
20
|
+
end
|
21
|
+
alias timeless? t?
|
22
|
+
|
23
|
+
# Initialization subroutine.
|
24
|
+
#
|
25
|
+
def init
|
26
|
+
super
|
27
|
+
@function = source.action_closure
|
28
|
+
end
|
29
|
+
|
30
|
+
# Change, as it would happen if the transition fired, returned as hash
|
31
|
+
# codomain places >> change.
|
32
|
+
#
|
33
|
+
def d
|
34
|
+
delta.with_keys do |p| p.name || p end
|
35
|
+
end
|
36
|
+
end # Type_t
|
37
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for tS transition representations.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::TransitionRepresentation
|
6
|
+
module Type_tS
|
7
|
+
include Type_t
|
8
|
+
include Type_S
|
9
|
+
|
10
|
+
attr_reader :firing_closure
|
11
|
+
|
12
|
+
# Initialization subroutine.
|
13
|
+
#
|
14
|
+
def init
|
15
|
+
super
|
16
|
+
@firing_closure = to_firing_closure
|
17
|
+
end
|
18
|
+
|
19
|
+
# Transition's firing, given the current system state.
|
20
|
+
#
|
21
|
+
def firing
|
22
|
+
firing_closure.call
|
23
|
+
end
|
24
|
+
|
25
|
+
# Change, to all places, as it would happen if the transition fired.
|
26
|
+
#
|
27
|
+
def Δ
|
28
|
+
codomain >> stoichiometry.map { |coeff| firing * coeff }
|
29
|
+
end
|
30
|
+
alias delta_all Δ
|
31
|
+
|
32
|
+
# Builds a firing closure.
|
33
|
+
#
|
34
|
+
def to_firing_closure
|
35
|
+
build_closure
|
36
|
+
end
|
37
|
+
end # module Type_tS
|
38
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for ts transition representations.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::TransitionRepresentation
|
6
|
+
module Type_ts
|
7
|
+
include Type_t
|
8
|
+
include Type_s
|
9
|
+
|
10
|
+
attr_reader :delta_closure
|
11
|
+
|
12
|
+
# Initialization subroutine.
|
13
|
+
#
|
14
|
+
def init
|
15
|
+
super
|
16
|
+
@delta_closure = to_delta_closure
|
17
|
+
end
|
18
|
+
|
19
|
+
# Delta state closure.
|
20
|
+
#
|
21
|
+
def to_delta_closure
|
22
|
+
build_closure
|
23
|
+
end
|
24
|
+
|
25
|
+
# Change, to all places, as it would happen if the transition fired.
|
26
|
+
#
|
27
|
+
def Δ
|
28
|
+
codomain >> delta_closure.call
|
29
|
+
end
|
30
|
+
alias delta_all Δ
|
31
|
+
end # module Type_ts
|
32
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'a'
|
4
|
+
require_relative 'A'
|
5
|
+
require_relative 't'
|
6
|
+
require_relative 'T'
|
7
|
+
require_relative 's'
|
8
|
+
require_relative 'S'
|
9
|
+
require_relative 'ts'
|
10
|
+
require_relative 'Ts'
|
11
|
+
require_relative 'tS'
|
12
|
+
require_relative 'TS'
|
13
|
+
|
14
|
+
# A mixin with transition types.
|
15
|
+
#
|
16
|
+
class YPetri::Simulation::TransitionRepresentation
|
17
|
+
module Types
|
18
|
+
attr_reader :type
|
19
|
+
|
20
|
+
def type_init *args
|
21
|
+
extend case source.type
|
22
|
+
when :A then Type_A
|
23
|
+
when :TS then Type_TS
|
24
|
+
when :Ts then Type_Ts
|
25
|
+
when :tS then Type_tS
|
26
|
+
when :ts then Type_ts
|
27
|
+
else fail TypeError, "Unknown tr. type #{source.type}!" end
|
28
|
+
init
|
29
|
+
end
|
30
|
+
|
31
|
+
# The transition's type.
|
32
|
+
#
|
33
|
+
def type
|
34
|
+
return :A if A?
|
35
|
+
if T? then S? ? :TS : :Ts else S? ? :tS : :ts end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Is this a TS transition?
|
39
|
+
#
|
40
|
+
def TS?
|
41
|
+
type == :TS
|
42
|
+
end
|
43
|
+
|
44
|
+
# Is this a Ts transition?
|
45
|
+
#
|
46
|
+
def Ts?
|
47
|
+
type == :Ts
|
48
|
+
end
|
49
|
+
|
50
|
+
# Is this a tS transition?
|
51
|
+
#
|
52
|
+
def tS?
|
53
|
+
type == :tS
|
54
|
+
end
|
55
|
+
|
56
|
+
# Is this a ts transition?
|
57
|
+
#
|
58
|
+
def ts?
|
59
|
+
type == :ts
|
60
|
+
end
|
61
|
+
end # module Types
|
62
|
+
end # class YPetri::Simulation::TransitionRepresentation
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# Representation of a YPetri::Transition inside a YPetri::Simulation instance.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation
|
6
|
+
class TransitionRepresentation < ElementRepresentation
|
7
|
+
require_relative 'transition_representation/types'
|
8
|
+
include Types
|
9
|
+
|
10
|
+
attr_reader :domain, :codomain
|
11
|
+
attr_reader :function # source transition function
|
12
|
+
|
13
|
+
# Expect a single YPetri place as an argument.
|
14
|
+
#
|
15
|
+
def initialize net_transition
|
16
|
+
super
|
17
|
+
@domain, @codomain = places( source.domain ), places( source.codomain )
|
18
|
+
type_init
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns the indices of this transition's domain in the marking vector.
|
22
|
+
#
|
23
|
+
def domain_indices
|
24
|
+
domain.map { |p| places.index p }
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the indices of this transition's codomain in the marking vector.
|
28
|
+
#
|
29
|
+
def codomain_indices
|
30
|
+
codomain.map { |p| places.index p }
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns the indices of this transition's domain among the free places.
|
34
|
+
#
|
35
|
+
def free_domain_indices
|
36
|
+
domain.map { |p| free_places.index p }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns the indices of this transition's codomain among the free places.
|
40
|
+
#
|
41
|
+
def free_codomain_indices
|
42
|
+
codomain.map { |p| free_places.index p }
|
43
|
+
end
|
44
|
+
|
45
|
+
# Builds the transition's function into a closure.
|
46
|
+
#
|
47
|
+
def build_closure
|
48
|
+
mv, f = simulation.m_vector, function
|
49
|
+
λ = "-> { f.( %s ) }" % domain_access_code( vector: :mv )
|
50
|
+
eval λ
|
51
|
+
end
|
52
|
+
|
53
|
+
# Builds a code string for accessing the domain directly from a marking
|
54
|
+
# vector, given as argument.
|
55
|
+
#
|
56
|
+
def domain_access_code( vector: :m_vector )
|
57
|
+
Matrix.column_vector_access_code( vector: vector,
|
58
|
+
indices: domain_indices )
|
59
|
+
end
|
60
|
+
|
61
|
+
# Builds a code string that assigns to the free places of the codomain.
|
62
|
+
#
|
63
|
+
def codomain_assignment_code vector: (fail ArgumentError, "No vector!"),
|
64
|
+
source: (fail ArgumentError, "No source array!")
|
65
|
+
Matrix.column_vector_assignment_code( vector: vector,
|
66
|
+
indices: free_codomain_indices,
|
67
|
+
source: source )
|
68
|
+
end
|
69
|
+
|
70
|
+
# Builds a closure that increments a vector with this transition's codomain.
|
71
|
+
#
|
72
|
+
def increment_by_codomain_code vector: (fail ArgumentError, "No vector!"),
|
73
|
+
source: (fail ArgumentError, "No source array!")
|
74
|
+
Matrix.column_vector_increment_by_array_code vector: vector,
|
75
|
+
indices: free_codomain_indices,
|
76
|
+
source: source
|
77
|
+
end
|
78
|
+
end # class TransitionRepresentation
|
79
|
+
end # class YPetri::Simulation
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for collections of A transitions.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::Transitions
|
6
|
+
module Type_A
|
7
|
+
attr_reader :assignment_closure
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@assignment_closure = to_assignment_closure
|
11
|
+
end
|
12
|
+
|
13
|
+
# Assignment closures that directly affect the marking when called.
|
14
|
+
#
|
15
|
+
def assignment_closures
|
16
|
+
map &:assignment_closure
|
17
|
+
end
|
18
|
+
|
19
|
+
# Combined assignment action, as it would occur if these A transitions fired
|
20
|
+
# in order, as hash place >> action.
|
21
|
+
#
|
22
|
+
def action
|
23
|
+
each_with_object Hash.new do |t, hsh| hsh.update( t.action ) end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns the assignments to all places, as they would happen if A transition
|
27
|
+
# could change their values.
|
28
|
+
#
|
29
|
+
def act
|
30
|
+
each_with_object Hash.new do |t, hsh| hsh.update( t.act ) end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Builds a joint assignment closure.
|
34
|
+
#
|
35
|
+
def to_assignment_closure
|
36
|
+
closures = assignment_closures
|
37
|
+
-> { closures.each &:call }
|
38
|
+
end
|
39
|
+
end # Type_A
|
40
|
+
end # class YPetri::Simulation::Transitions
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for collections of S transitions.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::Transitions
|
6
|
+
module Type_S
|
7
|
+
include Type_a
|
8
|
+
|
9
|
+
# Returns the collection's stoichiometry matrix versus free places.
|
10
|
+
#
|
11
|
+
def stoichiometry_matrix
|
12
|
+
map( &:sparse_stoichiometry_vector )
|
13
|
+
.reduce( Matrix.empty( places.free.size, 0 ), :join_right )
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the collection's stoichiometry matrix versus all places.
|
17
|
+
#
|
18
|
+
def SM
|
19
|
+
map( &:sparse_sv )
|
20
|
+
.reduce( Matrix.empty( places.size, 0 ), :join_right )
|
21
|
+
end
|
22
|
+
alias stoichiometry_matrix_all SM
|
23
|
+
end # module Type_S
|
24
|
+
end # class YPetri::Simulation::Transitions
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# A mixin for collections of T transitions.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::Transitions
|
6
|
+
module Type_T
|
7
|
+
include Type_a
|
8
|
+
|
9
|
+
# T transitions have gradient closures.
|
10
|
+
#
|
11
|
+
def gradient_closures
|
12
|
+
map &:gradient_closure
|
13
|
+
end
|
14
|
+
|
15
|
+
# Gradient by the T transitions.
|
16
|
+
#
|
17
|
+
def gradient
|
18
|
+
Ts().gradient + TS().gradient
|
19
|
+
end
|
20
|
+
|
21
|
+
# State change of free places if the timed transitions fire for given time.
|
22
|
+
#
|
23
|
+
def delta Δt
|
24
|
+
gradient * Δt
|
25
|
+
end
|
26
|
+
|
27
|
+
# State change of all places if the timed transitions fire for given time.
|
28
|
+
#
|
29
|
+
def Δ Δt
|
30
|
+
∇ * Δt
|
31
|
+
end
|
32
|
+
alias delta_all Δ
|
33
|
+
end # module Type_T
|
34
|
+
end # class YPetri::Simulation::Transitions
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
# Mixin for collections of TS transitions.
|
4
|
+
#
|
5
|
+
class YPetri::Simulation::Transitions
|
6
|
+
module Type_TS
|
7
|
+
include Type_T
|
8
|
+
include Type_S
|
9
|
+
|
10
|
+
# Rate vector closure accessor.
|
11
|
+
#
|
12
|
+
def rate_closure
|
13
|
+
@rate_closure ||= to_rate_closure
|
14
|
+
end
|
15
|
+
|
16
|
+
# Rate (flux, propensity) closures.
|
17
|
+
#
|
18
|
+
def rate_closures
|
19
|
+
map &:rate_closure
|
20
|
+
end
|
21
|
+
|
22
|
+
# Rate (flux/propensity) vector.
|
23
|
+
#
|
24
|
+
def rate_vector
|
25
|
+
to_rate_closure.call
|
26
|
+
end
|
27
|
+
alias flux_vector rate_vector
|
28
|
+
alias propensity_vector rate_vector
|
29
|
+
|
30
|
+
# Firing vector (rate vector * Δtime).
|
31
|
+
#
|
32
|
+
def firing_vector Δt
|
33
|
+
rate_vector * Δt
|
34
|
+
end
|
35
|
+
|
36
|
+
# Gradient contribution to free places.
|
37
|
+
#
|
38
|
+
def gradient
|
39
|
+
stoichiometry_matrix * rate_vector
|
40
|
+
end
|
41
|
+
|
42
|
+
# Gradient contribution to all places.
|
43
|
+
#
|
44
|
+
def ∇
|
45
|
+
SM() * rate_vector
|
46
|
+
end
|
47
|
+
alias gradient_all ∇
|
48
|
+
|
49
|
+
# Builds the rate vector closure, that outputs the rate vector based on
|
50
|
+
# the system state when called.
|
51
|
+
#
|
52
|
+
def to_rate_closure
|
53
|
+
rc = rate_closures
|
54
|
+
-> { rc.map( &:call ).to_column_vector }
|
55
|
+
end
|
56
|
+
end # module Type_TS
|
57
|
+
end # class YPetri::Simulation::Transitions
|