diff --git a/demos/AoModel.rb b/demos/AoModel.rb index a7649e4f883dbf8af3542f85ca7b705363ac3427..99a1c0f6e6c2180ec46903eb02c7a4b3d5be0bd7 100644 --- a/demos/AoModel.rb +++ b/demos/AoModel.rb @@ -1,6 +1,5 @@ #!/usr/bin/env ruby -require 'rubygems' if RUBY_VERSION =~ /^1\.8/ require_relative '../lib/simplekit' # Demonstration model of Operational Availability (Ao). diff --git a/demos/MMk.rb b/demos/MMk.rb index 90b37062778ebf886e8c22c0c3615ba3ff1b5619..241f34b1122064c9e064a801e2d752dff2e1c7d7 100644 --- a/demos/MMk.rb +++ b/demos/MMk.rb @@ -1,6 +1,5 @@ #!/usr/bin/env ruby -require 'rubygems' if RUBY_VERSION =~ /^1\.8/ require_relative '../lib/simplekit' # Demonstration model of an M/M/k queueing system. There are k servers diff --git a/demos/MyModel.rb b/demos/MyModel.rb index b91fbee2daaf8bb890b6df03febdd2f0d65a5bbf..fa336619e5d494290b01ea2ca07a73cb09c1cf87 100644 --- a/demos/MyModel.rb +++ b/demos/MyModel.rb @@ -1,7 +1,6 @@ #!/usr/bin/env ruby -require 'rubygems' if RUBY_VERSION =~ /^1\.8/ -require 'simplekit' +require_relative '../lib/simplekit' class MyModel include SimpleKit diff --git a/demos/MyModelArgs.rb b/demos/MyModelArgs.rb index 1af10706df56b50ac426c4a6d18e14b985a5fe7b..ebbd4049462bd10e2c7cdfb15ee5afe3ef8b3974 100644 --- a/demos/MyModelArgs.rb +++ b/demos/MyModelArgs.rb @@ -1,6 +1,5 @@ #!/usr/bin/env ruby -require 'rubygems' if RUBY_VERSION =~ /^1\.8/ require_relative '../lib/simplekit' class MyModel @@ -8,12 +7,12 @@ class MyModel def init @x = 1 - schedule(:increment, rand(2), 1, 97) + schedule(:increment, rand(2), n: 1, c: 97) end - def increment(n, c) + def increment(n:, c:) @x += n - schedule(:increment, 2.0 * rand(2), @x, c + 1) + schedule(:increment, 2.0 * rand(2), n: @x, c: c + 1) printf "%f, %f, %c\n", model_time, @x, c schedule(:halt, 0.0) if model_time > 10 end diff --git a/lib/simplekit.rb b/lib/simplekit.rb index 5ebfcfa603324d91892c7fa45acc8e5a5096ef38..1f00ad3d0d5429c1d64b39ac779c8cea75c62267 100644 --- a/lib/simplekit.rb +++ b/lib/simplekit.rb @@ -53,9 +53,9 @@ module SimpleKit # the event executes. # - +args+ -> an optional list of arguments to pass to the event # at invocation time. - def schedule(event, delay, *args) + def schedule(event, delay, **args) raise 'Model scheduled event with negative delay.' if delay < 0 - @event_list.push EventNotice.new(event, @model_time + delay, args) + @event_list.push EventNotice.new(event, @model_time, delay, args) end # Start execution of a model. The simulation +model_time+ is initialized @@ -68,7 +68,11 @@ module SimpleKit @user_model.init while (current_event = @event_list.pop) @model_time = current_event.time - @user_model.send(current_event.event, *current_event.args) + if current_event.args.empty? + @user_model.send(current_event.event) + else + @user_model.send(current_event.event, current_event.args) + end end end @@ -79,9 +83,18 @@ module SimpleKit end end - # This is a private helper Struct for the EventScheduler class. + # This is a private helper class for the EventScheduler class. # Users should never try to access this directly. - EventNotice = Struct.new(:event, :time, *:args) do + private class EventNotice + attr_reader :event, :time, :time_stamp, :args + + def initialize(event, time, delay, **args) + @event = event + @time_stamp = time + @time = time + delay + @args = args + end + include Comparable def <=>(other) time <=> other.time