Sha256: 1c9ae1b106575c7cf5bbdf9a178c845b556aae425bb164b039fdb9d34a227e31

Contents?: true

Size: 1.52 KB

Versions: 38

Compression:

Stored size: 1.52 KB

Contents

# -*- coding: utf-8 -*-

# Mixin for timed Petri net transitions.
# 
module YPetri::Transition::Type_T
  # Transition's action (before validation). Requires Δt as an argument.
  # 
  def action Δt
    if stoichiometric? then
      rate = rate_closure.( *domain_marking )
      stoichiometry.map { |coeff| rate * coeff * Δt }
    else
      Array( rate_closure.( *domain_marking ) ).map { |e| e * Δt }
    end
  end

  # Fires the transition, honoring cocking. Returns true if the transition
  # fired, false if it wasn't cocked.
  # 
  def fire Δt
    cocked?.tap { |x| ( uncock; fire! Δt ) if x }
  end

  # Fires the transition regardless of cocking. For timed transitions, takes
  # Δt as an argument.
  # 
  def fire! Δt
    consciously "call #fire method" do
      act = note "action", is: Array( action Δt )
      msg = "Wrong output arity of the action closure of #{self}!"
      fail TypeError, msg if act.size != codomain.size
      codomain.each_with_index do |p, i|
        note "adding action element no. #{i} to #{p}"
        p.add note( "marking change", is: act.fetch( i ) )
      end
    end
    return nil
  end

  # YPetri transitions are _enabled_ if and only if the intended action would
  # lead to a legal codomain marking. For timed transitions, +#enabled?+ method
  # takes Δt as an argument.
  # 
  def enabled? Δt
    codomain.zip( action Δt ).all? do |place, change|
      begin; place.guard.( place.marking + change )
      rescue YPetri::GuardError; false end
    end
  end
end # class YPetri::Transition::Type_T

Version data entries

38 entries across 38 versions & 1 rubygems

Version Path
y_petri-2.2.4 lib/y_petri/transition/T.rb
y_petri-2.2.3 lib/y_petri/transition/T.rb
y_petri-2.2.2 lib/y_petri/transition/T.rb
y_petri-2.2.1 lib/y_petri/transition/T.rb
y_petri-2.2.0 lib/y_petri/transition/T.rb
y_petri-2.1.51 lib/y_petri/transition/T.rb
y_petri-2.1.50 lib/y_petri/transition/T.rb
y_petri-2.1.49 lib/y_petri/transition/T.rb
y_petri-2.1.48 lib/y_petri/transition/T.rb
y_petri-2.1.47 lib/y_petri/transition/T.rb
y_petri-2.1.46 lib/y_petri/transition/T.rb
y_petri-2.1.45 lib/y_petri/transition/T.rb
y_petri-2.1.44 lib/y_petri/transition/T.rb
y_petri-2.1.42 lib/y_petri/transition/T.rb
y_petri-2.1.40 lib/y_petri/transition/T.rb
y_petri-2.1.39 lib/y_petri/transition/T.rb
y_petri-2.1.37 lib/y_petri/transition/T.rb
y_petri-2.1.36 lib/y_petri/transition/T.rb
y_petri-2.1.35 lib/y_petri/transition/T.rb
y_petri-2.1.34 lib/y_petri/transition/T.rb