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
# File 'lib/pione/pnml/pnml-model.rb', line 72

def find_all_arcs_by_source_id(source_id)
  arcs.select {|arc| arc.source_id == source_id}
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:



82
83
84
# File 'lib/pione/pnml/pnml-model.rb', line 82

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

#find_all_places_by_name(name) ⇒ Array<Place>

Find places by the name.

Parameters:

  • name (String)

    place name

Returns:



240
241
242
# File 'lib/pione/pnml/pnml-model.rb', line 240

def find_all_places_by_name(name)
  places.select {|place| place.name == name}
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:



270
271
272
273
274
275
276
# File 'lib/pione/pnml/pnml-model.rb', line 270

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
  return _places.compact.uniq
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:



304
305
306
307
308
309
310
# File 'lib/pione/pnml/pnml-model.rb', line 304

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
  return _places.compact.uniq
end

#find_all_transitions_by_name(name) ⇒ Array<Transition>

Find all transitions by the name.

Parameters:

  • name (String)

    transition's name

Returns:



135
136
137
# File 'lib/pione/pnml/pnml-model.rb', line 135

def find_all_transitions_by_name(name)
  transitions.select {|transition| transition.name == name}
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:



165
166
167
168
169
170
171
# File 'lib/pione/pnml/pnml-model.rb', line 165

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
  return _transitions.compact.uniq
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:



199
200
201
202
203
204
205
# File 'lib/pione/pnml/pnml-model.rb', line 199

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
  return _transitions.compact.uniq
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:



213
214
215
# File 'lib/pione/pnml/pnml-model.rb', line 213

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



223
224
225
226
227
228
229
230
231
232
# File 'lib/pione/pnml/pnml-model.rb', line 223

def find_place_by_name(name)
  _places = places.select {|place| place.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:



250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/pione/pnml/pnml-model.rb', line 250

def find_place_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

  # 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:



284
285
286
287
288
289
290
291
292
293
294
295
296
# File 'lib/pione/pnml/pnml-model.rb', line 284

def find_place_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

  # 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:



108
109
110
# File 'lib/pione/pnml/pnml-model.rb', line 108

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:



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

def find_transition_by_name(name)
  _transitions = transitions.select {|transition| transition.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:



145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/pione/pnml/pnml-model.rb', line 145

def find_transition_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

  # 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(target_id) ⇒ Array<Transition>

Find a transition by the target place ID.

Parameters:

  • place_id (String)

    place ID

Returns:



179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/pione/pnml/pnml-model.rb', line 179

def find_transition_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

  # 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:



98
99
100
# File 'lib/pione/pnml/pnml-model.rb', line 98

def pt_arcs
  arcs.select {|arc| arc.from_place_to_transition?}
end

#tp_arcsArray<PNML::Arc>

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

Returns:



90
91
92
# File 'lib/pione/pnml/pnml-model.rb', line 90

def tp_arcs
  arcs.select {|arc| arc.from_transition_to_place?}
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