From 62eeda72b0da1843bf132c41e35b1e2c02194776 Mon Sep 17 00:00:00 2001 From: Unknown <pjs@alum.mit.edu> Date: Sun, 8 Jul 2018 21:04:19 -0700 Subject: [PATCH] demos work both w/ and w/o event arguments Event arguments now must be labeled. --- demos/AoModel.rb | 1 - demos/MMk.rb | 1 - demos/MyModel.rb | 3 +-- demos/MyModelArgs.rb | 7 +++---- lib/simplekit.rb | 23 ++++++++++++++++++----- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/demos/AoModel.rb b/demos/AoModel.rb index a7649e4..99a1c0f 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 90b3706..241f34b 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 b91fbee..fa33661 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 1af1070..ebbd404 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 5ebfcfa..1f00ad3 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 -- GitLab