Sha256: 5d1cd9e682d5f4f818abeda7dbf2e6129fad35d54e7d3d1f09c20bb0966d7add

Contents?: true

Size: 1.95 KB

Versions: 1

Compression:

Stored size: 1.95 KB

Contents

module SimControl
  class Controller
    attr_reader :current_simulation

    def initialize(hostname, simulation_description, scenario_description, results_directory, args = {})
      @hosts = args.delete(:hosts) || SimControl::Hosts.new
      @scenario_klass = args.delete(:scenario_klass) || SimControl::Scenario

      @hostname = hostname
      @simulation_description = simulation_description
      @scenario_description = scenario_description
      @results_directory = results_directory

      @scenarios = []

      @meta_seed = 13
      @max_seed = 2**(32 - 1) - 1
    end 

    def create_scenario(*args)
      @scenario_klass.new(*args)
    end

    def run
      instance_eval(@simulation_description)
      instance_eval(@scenario_description)

      host_scenarios = @hosts.partition(all_scenarios, @hostname)

      host_scenarios.each do |scenarios_per_core|
        threads = []
        scenarios_per_core.each do |scenario|
          threads << Thread.new do
            current_simulation.simulate(scenario, seeds)
          end
        end
        threads.each do |thread|
          thread.join
        end
      end
    end

    def repetitions(number_of_repetitions)
      @number_of_repetitions = number_of_repetitions
    end

    def hosts(&hosts_block)
      @hosts.process &hosts_block
    end

    def simulation(klass, script, arguments)
      @current_simulation = klass.new script, @results_directory, arguments
    end

    def seeds
      @rng = Random.new(@meta_seed)
      (1..@number_of_repetitions).map { @rng.rand(@max_seed) }
    end

    def simulate(*scenario)
      @scenarios << (create_scenario *scenario)
    end

    def all_scenarios
      @scenarios
    end

    class << self
      def execute(hostname, simulation_description, scenario_description, results_directory)
        controller = SimControl::Controller.new(hostname, simulation_description, scenario_description, results_directory)
        controller.run
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
SimControl-0.1.9 lib/SimControl/controller.rb