module YPetri::Transition::Type_T

Mixin for timed Petri net transitions.

Public Instance Methods

action(Δt) click to toggle source

Transition's action (before validation). Requires Δt as an argument.

# File lib/y_petri/transition/T.rb, line 14
def action Δt
  # TODO: Unhelpful error occurs if the user constructs a transition
  # like this:
  #
  #   T = Transition s: { A: -1, B: 2 },
  #                  rate: -> { 0.1 }    # constant rate
  #
  # The user meant to construct a TS transition with constant rate and
  # stoichiometry { A: -1, B: 2 }, but the lambda given under :rate
  # parameter is nullary, while the stoichiometry is taken to imply that
  # the domain consists of place 1.
  #
  #   T.action 5.0
  #
  # then causes error because it tries to supply the marking of A to
  # the user-supplied rate closure, which is nullary.
  #
  # There are 2 problems with this:
  #
  # Firstly, if we choose to see this as the user's problem, the user
  # supplied the Transition constructor with invalid input, but received
  # no warning (problem 1). The user learned about the error by typing
  # T.action 5.0, and the error message is quite unhelpful (problem 2) -
  # it does not inform the user that the rate closure has wrong arity.
  #
  # We, we might deside to see this as a missing feature and make sure
  # that in these cases, the constructor infers that the codomain is
  # empty from the fact that the supplied rate closure is nullary. This
  # requires additional thinking, because it is not possible to infer
  # domain from rate lamdas with non-matching arity in general.
  #
  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
enabled?(Δt) click to toggle source

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.

# File lib/y_petri/transition/T.rb, line 78
def enabled? Δt
  codomain.zip( action Δt ).all? do |place, change|
    begin; place.guard.( place.marking + change )
    rescue YPetri::GuardError; false end
  end
end
f(simulation=world.simulation) click to toggle source

Transition's flux under current simulation.

# File lib/y_petri/transition/T.rb, line 95
def f simulation=world.simulation
  simulation.net.State.Feature.Flux( self ) % simulation
end
fir(simulation=world.simulation, **nn) click to toggle source

Transition's firing under current simulation.

# File lib/y_petri/transition/T.rb, line 87
def fir simulation=world.simulation, **nn
  nn.must_have :delta_time, syn!: :Δt
  Δt = nn.delete( :delta_time ) || simulation.step
  simulation.net.State.Feature.Firing( self ) % [ simulation, Δt: Δt ]
end
fire(Δt) click to toggle source

Fires the transition, honoring cocking. Returns true if the transition fired, false if it wasn't cocked.

# File lib/y_petri/transition/T.rb, line 56
def fire Δt
  cocked?.tap { |x| ( uncock; fire! Δt ) if x }
end
fire!(Δt) click to toggle source

Fires the transition regardless of cocking. For timed transitions, takes Δt as an argument.

# File lib/y_petri/transition/T.rb, line 63
def fire! Δt
  action = Array( action Δt )
  fail TypeError, "Wrong output arity of the action " +
    "closure of #{self}!" if action.size != codomain.size
  codomain.each_with_index do |place, index|
    # Adding action place no. index to place"
    place.add action.fetch( index )
  end
  return nil
end
function() click to toggle source

For timed transitions, “function” refers to their rate closure.

# File lib/y_petri/transition/T.rb, line 8
def function
  rate_closure
end
pa(simulation=world.simulation, **nn) click to toggle source

Prints the transition's action under current simulation.

# File lib/y_petri/transition/T.rb, line 101
def pa simulation=world.simulation, **nn
  nn.must_have :delta_time, syn!: :Δt
  Δt = nn.delete( :delta_time ) || simulation.step
  ff = simulation.net.State.Features.Delta( codomain, transitions: self )
  ( ff >> ff % simulation ).pretty_print_numeric_values( **nn )
end