experiment 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +2 -1
- data/bin/experiment +1 -1
- data/lib/experiment.rb +1 -1
- data/lib/experiment/base.rb +9 -8
- data/lib/experiment/distributed/master.rb +63 -0
- data/lib/experiment/distributed/slave.rb +36 -0
- data/lib/experiment/runner.rb +2 -2
- data/lib/experiment/work_server.rb +1 -1
- metadata +4 -3
- data/lib/experiment/distributed.rb +0 -98
data/Manifest.txt
CHANGED
@@ -12,7 +12,8 @@ lib/experiment/generator/Rakefile
|
|
12
12
|
lib/experiment/base.rb
|
13
13
|
lib/experiment/notify.rb
|
14
14
|
lib/experiment/work_server.rb
|
15
|
-
lib/experiment/distributed.rb
|
15
|
+
lib/experiment/distributed/master.rb
|
16
|
+
lib/experiment/distributed/slave.rb
|
16
17
|
lib/experiment/factorial.rb
|
17
18
|
lib/experiment/params.rb
|
18
19
|
test/test_experiment.rb
|
data/bin/experiment
CHANGED
data/lib/experiment.rb
CHANGED
data/lib/experiment/base.rb
CHANGED
@@ -2,7 +2,8 @@ require File.dirname(__FILE__) + "/notify"
|
|
2
2
|
require File.dirname(__FILE__) + "/stats/descriptive"
|
3
3
|
require File.dirname(__FILE__) + "/config"
|
4
4
|
require File.dirname(__FILE__) + "/params"
|
5
|
-
require File.dirname(__FILE__) + "/distributed"
|
5
|
+
require File.dirname(__FILE__) + "/distributed/slave"
|
6
|
+
require File.dirname(__FILE__) + "/distributed/master"
|
6
7
|
require 'benchmark'
|
7
8
|
require "drb/drb"
|
8
9
|
require "yaml"
|
@@ -12,8 +13,6 @@ module Experiment
|
|
12
13
|
# @author Jakub Hampl
|
13
14
|
# @see https://github.com/gampleman/Experiment/wiki/Designing-your-experiment
|
14
15
|
class Base
|
15
|
-
|
16
|
-
include Distributed
|
17
16
|
|
18
17
|
@@cleanup_raw_files = false
|
19
18
|
|
@@ -30,22 +29,24 @@ module Experiment
|
|
30
29
|
# Called internally by the framewrok
|
31
30
|
# @private
|
32
31
|
# @param [:normal, :master, :slave] mode
|
33
|
-
# @param [String] experiment
|
32
|
+
# @param [String] experiment Name of the experimental condition.
|
33
|
+
# @param [OpenStruct] options Most of the options passed from the CLI.
|
34
34
|
def initialize(mode, experiment, options)
|
35
35
|
@experiment = experiment
|
36
36
|
@options = options
|
37
|
+
# a bit of dependency injection here
|
37
38
|
case mode
|
38
|
-
|
39
39
|
when :normal
|
40
40
|
@abm = []
|
41
|
-
|
42
41
|
when :master
|
43
42
|
@abm = []
|
44
43
|
extend DRb::DRbUndumped
|
44
|
+
extend Distributed::Master
|
45
45
|
@done = false
|
46
46
|
when :slave
|
47
|
-
|
47
|
+
extend Distributed::Slave
|
48
48
|
end
|
49
|
+
|
49
50
|
Experiment::Config::load(experiment, options.opts, options.env)
|
50
51
|
@mode = mode
|
51
52
|
end
|
@@ -79,7 +80,7 @@ module Experiment
|
|
79
80
|
|
80
81
|
# runs the whole experiment, called by the framework
|
81
82
|
# @private
|
82
|
-
def
|
83
|
+
def run!(cv)
|
83
84
|
@cvs = cv || 1
|
84
85
|
@results = {}
|
85
86
|
Notify.started @experiment
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Experiment
|
2
|
+
# It incorporates most of the logic required for distributed
|
3
|
+
# computing support.
|
4
|
+
# @see https://github.com/gampleman/Experiment/wiki/Distributed-Mode
|
5
|
+
# @private
|
6
|
+
module Distributed
|
7
|
+
# this module is included into base when running with --distributed
|
8
|
+
module Master
|
9
|
+
# Send work from the master server
|
10
|
+
# @return [Hash, false] either a spec what work to carry out or false
|
11
|
+
# when no work available
|
12
|
+
def get_work()
|
13
|
+
if cv = @started.index(false)
|
14
|
+
@started[cv] = true
|
15
|
+
{:cv => cv, :input => @data[cv], :dir => @dir, :options => Experiment::Config.to_hash, :cvs => cvs }
|
16
|
+
else
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# returns true if all work has been disseminated
|
22
|
+
def distribution_done?
|
23
|
+
@started.all?
|
24
|
+
end
|
25
|
+
|
26
|
+
# Sends the result of the computation back to the master server.
|
27
|
+
# Called on the master server object.
|
28
|
+
def submit_result(cv, result, performance)
|
29
|
+
@completed[cv] = true
|
30
|
+
array_merge(@results, result)
|
31
|
+
@abm << performance
|
32
|
+
Notify.cv_done @experiment, cv
|
33
|
+
master_done! if @completed.all?
|
34
|
+
end
|
35
|
+
|
36
|
+
# Strats up the master server
|
37
|
+
def run!(cv)
|
38
|
+
|
39
|
+
@cvs = cv || 1
|
40
|
+
@results = {}
|
41
|
+
Notify.started @experiment
|
42
|
+
split_up_data
|
43
|
+
write_dir!
|
44
|
+
@completed = (1..@cvs).map {|a| false }
|
45
|
+
@started = @completed.dup
|
46
|
+
end
|
47
|
+
|
48
|
+
# Cleans up the master server after all work is done
|
49
|
+
def master_done!
|
50
|
+
@done = true
|
51
|
+
specification! true
|
52
|
+
summarize_performance!
|
53
|
+
summarize_results! @results
|
54
|
+
cleanup!
|
55
|
+
Notify.completed @experiment
|
56
|
+
|
57
|
+
#sleep 1
|
58
|
+
#DRb.stop_service
|
59
|
+
end
|
60
|
+
|
61
|
+
end # module Master
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Experiment
|
2
|
+
module Distributed
|
3
|
+
# this module is included into base when running as worker
|
4
|
+
module Slave
|
5
|
+
# master server DRb object
|
6
|
+
attr_accessor :master
|
7
|
+
|
8
|
+
# Main function. Will continously request work from the server,
|
9
|
+
# execute it and send back results, then loops to the beggining.
|
10
|
+
def run!(not_used_arg)
|
11
|
+
while work = @master.get_work
|
12
|
+
puts work.inspect
|
13
|
+
Experiment::Config.set work[:options]
|
14
|
+
@current_cv = work[:cv]
|
15
|
+
@dir = work[:dir]
|
16
|
+
@data = work[:input]
|
17
|
+
#@data = work[:input]
|
18
|
+
File.open(@dir + "/raw-#{@current_cv}.txt", "w") do |output|
|
19
|
+
@ouptut_file = output
|
20
|
+
run_the_experiment
|
21
|
+
end
|
22
|
+
result = analyze_result!(@dir + "/raw-#{@current_cv}.txt", @dir + "/analyzed-#{@current_cv}.txt")
|
23
|
+
write_performance!
|
24
|
+
@master.submit_result @current_cv, result, @abm.first
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def test_data
|
31
|
+
@data
|
32
|
+
end
|
33
|
+
|
34
|
+
end # Master
|
35
|
+
end
|
36
|
+
end
|
data/lib/experiment/runner.rb
CHANGED
@@ -143,7 +143,7 @@ module Experiment
|
|
143
143
|
require "./experiments/#{exp}/#{exp}"
|
144
144
|
cla = eval(as_class_name(exp))
|
145
145
|
experiment = cla.new :normal, exp, @options
|
146
|
-
experiment.
|
146
|
+
experiment.run! @options.cv
|
147
147
|
end
|
148
148
|
Notify::done
|
149
149
|
end
|
@@ -199,7 +199,7 @@ module Experiment
|
|
199
199
|
cla = eval(as_class_name(exp))
|
200
200
|
experiment = cla.new :slave, exp, @options
|
201
201
|
experiment.master = @master.instance item
|
202
|
-
experiment.
|
202
|
+
experiment.run! 0
|
203
203
|
end
|
204
204
|
end
|
205
205
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 3
|
9
|
+
version: 0.3.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jakub Hampl
|
@@ -75,7 +75,8 @@ files:
|
|
75
75
|
- lib/experiment/base.rb
|
76
76
|
- lib/experiment/notify.rb
|
77
77
|
- lib/experiment/work_server.rb
|
78
|
-
- lib/experiment/distributed.rb
|
78
|
+
- lib/experiment/distributed/master.rb
|
79
|
+
- lib/experiment/distributed/slave.rb
|
79
80
|
- lib/experiment/factorial.rb
|
80
81
|
- lib/experiment/params.rb
|
81
82
|
- test/test_experiment.rb
|
@@ -1,98 +0,0 @@
|
|
1
|
-
module Experiment
|
2
|
-
# this module is included in Experiment::Base
|
3
|
-
# It incorporates most of the logic required for distributed
|
4
|
-
# computing support.
|
5
|
-
# @see https://github.com/gampleman/Experiment/wiki/Distributed-Mode
|
6
|
-
# @private
|
7
|
-
module Distributed
|
8
|
-
|
9
|
-
|
10
|
-
# @group Called on slave
|
11
|
-
|
12
|
-
# master server DRb object
|
13
|
-
attr_accessor :master
|
14
|
-
|
15
|
-
# Main function. Will continously request work from the server,
|
16
|
-
# execute it and send back results, then loops to the beggining.
|
17
|
-
def slave_run!
|
18
|
-
while work = @master.get_work
|
19
|
-
puts work.inspect
|
20
|
-
Experiment::Config.set work[:options]
|
21
|
-
@current_cv = work[:cv]
|
22
|
-
|
23
|
-
@dir = work[:dir]
|
24
|
-
#@data = work[:input]
|
25
|
-
File.open(@dir + "/raw-#{@current_cv}.txt", "w") do |output|
|
26
|
-
@ouptut_file = output
|
27
|
-
run_the_experiment
|
28
|
-
end
|
29
|
-
result = analyze_result!(@dir + "/raw-#{@current_cv}.txt", @dir + "/analyzed-#{@current_cv}.txt")
|
30
|
-
write_performance!
|
31
|
-
@master.submit_result @current_cv, result, @abm.first
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
# @endgroup
|
38
|
-
|
39
|
-
# @group Called on master
|
40
|
-
|
41
|
-
# Send work from the master server
|
42
|
-
# @return [Hash, false] either a spec what work to carry out or false
|
43
|
-
# when no work available
|
44
|
-
def get_work()
|
45
|
-
if cv = @started.index(false)
|
46
|
-
@started[cv] = true
|
47
|
-
{:cv => cv, :input => @data[cv], :dir => @dir, :options => Experiment::Config.to_hash }
|
48
|
-
else
|
49
|
-
false
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# returns true if all work has been disseminated
|
54
|
-
def distribution_done?
|
55
|
-
@started.all?
|
56
|
-
end
|
57
|
-
|
58
|
-
# Sends the result of the computation back to the master server.
|
59
|
-
# Called on the master server object.
|
60
|
-
def submit_result(cv, result, performance)
|
61
|
-
@completed[cv] = true
|
62
|
-
array_merge(@results, result)
|
63
|
-
@abm << performance
|
64
|
-
Notify.cv_done @experiment, cv
|
65
|
-
master_done! if @completed.all?
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
# Strats up the master server
|
71
|
-
def master_run!(cv)
|
72
|
-
|
73
|
-
@cvs = cv || 1
|
74
|
-
@results = {}
|
75
|
-
Notify.started @experiment
|
76
|
-
split_up_data
|
77
|
-
write_dir!
|
78
|
-
@completed = (1..@cvs).map {|a| false }
|
79
|
-
@started = @completed.dup
|
80
|
-
end
|
81
|
-
|
82
|
-
# Cleans up the master server after all work is done
|
83
|
-
def master_done!
|
84
|
-
@done = true
|
85
|
-
specification! true
|
86
|
-
summarize_performance!
|
87
|
-
summarize_results! @results
|
88
|
-
cleanup!
|
89
|
-
Notify.completed @experiment
|
90
|
-
|
91
|
-
#sleep 1
|
92
|
-
#DRb.stop_service
|
93
|
-
end
|
94
|
-
|
95
|
-
# @endgroup
|
96
|
-
|
97
|
-
end
|
98
|
-
end
|