module Pione::PNML::OutputDecompositionComplement

‘OutputDecompositionComplement` is a net transformational rule. This rule complements name of source place that forms output decomposition pattern. For example, the net likes following

              +--> empty transition --> 'p1'
              |
empty place --+--> empty transition --> 'p2'
              |
              +--> empty transition --> 'p3'

is rewritten as th following.

                       +--> empty transition --> 'p1'
                       |
'p1' or 'p2' or 'p3' --+--> empty transition --> 'p2'
                       |
                       +--> empty transition --> 'p3'

Public Class Methods

find_subjects(net, env) click to toggle source

Find subjects(source place and component places) of this rule from net. The conditions are followings:

  • There is an empty source place.

  • There are more than 2 target transitions. All traget transitions are empty, and each target transition has only one output named place.

  • There are arcs that connect the source and targets.

@param net [PNML::Net]

rewriting target net

@param env [Lang::Environment]

language environment

@return [Array]

source place and component places
# File lib/pione/pnml/output-decomposition-complement.rb, line 36
def self.find_subjects(net, env)
  net.places.each do |place|
    # source place should be empty
    next unless Perspective.empty_place?(env, place)

    # there should be more than 2 target transitions
    transitions = net.find_all_transitions_by_source_id(place.id)
    next unless transitions.size > 1
    next unless transitions.all? {|transition| Perspective.empty_transition?(env, transition)}

    # each transition has only one output named place
    component_places = []
    next unless transitions.all? do |transition|
      _places = net.find_all_places_by_source_id(transition.id)
      component_places.concat(_places)
      _places.size == 1 and not(Perspective.empty_place?(env, _places.first))
    end

    return [place, component_places]
  end

  return nil
end
rewrite(net, subjects, env) click to toggle source

Rewrite source place’s name as disjunction of component place’s name.

@param net [PNML::Net]

rewriting target net

@param subjects [Array]

source place and component places

@param env [Lang::Environment]

language environment

@return [void]

# File lib/pione/pnml/output-decomposition-complement.rb, line 69
def self.rewrite(net, subjects, env)
  place, component_places = subjects

  # component places' names
  names = component_places.map do |component_place|
    LabelExtractor.extract_data_expr(component_place.name)
  end

  modifier = Perspective.data_modifier(env, place) || ""
  place.name = modifier + names.sort.join(" or ")
end