y_petri 2.0.15 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/lib/y_petri/{manipulator → agent}/hash_key_pointer.rb +2 -2
  3. data/lib/y_petri/agent/petri_net_related.rb +115 -0
  4. data/lib/y_petri/{manipulator → agent}/selection.rb +2 -1
  5. data/lib/y_petri/{manipulator/simulation_related_methods.rb → agent/simulation_related.rb} +93 -110
  6. data/lib/y_petri/agent.rb +22 -0
  7. data/lib/y_petri/core/timed/euler.rb +20 -0
  8. data/lib/y_petri/core/timed/pseudo_euler.rb +31 -0
  9. data/lib/y_petri/core/timed/quasi_euler.rb +23 -0
  10. data/lib/y_petri/core/timed.rb +70 -0
  11. data/lib/y_petri/core/timeless/pseudo_euler.rb +20 -0
  12. data/lib/y_petri/core/timeless.rb +12 -0
  13. data/lib/y_petri/core.rb +100 -0
  14. data/lib/y_petri/dsl.rb +66 -0
  15. data/lib/y_petri/fixed_assets.rb +7 -0
  16. data/lib/y_petri/net/element_access.rb +239 -0
  17. data/lib/y_petri/net/state/feature/delta.rb +88 -0
  18. data/lib/y_petri/net/state/feature/firing.rb +57 -0
  19. data/lib/y_petri/net/state/feature/flux.rb +58 -0
  20. data/lib/y_petri/net/state/feature/gradient.rb +75 -0
  21. data/lib/y_petri/net/state/feature/marking.rb +62 -0
  22. data/lib/y_petri/net/state/feature.rb +79 -0
  23. data/lib/y_petri/net/state/features/dataset.rb +135 -0
  24. data/lib/y_petri/net/state/features/record.rb +50 -0
  25. data/lib/y_petri/net/state/features.rb +126 -0
  26. data/lib/y_petri/net/state.rb +121 -0
  27. data/lib/y_petri/net/timed.rb +8 -0
  28. data/lib/y_petri/net/visualization.rb +3 -3
  29. data/lib/y_petri/net.rb +73 -77
  30. data/lib/y_petri/place.rb +8 -3
  31. data/lib/y_petri/simulation/dependency.rb +107 -0
  32. data/lib/y_petri/simulation/element_representation.rb +20 -0
  33. data/lib/y_petri/simulation/elements/access.rb +57 -0
  34. data/lib/y_petri/simulation/elements.rb +45 -0
  35. data/lib/y_petri/simulation/feature_set.rb +21 -0
  36. data/lib/y_petri/simulation/initial_marking/access.rb +55 -0
  37. data/lib/y_petri/simulation/initial_marking.rb +15 -0
  38. data/lib/y_petri/simulation/marking_clamps/access.rb +34 -0
  39. data/lib/y_petri/simulation/marking_clamps.rb +18 -0
  40. data/lib/y_petri/simulation/marking_vector/access.rb +106 -0
  41. data/lib/y_petri/simulation/marking_vector.rb +156 -0
  42. data/lib/y_petri/simulation/matrix.rb +64 -0
  43. data/lib/y_petri/simulation/place_mapping.rb +62 -0
  44. data/lib/y_petri/simulation/place_representation.rb +74 -0
  45. data/lib/y_petri/simulation/places/access.rb +121 -0
  46. data/lib/y_petri/simulation/places/clamped.rb +8 -0
  47. data/lib/y_petri/simulation/places/free.rb +8 -0
  48. data/lib/y_petri/simulation/places/types.rb +25 -0
  49. data/lib/y_petri/simulation/places.rb +41 -0
  50. data/lib/y_petri/simulation/recorder.rb +54 -0
  51. data/lib/y_petri/simulation/timed/recorder.rb +53 -0
  52. data/lib/y_petri/simulation/timed.rb +161 -261
  53. data/lib/y_petri/simulation/timeless/recorder.rb +25 -0
  54. data/lib/y_petri/simulation/timeless.rb +35 -0
  55. data/lib/y_petri/simulation/transition_representation/A.rb +58 -0
  56. data/lib/y_petri/simulation/transition_representation/S.rb +45 -0
  57. data/lib/y_petri/simulation/transition_representation/T.rb +80 -0
  58. data/lib/y_petri/simulation/transition_representation/TS.rb +46 -0
  59. data/lib/y_petri/simulation/transition_representation/Ts.rb +32 -0
  60. data/lib/y_petri/simulation/transition_representation/a.rb +30 -0
  61. data/lib/y_petri/simulation/transition_representation/s.rb +29 -0
  62. data/lib/y_petri/simulation/transition_representation/t.rb +37 -0
  63. data/lib/y_petri/simulation/transition_representation/tS.rb +38 -0
  64. data/lib/y_petri/simulation/transition_representation/ts.rb +32 -0
  65. data/lib/y_petri/simulation/transition_representation/types.rb +62 -0
  66. data/lib/y_petri/simulation/transition_representation.rb +79 -0
  67. data/lib/y_petri/simulation/transitions/A.rb +40 -0
  68. data/lib/y_petri/simulation/transitions/S.rb +24 -0
  69. data/lib/y_petri/simulation/transitions/T.rb +34 -0
  70. data/lib/y_petri/simulation/transitions/TS.rb +57 -0
  71. data/lib/y_petri/simulation/transitions/Ts.rb +60 -0
  72. data/lib/y_petri/simulation/transitions/a.rb +8 -0
  73. data/lib/y_petri/simulation/transitions/access.rb +186 -0
  74. data/lib/y_petri/simulation/transitions/s.rb +9 -0
  75. data/lib/y_petri/simulation/transitions/t.rb +22 -0
  76. data/lib/y_petri/simulation/transitions/tS.rb +55 -0
  77. data/lib/y_petri/simulation/transitions/ts.rb +58 -0
  78. data/lib/y_petri/simulation/transitions/types.rb +98 -0
  79. data/lib/y_petri/simulation/transitions.rb +21 -0
  80. data/lib/y_petri/simulation.rb +176 -781
  81. data/lib/y_petri/transition/assignment.rb +7 -5
  82. data/lib/y_petri/transition/construction.rb +119 -187
  83. data/lib/y_petri/transition/init.rb +311 -0
  84. data/lib/y_petri/transition/ordinary_timeless.rb +8 -6
  85. data/lib/y_petri/transition/timed.rb +11 -18
  86. data/lib/y_petri/transition.rb +104 -132
  87. data/lib/y_petri/version.rb +1 -1
  88. data/lib/y_petri/world/dependency.rb +40 -0
  89. data/lib/y_petri/world/petri_net_related.rb +61 -0
  90. data/lib/y_petri/{workspace/simulation_related_methods.rb → world/simulation_related.rb} +42 -49
  91. data/lib/y_petri/world.rb +27 -0
  92. data/lib/y_petri.rb +47 -99
  93. data/test/{manipulator_test.rb → agent_test.rb} +19 -17
  94. data/{lib/y_petri → test/examples}/demonstrator.rb +0 -0
  95. data/{lib/y_petri → test/examples}/demonstrator_2.rb +1 -0
  96. data/{lib/y_petri → test/examples}/demonstrator_3.rb +0 -0
  97. data/{lib/y_petri → test/examples}/demonstrator_4.rb +0 -0
  98. data/test/examples/example_2.rb +16 -0
  99. data/test/{manual_examples.rb → examples/manual_examples.rb} +0 -0
  100. data/test/net_test.rb +126 -121
  101. data/test/place_test.rb +1 -1
  102. data/test/sim_test +565 -0
  103. data/test/simulation_test.rb +338 -264
  104. data/test/transition_test.rb +77 -174
  105. data/test/world_mock.rb +12 -0
  106. data/test/{workspace_test.rb → world_test.rb} +19 -20
  107. data/test/y_petri_test.rb +4 -5
  108. metadata +101 -26
  109. data/lib/y_petri/dependency_injection.rb +0 -45
  110. data/lib/y_petri/manipulator/petri_net_related_methods.rb +0 -74
  111. data/lib/y_petri/manipulator.rb +0 -20
  112. data/lib/y_petri/net/selections.rb +0 -209
  113. data/lib/y_petri/simulation/collections.rb +0 -460
  114. data/lib/y_petri/workspace/parametrized_subclassing.rb +0 -22
  115. data/lib/y_petri/workspace/petri_net_related_methods.rb +0 -88
  116. data/lib/y_petri/workspace.rb +0 -16
  117. data/test/timed_simulation_test.rb +0 -153
@@ -0,0 +1,60 @@
1
+ #encoding: utf-8
2
+
3
+ # A 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
+ # gradient closure accessor.
11
+ #
12
+ def gradient_closure
13
+ @gradient_closure ||= to_gradient_closure
14
+ end
15
+
16
+ # Member gradient closures.
17
+ #
18
+ def gradient_closures
19
+ map &:gradient_closure
20
+ end
21
+
22
+ # Gradient contribution for free places.
23
+ #
24
+ def gradient
25
+ gradient_closure.call
26
+ end
27
+
28
+ # Gradient contribution to all places.
29
+ #
30
+ def ∇
31
+ f2a * gradient
32
+ end
33
+ alias gradient_all ∇
34
+
35
+ # Constructs a gradient closure that outputs a gradient vector corresponding
36
+ # to free places. The vector is the gradient contribution of the transitions
37
+ # in this collection.
38
+ #
39
+ def to_gradient_closure
40
+ fp = free_places
41
+ closures = gradient_closures
42
+ sMV = simulation.MarkingVector
43
+ stu = simulation.time_unit
44
+
45
+ code_sections = map.with_index do |t, i|
46
+ "a = closures[ #{i} ].call\n" +
47
+ t.increment_by_codomain_code( vector: "g", source: "a" )
48
+ end
49
+ body = code_sections.join( "\n" )
50
+ λ = <<-LAMBDA
51
+ -> do
52
+ g = sMV.zero( fp ) / stu
53
+ #{body}
54
+ return g
55
+ end
56
+ LAMBDA
57
+ eval λ
58
+ end
59
+ end # module Type_Ts
60
+ end # class YPetri::Simulation::Transitions
@@ -0,0 +1,8 @@
1
+ #encoding: utf-8
2
+
3
+ # A mixin for collections of A transitions.
4
+ #
5
+ class YPetri::Simulation::Transitions
6
+ module Type_a
7
+ end # Type_a
8
+ end # class YPetri::Simulation::Transitions
@@ -0,0 +1,186 @@
1
+ #encoding: utf-8
2
+
3
+ # Simulation mixin providing access to transitions.
4
+ #
5
+ class YPetri::Simulation::Transitions
6
+ module Access
7
+ # Does a transition belong to the simulation?
8
+ #
9
+ def includes_transition?( id )
10
+ true.tap { begin; transition( id )
11
+ rescue NameError, TypeError
12
+ return false
13
+ end }
14
+ end
15
+ alias include_transition? includes_transition?
16
+
17
+ # Transition of the simulation (belonging to the net).
18
+ #
19
+ def t( id )
20
+ transitions( id ).source
21
+ end
22
+
23
+ # Transitions of the simulation (belonging to the net).
24
+ #
25
+ def tt( ids=nil )
26
+ transitions( ids ).sources
27
+ end
28
+
29
+ # Free places of the simulation (belonging to the net).
30
+ #
31
+ def ts_tt( ids=nil )
32
+ ts_transitions( ids ).sources
33
+ end
34
+
35
+ # Free places of the simulation (belonging to the net).
36
+ #
37
+ def tS_tt( ids=nil )
38
+ tS_transitions( ids ).sources
39
+ end
40
+
41
+ # Free places of the simulation (belonging to the net).
42
+ #
43
+ def Ts_tt( ids=nil )
44
+ Ts_transitions( ids ).sources
45
+ end
46
+
47
+ # Free places of the simulation (belonging to the net).
48
+ #
49
+ def TS_tt( ids=nil )
50
+ TS_transitions( ids ).sources
51
+ end
52
+
53
+ # Transitions' names. Arguments, if any, are treated as in +#tranistions+ method.
54
+ #
55
+ def tn ids=nil
56
+ transitions( ids ).names
57
+ end
58
+
59
+ # Names of *ts* transitions. Arguments are handled as with +#ts_transitions+.
60
+ #
61
+ def nts ids=nil
62
+ ts_transitions( ids ).names( true )
63
+ end
64
+
65
+ # Names of *tS* transitions. Arguments are handled as with +#tS_transitions+.
66
+ #
67
+ def ntS ids=nil
68
+ tS_transitions( ids ).names( true )
69
+ end
70
+
71
+ # Names of *Ts* transitions. Arguments are handled as with +#tS_transitions+.
72
+ #
73
+ def nTs ids=nil
74
+ Ts_transitions( ids ).names( true )
75
+ end
76
+
77
+ # Names of *TS* transitions. Arguments are handled as with +#TS_transitions+.
78
+ #
79
+ def nTS ids=nil
80
+ TS_transitions( ids ).names( true )
81
+ end
82
+
83
+ # Names of *A* transitions. Arguments are handled as with +#A_transitions+.
84
+ #
85
+ def nA ids=nil
86
+ A_transitions( ids ).names( true )
87
+ end
88
+
89
+ # Names of *S* transitions. Arguments are handled as with +#S_transitions+.
90
+ #
91
+ def nS ids=nil
92
+ S_transitions( ids ).names( true )
93
+ end
94
+
95
+ # Names of *s* transitions. Arguments are handled as with +#s_transitions+.
96
+ #
97
+ def ns ids=nil
98
+ s_transitions( ids ).names( true )
99
+ end
100
+
101
+ protected
102
+
103
+ # Transition instance identification.
104
+ #
105
+ def transition( id )
106
+ begin
107
+ Transition().instance( id )
108
+ rescue NameError, TypeError
109
+ begin
110
+ tr = net.transition( id )
111
+ Transition().instances.find { |t_rep| t_rep.source == tr } ||
112
+ Transition().instance( tr.name )
113
+ rescue NameError, TypeError => msg
114
+ raise TypeError, "The argument #{id} does not identify a " +
115
+ "transition instance! (#{msg})"
116
+ end
117
+ end
118
+ end
119
+
120
+ # Without arguments, returns all the transitions. If arguments are given,
121
+ # they are converted to transitions before being returned.
122
+ #
123
+ def transitions ids=nil
124
+ return @transitions if ids.nil?
125
+ Transitions().load( ids.map { |id| transition id } )
126
+ end
127
+
128
+ # Simulation's *ts* transtitions. If arguments are given, they must identify
129
+ # *ts* transitions, and are treated as in +#transitions+ method. Note that *A*
130
+ # transitions are not considered eligible *ts* tranisitions for the purposes
131
+ # of this method.
132
+ #
133
+ def ts_transitions ids=nil
134
+ return transitions.ts if ids.nil?
135
+ transitions.ts.subset( ids )
136
+ end
137
+
138
+ # Simulation's *tS* transitions. If arguments are given, they must identify
139
+ # *tS* transitions, and are treated as in +#transitions+ method.
140
+ #
141
+ def tS_transitions ids=nil
142
+ return transitions.tS if ids.nil?
143
+ transitions.tS.subset( ids )
144
+ end
145
+
146
+ # Simulation's *Ts* transitions. If arguments are given, they must identify
147
+ # *Ts* transitions, and are treated as in +#transitions+ method.
148
+ #
149
+ def Ts_transitions ids=nil
150
+ return transitions.Ts if ids.nil?
151
+ transitions.Ts.subset( ids )
152
+ end
153
+
154
+ # Simulation's *TS* transitions. If arguments are given, they must identify
155
+ # *TS* transitions, and are treated as in +#transitions+ method.
156
+ #
157
+ def TS_transitions ids=nil
158
+ return transitions.TS if ids.nil?
159
+ transitions.TS.subset( ids )
160
+ end
161
+
162
+ # Simulation's *A* transitions. If arguments are given, they must identify
163
+ # *A* transitions, and are treated as in +#transitions+ method.
164
+ #
165
+ def A_transitions ids=nil
166
+ return transitions.A if ids.nil?
167
+ transitions.A.subset( ids )
168
+ end
169
+
170
+ # Simulation's *S* transitions. If arguments are given, they must identify
171
+ # *S* transitions, and are treated as in +#transitions+ method.
172
+ #
173
+ def S_transitions ids=nil
174
+ return transitions.S if ids.nil?
175
+ transitions.S.subset( ids )
176
+ end
177
+
178
+ # Simulation's *s* transitions. If arguments are given, they must identify
179
+ # *s* transitions, and are treated as in +#transitions+ method.
180
+ #
181
+ def s_transitions ids=nil
182
+ return transitions.s if ids.nil?
183
+ transitions.s.subset( ids )
184
+ end
185
+ end # Access
186
+ end # class YPetri::Simulation::Transitions
@@ -0,0 +1,9 @@
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
+ end # module Type_s
9
+ end # class YPetri::Simulation::Transitions
@@ -0,0 +1,22 @@
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
+ # State change if the timeless transitions fire once.
10
+ #
11
+ def delta
12
+ ts.delta + tS.delta
13
+ end
14
+
15
+ # State change if the timeless transitions fire once.
16
+ #
17
+ def Δ
18
+ tS.Δ + ts.Δ
19
+ end
20
+ alias delta_all delta
21
+ end # module Type_T
22
+ end # class YPetri::Simulation::Transitions
@@ -0,0 +1,55 @@
1
+ #encoding: utf-8
2
+
3
+ # A 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
+ # firing closure accessor.
11
+ #
12
+ def firing_closure
13
+ @firing_closure ||= to_firing_closure
14
+ end
15
+
16
+ # tS transitions have firing closures.
17
+ #
18
+ def firing_closures
19
+ map &:firing_closure
20
+ end
21
+
22
+ # Firing vector (to be multiplied by the stoichiometry to get deltas)
23
+ #
24
+ def firing_vector
25
+ firing_closure.call
26
+ end
27
+
28
+ # Firing vector for these tS transitions, returned as array.
29
+ #
30
+ def firing
31
+ firing_closures.map &:call
32
+ end
33
+
34
+ # Delta contribution to free places.
35
+ #
36
+ def delta
37
+ stoichiometry_matrix * firing_vector
38
+ end
39
+
40
+ # Delta contribution to all places
41
+ #
42
+ def Δ
43
+ SM() * firing_vector
44
+ end
45
+ alias delta_all Δ
46
+
47
+ # Builds the firing vector closure, that outputs the firing vector based on
48
+ # the system state when called.
49
+ #
50
+ def to_firing_closure
51
+ closures = firing_closures
52
+ -> { closures.map( &:call ).to_column_vector }
53
+ end
54
+ end # module Type_tS
55
+ end # class YPetri::Simulation::Transitions
@@ -0,0 +1,58 @@
1
+ #encoding: utf-8
2
+
3
+ # A 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
+ # Delta closure accessor.
11
+ #
12
+ def delta_closure
13
+ @delta_closure ||= to_delta_closure
14
+ end
15
+
16
+ # ts transitions have action closures.
17
+ #
18
+ def delta_closures
19
+ map &:delta_closure
20
+ end
21
+
22
+ # Delta contribution to free places.
23
+ #
24
+ def delta
25
+ delta_closure.call
26
+ end
27
+
28
+ # Delta contribution to all places
29
+ #
30
+ def Δ
31
+ f2a * delta
32
+ end
33
+ alias delta_all Δ
34
+
35
+ # Constructs a delta closure that outputs a delta vector corresponding to
36
+ # free places. The vector is the delta contribution of the transitions in
37
+ # this collection.
38
+ #
39
+ def to_delta_closure
40
+ fp = free_places
41
+ closures = delta_closures
42
+ sMV = simulation.MarkingVector
43
+ code_sections = map.with_index do |t, i|
44
+ "a = closures[#{i}].call\n" +
45
+ t.increment_by_codomain_code( vector: "delta", source: "a" )
46
+ end
47
+ body = code_sections.join( "\n" )
48
+ λ = <<-LAMBDA
49
+ -> do
50
+ delta = sMV.zero( fp )
51
+ #{body}
52
+ return delta
53
+ end
54
+ LAMBDA
55
+ eval λ
56
+ end
57
+ end
58
+ end # class YPetri::Simulation::Transitions
@@ -0,0 +1,98 @@
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 type selectors.
15
+ #
16
+ class YPetri::Simulation::Transitions
17
+ module Types
18
+ # Subset of s type transitions, if any.
19
+ #
20
+ def s
21
+ ( @Type_s ||= Class.new( self.class ).tap do |klass|
22
+ klass.class_exec { include Type_s }
23
+ end ).load subset( &:s? )
24
+ end
25
+
26
+ # Subset of S type transitions, if any.
27
+ #
28
+ def S
29
+ ( @Type_S ||= Class.new( self.class ).tap do |klass|
30
+ klass.class_exec { include Type_S }
31
+ end ).load subset( &:S? )
32
+ end
33
+
34
+ # Subset of t type transitions, if any.
35
+ #
36
+ def t
37
+ ( @Type_t ||= Class.new( self.class ).tap do |klass|
38
+ klass.class_exec { include Type_t }
39
+ end ).load subset( &:t? )
40
+ end
41
+
42
+ # Subset of T type transitions, if any.
43
+ #
44
+ def T
45
+ ( @Type_T ||= Class.new( self.class ).tap do |klass|
46
+ klass.class_exec { include Type_T }
47
+ end ).load subset( &:T? )
48
+ end
49
+
50
+ # Subset of ts type transitions, if any.
51
+ #
52
+ def ts
53
+ ( @Type_ts ||= Class.new( self.class ).tap do |klass|
54
+ klass.class_exec { include Type_ts }
55
+ end ).load subset( &:ts? )
56
+ end
57
+
58
+ # Subset of tS type transitions, if any.
59
+ #
60
+ def tS
61
+ ( @Type_tS ||= Class.new( self.class ).tap do |klass|
62
+ klass.class_exec { include Type_tS }
63
+ end ).load subset( &:tS? )
64
+ end
65
+
66
+ # Subset of Ts type transitions, if any.
67
+ #
68
+ def Ts
69
+ ( @Type_Ts ||= Class.new( self.class ).tap do |klass|
70
+ klass.class_exec { include Type_Ts }
71
+ end ).load subset( &:Ts? )
72
+ end
73
+
74
+ # Subset of TS type transitions, if any.
75
+ #
76
+ def TS
77
+ ( @Type_TS ||= Class.new( self.class ).tap do |klass|
78
+ klass.class_exec { include Type_TS }
79
+ end ).load subset( &:TS? )
80
+ end
81
+
82
+ # Subset of A type transitions, if any.
83
+ #
84
+ def A
85
+ ( @Type_A ||= Class.new( self.class ).tap do |klass|
86
+ klass.class_exec { include Type_A }
87
+ end ).load subset( &:A? )
88
+ end
89
+
90
+ # Subset of a type transitions, if any.
91
+ #
92
+ def a
93
+ ( @Type_a ||= Class.new( self.class ).tap do |klass|
94
+ klass.class_exec { include Type_a }
95
+ end ).load subset( &:a? )
96
+ end
97
+ end # Types
98
+ end # class YPetri::Simulation::Transitions
@@ -0,0 +1,21 @@
1
+ #encoding: utf-8
2
+
3
+ # Transition collection for YPetri::Simulation.
4
+ #
5
+ class YPetri::Simulation
6
+ class Transitions < Elements
7
+ require_relative 'transitions/types'
8
+ include Types
9
+
10
+ # Pushes a transition to the collection.
11
+ #
12
+ def push transition
13
+ t = begin
14
+ net.transition( transition )
15
+ rescue NameError, TypeError
16
+ return super transition( transition )
17
+ end
18
+ super t.name ? Transition().new( t, name: t.name ) : Transition().new( t )
19
+ end
20
+ end # class Transitions
21
+ end # class YPetri::Simulation::Transitions