y_petri 2.2.4 → 2.3.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -41,7 +41,7 @@ class YPetri::Net::State::Features::Record < Array
|
|
41
41
|
super begin
|
42
42
|
Integer( feature )
|
43
43
|
rescue TypeError
|
44
|
-
feat = State
|
44
|
+
feat = net.State.Feature( feature )
|
45
45
|
features.index( feat )
|
46
46
|
end
|
47
47
|
end
|
@@ -56,13 +56,17 @@ class YPetri::Net::State::Features::Record < Array
|
|
56
56
|
when ~:call then v.call
|
57
57
|
else v end
|
58
58
|
end
|
59
|
-
|
60
|
-
|
61
|
-
fail TypeError,
|
62
|
-
|
63
|
-
|
64
|
-
|
59
|
+
own = features.marking.map &:place
|
60
|
+
from_clamps = net.Places cc.keys
|
61
|
+
fail TypeError, "Marking clamps supplied in the argument together with " +
|
62
|
+
"this record's markings must complete the full state of the net!" unless
|
63
|
+
net.places - own - from_clamps == []
|
64
|
+
array = net.places.map do |place|
|
65
|
+
begin; cc.fetch place; rescue IndexError
|
66
|
+
fetch place
|
67
|
+
end
|
65
68
|
end
|
69
|
+
State().new array
|
66
70
|
end
|
67
71
|
|
68
72
|
# Given a set of marking clamps complementary to the marking features of this
|
@@ -71,108 +75,149 @@ class YPetri::Net::State::Features::Record < Array
|
|
71
75
|
# has need for any special settings, these must be supplied to this method.
|
72
76
|
# (Timed nets eg. require +:time+ named argument for successful construction.)
|
73
77
|
#
|
74
|
-
def reconstruct **settings
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
78
|
+
def reconstruct marking_clamps: {}, **settings
|
79
|
+
clamped_places = net.Places( marking_clamps.keys )
|
80
|
+
ff = features.marking - net.State.Features.Marking( clamped_places )
|
81
|
+
m_hsh =
|
82
|
+
ff.map { |f| f.place } >>
|
83
|
+
marking
|
79
84
|
net.simulation marking_clamps: marking_clamps, marking: m_hsh, **settings
|
80
85
|
end
|
81
86
|
|
82
|
-
# Expects a
|
83
|
-
#
|
84
|
-
#
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
return marking( features.marking ) if arg.nil?
|
90
|
-
case arg
|
91
|
-
when Array then arg.map { |id| marking id }
|
92
|
-
else fetch( features.marking arg ) end
|
93
|
-
end
|
94
|
-
|
95
|
-
# Expects a flux feature identifier (transition identifier or Flux instance),
|
96
|
-
# and returns the value for that feature in this record. If an array of flux
|
97
|
-
# feature identifiers is supplied, it is mapped to the array of corresponding
|
98
|
-
# values. If no argument is given, values from this record for all the present
|
99
|
-
# flux features are returned.
|
100
|
-
#
|
101
|
-
def flux id=nil
|
102
|
-
return flux( features.flux ) if id.nil?
|
103
|
-
case id
|
104
|
-
when Array then id.map { |id| flux net.transition( id ) }
|
105
|
-
else fetch( features.flux id ) end
|
106
|
-
end
|
107
|
-
|
108
|
-
# Expects a firing feature identifier (transition identifier or Firing
|
109
|
-
# instance), and returns the value for that feature in this record. If an
|
110
|
-
# array of firing feature identifiers is supplied, it is mapped to the array
|
111
|
-
# of corresponding values. If no argument is given, values from this record
|
112
|
-
# for all the present flux features are returned.
|
113
|
-
#
|
114
|
-
def firing id=nil
|
115
|
-
return firing( features.firing ) if id.nil?
|
116
|
-
case id
|
117
|
-
when Array then id.map { |id| firing net.transition( id ) }
|
118
|
-
else fetch( features.firing id ) end
|
119
|
-
end
|
120
|
-
|
121
|
-
# Expects a gradient feature identifier (place identifier, or Gradient
|
122
|
-
# instance), qualified by an array of transitions (named argument
|
123
|
-
# +:transitions+, defaults to all timed transitions in the net), and returns
|
124
|
-
# the value for that feature in this record. If an array of gradient feature
|
125
|
-
# identifiers is supplied, it is mapped to the array of corresponding values.
|
126
|
-
# If no gradient feature identifier is given, values from this record for all
|
127
|
-
# the present gradient features are returned.
|
128
|
-
#
|
129
|
-
def gradient id=nil, transitions: nil
|
130
|
-
if id.nil? then
|
131
|
-
return gradient( features.gradient ) if transitions.nil?
|
132
|
-
gradient( features.gradient.select do |f|
|
133
|
-
f.transitions == transitions.map { |t| net.transition t }
|
134
|
-
end )
|
135
|
-
else
|
136
|
-
return gradient( id, transitions: net.T_tt ) if transitions.nil?
|
137
|
-
case id
|
138
|
-
when Array then
|
139
|
-
pl.map { |id| gradient id, transitions: transitions }
|
140
|
-
else
|
141
|
-
fetch( features.gradient id, transitions: transitions )
|
142
|
-
end
|
143
|
-
end
|
87
|
+
# Expects a single array of marking feture identifiers, and selects the
|
88
|
+
# corresponding values from the reciever record.
|
89
|
+
#
|
90
|
+
def Marking array
|
91
|
+
array.map { |id| fetch( net.State.Feature.Marking id ) }
|
92
|
+
# possible TODO - maybe a new feature instance and reloading the record
|
93
|
+
# through it woud be in place. Not doing now.
|
144
94
|
end
|
145
95
|
|
146
|
-
# Expects
|
147
|
-
#
|
148
|
-
#
|
149
|
-
#
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
96
|
+
# Expects an arbitrary number of marking feature identifiers and returns
|
97
|
+
# the corresponding values from the reciever record. If no arguments are
|
98
|
+
# given, values for all the marking features are returned.
|
99
|
+
#
|
100
|
+
def marking *marking_features
|
101
|
+
return Marking( features.marking ) if marking_features.empty?
|
102
|
+
Marking( marking_features )
|
103
|
+
end
|
104
|
+
|
105
|
+
# Expects a single aarray of flux feature identifiers, and selects the
|
106
|
+
# corresponding values from the reciever record.
|
107
|
+
#
|
108
|
+
def Flux array
|
109
|
+
array.map { |id| fetch( net.State.Feature.Flux id ) }
|
110
|
+
end
|
111
|
+
|
112
|
+
# Expects an arbitrary number of flux feature identifiers and returns the
|
113
|
+
# corresponding values from the reciever record. If no arguments are given,
|
114
|
+
# values for all the flux features are returned.
|
115
|
+
#
|
116
|
+
def flux *flux_features
|
117
|
+
return Flux( features.flux ) if flux_features.empty?
|
118
|
+
Flux( flux_features )
|
119
|
+
end
|
120
|
+
|
121
|
+
# Expects a single aarray of firing feature identifiers, and selects the
|
122
|
+
# corresponding values from the reciever record.
|
123
|
+
#
|
124
|
+
def Firing array
|
125
|
+
array.map { |id| fetch( net.State.Feature.Firing id ) }
|
126
|
+
end
|
127
|
+
|
128
|
+
# Expects an arbitrary number of firing feature identifiers and returns the
|
129
|
+
# corresponding values from the reciever record. If no arguments are given,
|
130
|
+
# values for all the firing features are returned.
|
131
|
+
#
|
132
|
+
def firing *firing_features
|
133
|
+
return Firing( features.firing ) if firing_features.empty?
|
134
|
+
Firing( firing_features )
|
135
|
+
end
|
136
|
+
|
137
|
+
# Expects a single array of gradient feature identifiers, optionally qualified
|
138
|
+
# by the +:transitions+ named argument, defaulting to all T transitions in the
|
139
|
+
# net.
|
140
|
+
#
|
141
|
+
def Gradient array, transitions: nil
|
142
|
+
array.map { |id|
|
143
|
+
fetch( net.State.Feature.Gradient id, transitions: transitions )
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
# Expects an arbitrary number of gradient feature identifiers, optionally
|
148
|
+
# qualified by the +:transitions+ named argument, defaulting to all T
|
149
|
+
# transitions in the net. If no arguments are given, values for all the
|
150
|
+
# gradient features are defined.
|
151
|
+
#
|
152
|
+
def gradient *gradient_features, transitions: nil
|
153
|
+
return Gradient( gradient_features, transitions: transitions ) unless
|
154
|
+
gradient_features.empty?
|
155
|
+
return Gradient( features.gradient ) if transitions.nil?
|
156
|
+
Gradient( features.gradient.select do |f|
|
157
|
+
f.transitions == transitions.map { |t| net.transition t }
|
158
|
+
end )
|
159
|
+
end
|
160
|
+
|
161
|
+
# Returns the values for a set of delta features selected from this record's
|
162
|
+
# feature set. Expects a single array argument, optionally qualified by
|
163
|
+
# by +:transitions+ named argument, defaulting to all the transitions in the
|
164
|
+
# net.
|
165
|
+
#
|
166
|
+
def Delta array, transitions: nil
|
167
|
+
array.map { |id|
|
168
|
+
fetch( net.State.Feature.Delta id, transitions: net.tt( transitions ) )
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
172
|
+
# Returns the values for a set of delta features selected from this record's
|
173
|
+
# feature set. Expects an arbitrary number of arguments, optionally qualified
|
174
|
+
# by +:transitions+ named argument, defaulting to all the transitions in the
|
175
|
+
# net. Without arguments, returns values for all the delta features.
|
176
|
+
#
|
177
|
+
def delta *delta_features, transitions: nil
|
178
|
+
return Delta( delta_features, transitions: transitions ) unless
|
179
|
+
delta_features.empty?
|
180
|
+
return Delta( features.delta ) if transitions.nil?
|
181
|
+
Delta( features.delta.select do |f|
|
182
|
+
f.transitions == transitions.map { |t| net.transition t }
|
183
|
+
end )
|
184
|
+
end
|
185
|
+
|
186
|
+
# Returns the values for a set of assignment features selected from this
|
187
|
+
# record's feature set. Expects a single array argument, optionally qualified
|
188
|
+
# by +:transition+ named argument.
|
189
|
+
#
|
190
|
+
def Assignment array, transition: L!
|
191
|
+
return array.map { |id| fetch net.State.Feature.Assignment( id ) } if
|
192
|
+
transition.local_object?
|
193
|
+
array.map { |id|
|
194
|
+
fetch net.State.Feature.Assignment( id, transition: transition )
|
195
|
+
}
|
196
|
+
end
|
197
|
+
|
198
|
+
# Returns the values for a set of assignment features selected from this
|
199
|
+
# record's feature set. Expects an arbitrary number of arguments, optinally
|
200
|
+
# qualified by +:transition+ named argument. Without arguments, returns
|
201
|
+
# values for all the assignment features.
|
202
|
+
#
|
203
|
+
def assignment *ids, transition: L!
|
204
|
+
if transition.local_object? then
|
205
|
+
return Assignment( ids ) unless ids.empty?
|
206
|
+
Assignment features.assignment
|
160
207
|
else
|
161
|
-
return
|
162
|
-
|
163
|
-
when Array then
|
164
|
-
id.map { |id| delta id, transitions: transitions }
|
165
|
-
else
|
166
|
-
fetch( features.delta id, transitions: net.tt( transitions ) )
|
167
|
-
end
|
208
|
+
return Assignment( ids, transition: transition ) unless ids.empty?
|
209
|
+
Assignment features.assignment, transition: transition
|
168
210
|
end
|
169
211
|
end
|
170
212
|
|
171
213
|
# Computes the Euclidean distance from another record.
|
172
214
|
#
|
173
|
-
def euclidean_distance other
|
174
|
-
|
175
|
-
|
176
|
-
|
215
|
+
def euclidean_distance( other )
|
216
|
+
fail TypeError unless features == other.features
|
217
|
+
sum_of_squares = zip( other )
|
218
|
+
.map { |a, b| a - b }
|
219
|
+
.map { |d| d * d }
|
220
|
+
.reduce( 0.0, :+ )
|
221
|
+
sum_of_squares ** 0.5
|
177
222
|
end
|
178
223
|
end # class YPetri::Net::State::Features::Record
|