Class: Pione::PNML::Net

Inherits:
StructX
  • Object
show all
Defined in:
lib/pione/pnml/pnml-model.rb

Overview

Net represents a net in PNML. PIONE handles PT-nets only, so this is consisted by places, transitions, and arcs.

Instance Method Summary collapse

Instance Method Details

#find_all_arcs_by_source_id(source_id) ⇒ Array<Arc>

Find all arcs by the source ID.

Parameters:

  • source_id (String)

    source ID

Returns:



72
73
74
75
76
77
78
79
80
# File 'lib/pione/pnml/pnml-model.rb', line 72

def find_all_arcs_by_source_id(source_id)
  _arcs = arcs.select {|arc| arc.source_id == source_id}

  if block_given?
    _arcs.each {|arc| yield arc}
  else
    return _arcs
  end
end

#find_all_arcs_by_target_id(target_id) ⇒ Array<Arc>

Find all arcs by the target ID.

Parameters:

  • target_id (String)

    target ID

Returns:



88
89
90
91
92
93
94
95
96
# File 'lib/pione/pnml/pnml-model.rb', line 88

def find_all_arcs_by_target_id(target_id)
  _arcs = arcs.select {|arc| arc.target_id == target_id}

  if block_given?
    _arcs.each {|arc| yield arc}
  else
    return _arcs
  end
end

#find_all_places_by_name(name) ⇒ Array<Place>

Find places by the name.

Parameters:

  • name (String)

    place name

Returns:



274
275
276
277
278
279
280
281
282
# File 'lib/pione/pnml/pnml-model.rb', line 274

def find_all_places_by_name(name)
  _places = places.select {|place| place.name == name}

  if block_given?
    _places.each {|place| yield place}
  else
    return _places
  end
end

#find_all_places_by_source_id(transition_id) ⇒ Array<Transition>

Find all places by the source transition ID.

Parameters:

  • transition_id (String)

    transition ID

Returns:



307
308
309
310
311
312
313
314
315
316
317
318
# File 'lib/pione/pnml/pnml-model.rb', line 307

def find_all_places_by_source_id(transition_id)
  _arcs = arcs.select {|arc| arc.source_id == transition_id}
  _places = _arcs.map do |arc|
    places.find {|place| place.id == arc.target_id}
  end.compact.uniq

  if block_given?
    _places.each {|place| yield place}
  else
    return _places
  end
end

#find_all_places_by_target_id(transition_id) ⇒ Array<Transition>

Find all places by the target transition ID.

Parameters:

  • transition_id (String)

    transition ID

Returns:



343
344
345
346
347
348
349
350
351
352
353
354
# File 'lib/pione/pnml/pnml-model.rb', line 343

def find_all_places_by_target_id(transition_id)
  _arcs = arcs.select {|arc| arc.target_id == transition_id}
  _places = _arcs.map do |arc|
    places.find {|place| place.id == arc.source_id}
  end.compact.uniq

  if block_given?
    _places.each {|place| yield place}
  else
    return _places
  end
end

#find_all_transitions_by_name(name) ⇒ Array<Transition>

Find all transitions by the name.

Parameters:

  • name (String)

    transition's name

Returns:



159
160
161
162
163
164
165
166
167
# File 'lib/pione/pnml/pnml-model.rb', line 159

def find_all_transitions_by_name(name)
  _transitions = transitions.select {|transition| transition.name == name}

  if block_given?
    _transitions.each {|transition| yield transition}
  else
    return _transitions
  end
end

#find_all_transitions_by_source_id(place_id) ⇒ Array<Transition>

Find all transitions by the source place ID.

Parameters:

  • place_id (String)

    place ID

Returns:



192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/pione/pnml/pnml-model.rb', line 192

def find_all_transitions_by_source_id(place_id)
  _arcs = arcs.select {|arc| arc.source_id == place_id}
  _transitions = _arcs.map do |arc|
    transitions.find {|transition| transition.id == arc.target_id}
  end.compact.uniq

  if block_given?
    _transitions.each {|transition| yield transition}
  else
    return _transitions
  end
end

#find_all_transitions_by_target_id(target_id) ⇒ Array<Transition>

Find all transitions by the target place ID.

Parameters:

  • place_id (String)

    place ID

Returns:



228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/pione/pnml/pnml-model.rb', line 228

def find_all_transitions_by_target_id(target_id)
  _arcs = arcs.select {|arc| arc.target_id == target_id}
  _transitions = _arcs.map do |arc|
    transitions.find {|transition| transition.id == arc.source_id}
  end.compact.uniq

  if block_given?
    _transitions.each {|transition| yield transition}
  else
    return _transitions
  end
end

#find_arc(source_id, target_id) ⇒ PNML::Arc

Find the arc that connects from the source ID to the target ID. If no arcs found, return nil.

Parameters:

  • source_id (String)

    source ID

  • target_id (String)

    target ID

Returns:



55
56
57
58
59
60
61
62
63
64
# File 'lib/pione/pnml/pnml-model.rb', line 55

def find_arc(source_id, target_id)
  _arcs = arcs.select {|arc| arc.source_id == source_id and arc.target_id == target_id}

  # the result shouldn't be ambiguous
  if _arcs.size > 1
    raise AmbiguousNetQueryResult.new(__method__, place_id, _transitions)
  end

  return _arcs.first
end

#find_place(id) ⇒ Place

Find a place by ID.

Parameters:

  • id (String)

    the place ID

Returns:



247
248
249
# File 'lib/pione/pnml/pnml-model.rb', line 247

def find_place(id)
  places.find {|place| place.id == id}
end

#find_place_by_name(name) ⇒ Place

Find a place by the name.

Parameters:

  • name (String)

    the place name

Returns:

  • (Place)

    a place, or nil



257
258
259
260
261
262
263
264
265
266
# File 'lib/pione/pnml/pnml-model.rb', line 257

def find_place_by_name(name)
  _places = find_all_places_by_name(name)

  # the result shouldn't be ambiguous
  if _places.size > 1
    raise AmbiguousNetQueryResult.new(__method__, name, _places)
  end

  return _places.first
end

#find_place_by_source_id(transition_id) ⇒ Array<Transition>

Find a place by the source transition ID.

Parameters:

  • transition_id (String)

    transition ID

Returns:



290
291
292
293
294
295
296
297
298
299
# File 'lib/pione/pnml/pnml-model.rb', line 290

def find_place_by_source_id(transition_id)
  _places = find_all_places_by_source_id(transition_id)

  # the result shouldn't be ambiguous
  if _places.size > 1
    raise AmbiguousNetQueryResult.new(__method__, name, _places)
  end

  return _places.first
end

#find_place_by_target_id(transition_id) ⇒ Array<Transition>

Find a place by the target transition ID.

Parameters:

  • transition_id (String)

    transition ID

Returns:



326
327
328
329
330
331
332
333
334
335
# File 'lib/pione/pnml/pnml-model.rb', line 326

def find_place_by_target_id(transition_id)
  _places = find_all_places_by_target_id(transition_id)

  # the result shouldn't be ambiguous
  if _places.size > 1
    raise AmbiguousNetQueryResult.new(__method__, name, _places)
  end

  return _places.first
end

#find_transition(id) ⇒ Transition

Find a transition by ID.

Parameters:

  • id (String)

    transition ID

Returns:



132
133
134
# File 'lib/pione/pnml/pnml-model.rb', line 132

def find_transition(id)
  transitions.find {|transition| transition.id == id}
end

#find_transition_by_name(name) ⇒ Transition

Find a transition by the name.

Parameters:

  • name (String)

    the transition name

Returns:



142
143
144
145
146
147
148
149
150
151
# File 'lib/pione/pnml/pnml-model.rb', line 142

def find_transition_by_name(name)
  _transitions = find_all_transitions_by_name(name)

  # the result shouldn't be ambiguous
  if _transitions.size > 1
    raise AmbiguousNetQueryResult.new(__method__, place_id, _transitions)
  end

  return _transitions.first
end

#find_transition_by_source_id(place_id) ⇒ Array<Transition>

Find a transition by the source place ID.

Parameters:

  • place_id (String)

    place ID

Returns:



175
176
177
178
179
180
181
182
183
184
# File 'lib/pione/pnml/pnml-model.rb', line 175

def find_transition_by_source_id(place_id)
  _transitions = find_all_transitions_by_source_id(place_id)

  # the result shouldn't be ambiguous
  if _transitions.size > 1
    raise AmbiguousNetQueryResult.new(__method__, place_id, _transitions)
  end

  return _transitions.first
end

#find_transition_by_target_id(place_id) ⇒ Array<Transition>

Find a transition by the target place ID.

Parameters:

  • place_id (String)

    place ID

Returns:



211
212
213
214
215
216
217
218
219
220
# File 'lib/pione/pnml/pnml-model.rb', line 211

def find_transition_by_target_id(place_id)
  _transitions = find_all_transitions_by_target_id(place_id)

  # the result shouldn't be ambiguous
  if _transitions.size > 1
    raise AmbiguousNetQueryResult.new(__method__, place_id, _transitions)
  end

  return _transitions.first
end

#generate_idObject

Generate a new PNML's ID.



16
17
18
# File 'lib/pione/pnml/pnml-model.rb', line 16

def generate_id
  Util::UUID.generate
end

#pt_arcsArray<PNML::Arc>

Return all arcs which have the direction from place to transition.

Returns:



116
117
118
119
120
121
122
123
124
# File 'lib/pione/pnml/pnml-model.rb', line 116

def pt_arcs
  _arcs = arcs.select {|arc| arc.from_place_to_transition?}

  if block_given?
    _arcs.each {|arc| yield arc}
  else
    return _arcs
  end
end

#tp_arcsArray<PNML::Arc>

Return all arcs which have the direction from transtion to place.

Returns:



102
103
104
105
106
107
108
109
110
# File 'lib/pione/pnml/pnml-model.rb', line 102

def tp_arcs
  _arcs = arcs.select {|arc| arc.from_transition_to_place?}

  if block_given?
    _arcs.each {|arc| yield arc}
  else
    return _arcs
  end
end

#valid?Boolean

Return true if the net is valid. The criterion of validness is that all arcs connect places and transitions.

Returns:

  • (Boolean)

    true if the net is valid



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/pione/pnml/pnml-model.rb', line 25

def valid?
  arcs.each do |arc|
    source_transition = find_transition(arc.source_id)
    source_place = find_place(arc.source_id)
    target_transition = find_transition(arc.target_id)
    target_place = find_place(arc.target_id)

    # arc from transition to place
    cond1 = not(source_transition.nil?) && not(target_place.nil?)

    # arc from place to transition
    cond2 = not(source_place.nil?) && not(target_transition.nil?)

    unless cond1 or cond2
      return false
    end
  end

  return true
end