module Pione::PNML::InputReduction

‘InputReduction` is a net rewriting rule. This rule removes unnecessary input nodes of transitions by following criteria. For example, the net likes the following(A and B are transitions)

A --> place --> empty transition --> empty place --> B

is rewritten as the following.

A -> place -> B

Public Class Methods

find_subjects(net, env) click to toggle source

Return subjects(source transtion, target place, and the arc) if the net satisfies input reduction’s condtions. The conditions are followings:

  • There is an empty source transition.

  • There is an empty target place. It is an input of named transition.

  • There is an arc that connects the source and the target.

# File lib/pione/pnml/input-reduction.rb, line 20
def self.find_subjects(net, env)
  net.transitions.each do |rule|
    # rule has its name
    next if Perspective.empty?(env, rule)

    # find source places
    net.find_all_places_by_target_id(rule.id).each do |place|
      # the source place has empty name
      next unless Perspective.empty?(env, place)

      # find transtions that generates the source place
      transitions = net.find_all_transitions_by_target_id(place.id)

      # only one transtion
      if transitions.size == 1
        transition = transitions.first

        # the transition is connected to only one place at target side
        if net.find_all_places_by_source_id(transition.id).size == 1
          # the transition has empty name
          if Perspective.empty?(env, transition)
            return [transition, place, net.find_arc(transition.id, place.id)]
          end
        end
      end
    end
  end

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

Rewrite the net with subjects by the following way.

  • Remove the subject place.

  • Remove the subject transition.

  • Remove the subject and related arcs.

  • Connect discontinuous nodes by new arcs.

# File lib/pione/pnml/input-reduction.rb, line 57
def self.rewrite(net, subjects, env)
  transition, place, arc = subjects

  # remove subjects from the net
  net.places.delete(place)
  net.transitions.delete(transition)
  net.arcs.delete(arc)

  # remove related arcs
  input_arcs = net.find_all_arcs_by_target_id(transition.id)
  input_arcs.each {|arc| net.arcs.delete(arc)}
  output_arcs = net.find_all_arcs_by_source_id(place.id)
  output_arcs.each {|arc| net.arcs.delete(arc)}

  # append new arcs
  input_arcs.each do |input_arc|
    output_arcs.each do |output_arc|
      net.arcs << Arc.new(net, net.generate_id, input_arc.source_id, output_arc.target_id)
    end
  end
end