Module: YPetri::Simulation::Timed
- Defined in:
- lib/y_petri/simulation/timed.rb,
lib/y_petri/simulation/timed/recorder.rb
Overview
A mixin for timed simulations, used by an #extend
call during init.
Defined Under Namespace
Classes: Recorder
Constant Summary collapse
- DEFAULT_SETTINGS =
-> do { step: 0.1, sampling: 5, time: 0..60 } end
Instance Attribute Summary collapse
-
#default_sampling ⇒ Object
readonly
Returns the value of attribute default_sampling.
-
#initial_time ⇒ Object
(also: #starting_time)
readonly
Returns the value of attribute initial_time.
-
#step ⇒ Object
Returns the value of attribute step.
-
#target_time ⇒ Object
(also: #ending_time)
Returns the value of attribute target_time.
-
#time ⇒ Object
readonly
Returns the value of attribute time.
-
#time_unit ⇒ Object
readonly
Returns the value of attribute time_unit.
Instance Method Summary collapse
-
#at(*args) ⇒ Object
Alias for
#dup
for timed simulations. -
#dup(time: time(), **named_args) ⇒ Object
Customized dup method that allows to modify the attributes of the duplicate upon creation.
-
#fluxes(*transitions) ⇒ Object
(also: #flux)
Expects an arbitrary number of arguments identifying TS transitions, and retuns an array of their fluxes.
-
#Fluxes(array) ⇒ Object
Expects a single array of TS transitions or transition ids and returns an array of their fluxes under current marking.
-
#increment_time!(Δt = step) ⇒ Object
Increments the simulation’s time and alerts the recorder.
-
#pflux(*transitions, gap: 0, precision: 4) ⇒ Object
(also: #pfluxes)
Pretty prints flux of the indicated TS transitions as a hash with transition names as keys.
-
#reset!(**nn) ⇒ Object
Resets the timed simulation.
-
#run(upto: target_time, final_step: :exact) ⇒ Object
Same as
#run!
, but guards against run upto infinity. -
#run!(upto: target_time, final_step: :exact) ⇒ Object
Near alias for
#run_upto
. -
#run_upto(target_time, final_step: :exact) ⇒ Object
Runs the simulation until the target time.
-
#set_sampling(sampling) ⇒ Object
Sets sampling of the simulation’s data recorder.
-
#set_simulation_method ⇒ Object
Changing the simulation method on the fly not supported.
-
#set_step(n) ⇒ Object
(also: #set_step_size)
Explicit alias for
#step=
method. -
#set_time(target_time) ⇒ Object
(also: #set_target_time)
Explicit alias for
#target_time=
method. -
#settings(all = false) ⇒ Object
Returns the settings pertaining to the Timed aspect of the simulation, that is,
:step
,:sampling
and:time
. -
#T_fluxes(array) ⇒ Object
(also: #t_Fluxes)
Fluxes of the indicated TS transitions.
-
#t_fluxes(*transitions) ⇒ Object
(also: #t_flux)
Fluxes of the indicated TS transitions.
-
#time_range ⇒ Object
Reads the time range (initial_time .. target_time) of the simulation.
-
#timed? ⇒ Boolean
True for timed simulations.
-
#to_s ⇒ Object
String representation of this timed simulation.
-
#zero_gradient(places: nil) ⇒ Object
(also: #zero_∇)
Returns the zero gradient.
Instance Attribute Details
#default_sampling ⇒ Object (readonly)
Returns the value of attribute default_sampling.
16 17 18 |
# File 'lib/y_petri/simulation/timed.rb', line 16 def default_sampling @default_sampling end |
#initial_time ⇒ Object (readonly) Also known as: starting_time
Returns the value of attribute initial_time.
16 17 18 |
# File 'lib/y_petri/simulation/timed.rb', line 16 def initial_time @initial_time end |
#step ⇒ Object
Returns the value of attribute step.
16 17 18 |
# File 'lib/y_petri/simulation/timed.rb', line 16 def step @step end |
#target_time ⇒ Object Also known as: ending_time
Returns the value of attribute target_time.
16 17 18 |
# File 'lib/y_petri/simulation/timed.rb', line 16 def target_time @target_time end |
#time ⇒ Object (readonly)
Returns the value of attribute time.
16 17 18 |
# File 'lib/y_petri/simulation/timed.rb', line 16 def time @time end |
#time_unit ⇒ Object (readonly)
Returns the value of attribute time_unit.
16 17 18 |
# File 'lib/y_petri/simulation/timed.rb', line 16 def time_unit @time_unit end |
Instance Method Details
#at(*args) ⇒ Object
Alias for #dup
for timed simulations.
199 200 201 |
# File 'lib/y_petri/simulation/timed.rb', line 199 def at *args dup *args end |
#dup(time: time(), **named_args) ⇒ Object
Customized dup method that allows to modify the attributes of the duplicate upon creation.
193 194 195 |
# File 'lib/y_petri/simulation/timed.rb', line 193 def dup time: time(), **named_args super( **named_args ).tap { |instance| instance.reset_time! time } end |
#fluxes(*transitions) ⇒ Object Also known as: flux
Expects an arbitrary number of arguments identifying TS transitions, and retuns an array of their fluxes. Returns fluxes of all the TS transitions if no argument is given.
79 80 81 82 |
# File 'lib/y_petri/simulation/timed.rb', line 79 def fluxes( *transitions ) return Fluxes TS_transitions() if transitions.empty? Fluxes( transitions ) end |
#Fluxes(array) ⇒ Object
Expects a single array of TS transitions or transition ids and returns an array of their fluxes under current marking.
69 70 71 72 73 |
# File 'lib/y_petri/simulation/timed.rb', line 69 def Fluxes( array ) tt = TS_transitions() TS_Transitions( array ) .map { |t| flux_vector.column_to_a.fetch tt.index( t ) } end |
#increment_time!(Δt = step) ⇒ Object
Increments the simulation’s time and alerts the recorder.
178 179 180 181 |
# File 'lib/y_petri/simulation/timed.rb', line 178 def increment_time! Δt=step @time += Δt recorder.alert! end |
#pflux(*transitions, gap: 0, precision: 4) ⇒ Object Also known as: pfluxes
Pretty prints flux of the indicated TS transitions as a hash with transition names as keys. Takes optional list of transition ids (first ordered arg.), and optional 2 named arguments (:gap
and :precision
), as in #pretty_print_numeric_values
.
107 108 109 110 |
# File 'lib/y_petri/simulation/timed.rb', line 107 def pflux( *transitions, gap: 0, precision: 4 ) t_flux( *transitions ) .pretty_print_numeric_values( gap: gap, precision: precision ) end |
#reset!(**nn) ⇒ Object
Resets the timed simulation.
185 186 187 188 |
# File 'lib/y_petri/simulation/timed.rb', line 185 def reset! **nn @time = initial_time || time_unit * 0 super end |
#run(upto: target_time, final_step: :exact) ⇒ Object
Same as #run!
, but guards against run upto infinity.
130 131 132 133 |
# File 'lib/y_petri/simulation/timed.rb', line 130 def run( upto: target_time, final_step: :exact ) fail "Upto time equals infinity!" if upto == Float::INFINITY run!( upto: upto, final_step: final_step ) end |
#run!(upto: target_time, final_step: :exact) ⇒ Object
Near alias for #run_upto
. Accepts :upto
named argument, using :final_step
, has the same options as in #run_upto
method.
139 140 141 |
# File 'lib/y_petri/simulation/timed.rb', line 139 def run!( upto: target_time, final_step: :exact ) run_upto( upto, final_step: final_step ) end |
#run_upto(target_time, final_step: :exact) ⇒ Object
Runs the simulation until the target time. Named argument :final_step has options :just_before, :just_after and :exact, and tunes the simulation behavior towards the end of the run.
stop_before: last step has normal size, simulation stops before or just
on the target time
stop_after: last step has normal size, simulation stops after or just
on the target time_step
exact: simulation stops exactly on the prescribed time, last step
is shortened if necessary
154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/y_petri/simulation/timed.rb', line 154 def run_upto( target_time, final_step: :exact ) case final_step when :stop_before then step! while time + step <= target_time when :exact then step! while time + step < target_time step!( target_time - time ) @time = target_time when :stop_after then step! while time < target_time else fail ArgumentError, "Unrecognized :final_step option: #{final_step}" end end |
#set_sampling(sampling) ⇒ Object
Sets sampling of the simulation’s data recorder.
48 49 50 |
# File 'lib/y_petri/simulation/timed.rb', line 48 def set_sampling sampling recorder.sampling = sampling end |
#set_simulation_method ⇒ Object
Changing the simulation method on the fly not supported.
54 55 56 57 |
# File 'lib/y_petri/simulation/timed.rb', line 54 def set_simulation_method fail NotImplementedError, "Changing simulation method on the fly not supported!" end |
#set_step(n) ⇒ Object Also known as: set_step_size
Explicit alias for #step=
method. Deprecated, use #step=
instead.
30 31 32 |
# File 'lib/y_petri/simulation/timed.rb', line 30 def set_step n step=( n ) end |
#set_time(target_time) ⇒ Object Also known as: set_target_time
Explicit alias for #target_time=
method. Deprecated, use #target_time=
instead.
38 39 40 |
# File 'lib/y_petri/simulation/timed.rb', line 38 def set_time target_time target_time=( target_time ) end |
#settings(all = false) ⇒ Object
Returns the settings pertaining to the Timed aspect of the simulation, that is, :step
, :sampling
and :time
.
122 123 124 125 126 |
# File 'lib/y_petri/simulation/timed.rb', line 122 def settings all=false super.update( step: step, sampling: sampling, time: time_range ) end |
#T_fluxes(array) ⇒ Object Also known as: t_Fluxes
Fluxes of the indicated TS transitions. Expects a single array argument, and returns a hash with transition names as keys.
88 89 90 |
# File 'lib/y_petri/simulation/timed.rb', line 88 def T_fluxes( array ) TS_Transitions( array ).names( true ) >> Fluxes( array ) end |
#t_fluxes(*transitions) ⇒ Object Also known as: t_flux
Fluxes of the indicated TS transitions. Expects an arbitrary number of TS transitions or their ids, returns a hash with transition names as keys.
96 97 98 99 |
# File 'lib/y_petri/simulation/timed.rb', line 96 def t_fluxes( *transitions ) return T_fluxes TS_transitions() if transitions.empty? T_fluxes( transitions ) end |
#time_range ⇒ Object
Reads the time range (initial_time .. target_time) of the simulation.
115 116 117 |
# File 'lib/y_petri/simulation/timed.rb', line 115 def time_range initial_time .. target_time end |
#timed? ⇒ Boolean
True for timed simulations.
12 13 14 |
# File 'lib/y_petri/simulation/timed.rb', line 12 def timed? true end |
#to_s ⇒ Object
String representation of this timed simulation.
171 172 173 174 |
# File 'lib/y_petri/simulation/timed.rb', line 171 def to_s "#<Simulation: time: %s, pp: %s, tt: %s, oid: %s>" % [ time, pp.size, tt.size, object_id ] end |
#zero_gradient(places: nil) ⇒ Object Also known as: zero_∇
Returns the zero gradient. Optionally, places can be specified, for which the zero vector is returned.
206 207 208 209 210 211 212 |
# File 'lib/y_petri/simulation/timed.rb', line 206 def zero_gradient places: nil return zero_gradient places: places() if places.nil? places.map { |id| p = place( id ) ( p.free? ? p.initial_marking : p.clamp ) * 0 / time_unit }.to_column_vector end |