automatthew-stevedore 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +0 -0
- data/Rakefile +20 -0
- data/examples/data.yml +51 -0
- data/examples/instance_eval.rb +31 -0
- data/examples/stats_libs.rb +41 -0
- data/lib/stevedore.rb +11 -0
- data/lib/stevedore/class.rb +86 -0
- data/lib/stevedore/instance.rb +98 -0
- data/lib/stevedore/rsruby.rb +37 -0
- data/lib/stevedore/shell_r.rb +40 -0
- data/lib/stevedore/stats.rb +30 -0
- data/stevedore.gemspec +35 -0
- data/test/helper.rb +8 -0
- data/test/test_R.rb +62 -0
- data/test/test_sample.rb +27 -0
- metadata +89 -0
data/README
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
Version = '0.1.0'
|
4
|
+
|
5
|
+
task :default => [ :test ]
|
6
|
+
|
7
|
+
begin
|
8
|
+
gem 'echoe', '~>3.0'
|
9
|
+
require 'echoe'
|
10
|
+
Echoe.new('stevedore', Version) do |p|
|
11
|
+
p.project = 'stevedore'
|
12
|
+
p.summary = "Benchmarking with a whiff of statistical awareness"
|
13
|
+
p.author = "Matthew King"
|
14
|
+
p.email = "automatthew@gmail.com"
|
15
|
+
p.ignore_pattern = /^(\.git).+/
|
16
|
+
p.test_pattern = "test/*.rb"
|
17
|
+
end
|
18
|
+
rescue
|
19
|
+
"(ignored echoe gemification, as you don't have the Right Stuff)"
|
20
|
+
end
|
data/examples/data.yml
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
- 0.00554585456848145
|
3
|
+
- 0.010728120803833
|
4
|
+
- 0.00568890571594238
|
5
|
+
- 0.00575709342956543
|
6
|
+
- 0.00926589965820312
|
7
|
+
- 0.00586318969726562
|
8
|
+
- 0.00583505630493164
|
9
|
+
- 0.00585389137268066
|
10
|
+
- 0.00891590118408203
|
11
|
+
- 0.00550603866577148
|
12
|
+
- 0.00578689575195312
|
13
|
+
- 0.00865912437438965
|
14
|
+
- 0.00515890121459961
|
15
|
+
- 0.00583219528198242
|
16
|
+
- 0.00541400909423828
|
17
|
+
- 0.00829195976257324
|
18
|
+
- 0.00518512725830078
|
19
|
+
- 0.005615234375
|
20
|
+
- 0.00883793830871582
|
21
|
+
- 0.00561618804931641
|
22
|
+
- 0.00561308860778809
|
23
|
+
- 0.00577306747436523
|
24
|
+
- 0.00857686996459961
|
25
|
+
- 0.0057990550994873
|
26
|
+
- 0.00524306297302246
|
27
|
+
- 0.00851821899414062
|
28
|
+
- 0.00578618049621582
|
29
|
+
- 0.00547695159912109
|
30
|
+
- 0.00515198707580566
|
31
|
+
- 0.00598001480102539
|
32
|
+
- 0.00586414337158203
|
33
|
+
- 0.00577092170715332
|
34
|
+
- 0.0083918571472168
|
35
|
+
- 0.00514411926269531
|
36
|
+
- 0.0051429271697998
|
37
|
+
- 0.00795292854309082
|
38
|
+
- 0.00558185577392578
|
39
|
+
- 0.00593113899230957
|
40
|
+
- 0.00522780418395996
|
41
|
+
- 0.00866293907165527
|
42
|
+
- 0.00590395927429199
|
43
|
+
- 0.00517797470092773
|
44
|
+
- 0.00850200653076172
|
45
|
+
- 0.0058290958404541
|
46
|
+
- 0.00525999069213867
|
47
|
+
- 0.00512909889221191
|
48
|
+
- 0.00773906707763672
|
49
|
+
- 0.00583696365356445
|
50
|
+
- 0.00583600997924805
|
51
|
+
- 0.00795888900756836
|
@@ -0,0 +1,31 @@
|
|
1
|
+
%w{ rubygems }.each { |dep| require dep }
|
2
|
+
|
3
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib"
|
4
|
+
require 'stevedore'
|
5
|
+
|
6
|
+
thing = lambda { true }
|
7
|
+
n = 10000
|
8
|
+
|
9
|
+
one_eval = Stevedore.new "One instance eval with several block.call" do
|
10
|
+
|
11
|
+
measure do
|
12
|
+
instance_eval do
|
13
|
+
n.times { thing.call }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
multi_eval = Stevedore.new "instance_eval &block multiple times" do
|
20
|
+
|
21
|
+
measure do
|
22
|
+
n.times { instance_eval &thing }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
Stevedore.compare_instances(5, 10)
|
28
|
+
puts
|
29
|
+
puts
|
30
|
+
Stevedore.recommend_test_size(2, 4)
|
31
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
%w{ rubygems }.each { |dep| require dep }
|
2
|
+
require 'mathstats'
|
3
|
+
require 'rsruby'
|
4
|
+
|
5
|
+
$:.unshift "#{File.dirname(__FILE__)}/../lib"
|
6
|
+
require 'stevedore'
|
7
|
+
|
8
|
+
array = YAML.load_file("data.yml")
|
9
|
+
|
10
|
+
# rstats_sd = Stevedore.new "rstats standard deviation" do
|
11
|
+
#
|
12
|
+
# measure do
|
13
|
+
# array.standard_deviation
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# end
|
17
|
+
|
18
|
+
mathstats = Stevedore.new "mathstats standard deviation" do
|
19
|
+
|
20
|
+
measure do
|
21
|
+
Mathstats::Lib.standard_deviation(array)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
rsruby = Stevedore.new "rsruby standard deviation" do
|
27
|
+
|
28
|
+
before do
|
29
|
+
@r = RSRuby.instance
|
30
|
+
end
|
31
|
+
|
32
|
+
measure do
|
33
|
+
@r.sd(array)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
Stevedore.compare_instances(5, 10)
|
40
|
+
|
41
|
+
|
data/lib/stevedore.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
class Stevedore
|
2
|
+
|
3
|
+
def self.instances; @instances ||= []; end
|
4
|
+
|
5
|
+
def self.reset; @instances = []; end
|
6
|
+
|
7
|
+
|
8
|
+
# Moderately stringent defaults for power analysis
|
9
|
+
|
10
|
+
def self.power(val=nil)
|
11
|
+
val ? @power = val : @power ||= 0.9
|
12
|
+
end
|
13
|
+
def self.sig_level(val=nil)
|
14
|
+
val ? @sig_level = val : @sig_level ||= 0.01
|
15
|
+
end
|
16
|
+
def self.delta(val=nil)
|
17
|
+
val ? @delta = val : @delta ||= 0.001
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def self.before(&block)
|
22
|
+
block ? @before = block : @before
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.after(&block)
|
26
|
+
block ? @after = block : @after
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.before_sample(&block)
|
30
|
+
block ? @before_sample = block : @before_sample
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.after_sample(&block)
|
34
|
+
block ? @after_sample = block : @after_sample
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.before_measure(&block)
|
38
|
+
block ? @before_measure = block : @before_measure
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.after_measure(&block)
|
42
|
+
block ? @after_measure = block : @after_measure
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.compare_instances(run_count, sample_size)
|
46
|
+
puts "Measuring #{run_count} runs of #{sample_size} for each instance.\n\n"
|
47
|
+
@instances.each do |instance|
|
48
|
+
puts "'#{instance.name}'"
|
49
|
+
instance.go(run_count, sample_size)
|
50
|
+
end
|
51
|
+
name_size = @instances.map { |i| i.name.size }.max
|
52
|
+
puts "\n%-#{name_size}s %12s %12s %12s %12s %12s" % %w{ Name Mean Stddev Minimum Median Max }
|
53
|
+
puts "-" * (name_size + 5 * 13)
|
54
|
+
@instances.each do |instance|
|
55
|
+
puts "%-#{name_size}s %12f %12f %12f %12f %12f" %
|
56
|
+
[ instance.name, instance.mean, instance.standard_deviation, instance.min, instance.median, instance.max]
|
57
|
+
end
|
58
|
+
puts
|
59
|
+
end
|
60
|
+
|
61
|
+
# Run a small set of samples and use a power test to determine
|
62
|
+
# the optimal run count and sample size.
|
63
|
+
def self.recommend_test_size(run_count, sample_size)
|
64
|
+
puts "\nRunning trials (#{run_count} runs of #{sample_size}) for each instance.\n\n"
|
65
|
+
@instances.each do |instance|
|
66
|
+
print "'#{instance.name}'"
|
67
|
+
instance.go(run_count, sample_size)
|
68
|
+
puts " Mean: %6f" % instance.mean
|
69
|
+
puts " Stddev: %6f" % instance.standard_deviation
|
70
|
+
end
|
71
|
+
puts
|
72
|
+
worst = @instances.sort_by { |i| i.standard_deviation }.last
|
73
|
+
puts "'#{worst.name}' has the greatest standard deviation,"
|
74
|
+
puts "so we'll use it in the power test to determine optimal run size"
|
75
|
+
rec_size = optimal_n(worst.standard_deviation).to_i
|
76
|
+
rec_runs = optimal_n(worst.sample_means.standard_deviation).to_i
|
77
|
+
puts "Recommendation: #{rec_runs} sample runs of #{rec_size} measurements.\n\n"
|
78
|
+
[rec_runs, rec_size]
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.optimal_n(stddev);
|
82
|
+
args = { :power => power, :delta => delta, :sig_level => sig_level, :sd => stddev }
|
83
|
+
Stevedore::Stats.power_test(args)["n"].to_i
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
class Stevedore
|
2
|
+
|
3
|
+
attr_accessor :name, :description, :samples
|
4
|
+
|
5
|
+
def initialize(name, description='', &block)
|
6
|
+
klass = self.class
|
7
|
+
klass.instances << self
|
8
|
+
@before, @after = klass.before, klass.after
|
9
|
+
@before_measure, @after_measure = klass.before_measure, klass.after_measure
|
10
|
+
@before_sample, @after_sample = klass.before_sample, klass.after_sample
|
11
|
+
@name, @description = name, description
|
12
|
+
@samples = []
|
13
|
+
instance_eval( &block ) if block
|
14
|
+
end
|
15
|
+
|
16
|
+
def flattened_samples
|
17
|
+
@flat ||= @samples.flatten
|
18
|
+
end
|
19
|
+
|
20
|
+
def reset
|
21
|
+
@samples = []
|
22
|
+
@flattened_samples = []
|
23
|
+
end
|
24
|
+
|
25
|
+
# Blocks for setup and measurement
|
26
|
+
|
27
|
+
def before(&block); @before = block; end
|
28
|
+
|
29
|
+
def after(&block); @after = block; end
|
30
|
+
|
31
|
+
def before_sample(&block); @before_sample = block; end
|
32
|
+
|
33
|
+
def after_sample(&block); @after_sample = block; end
|
34
|
+
|
35
|
+
def before_measure(&block); @before_measure = block; end
|
36
|
+
|
37
|
+
def after_measure(&block); @after_measure = block; end
|
38
|
+
|
39
|
+
def measure(&block); @measure = block; end
|
40
|
+
|
41
|
+
def go(run_count, sample_size)
|
42
|
+
reset
|
43
|
+
instance_eval( &@before ) if @before
|
44
|
+
|
45
|
+
run_count.times do |i|
|
46
|
+
sample = []
|
47
|
+
instance_eval( &@before_sample ) if @before_sample
|
48
|
+
|
49
|
+
sample_size.times do
|
50
|
+
instance_eval( &@before_measure ) if @before_measure
|
51
|
+
sample << Benchmark.realtime do
|
52
|
+
instance_eval( &@measure )
|
53
|
+
end
|
54
|
+
instance_eval( &@after_measure ) if @after_measure
|
55
|
+
end
|
56
|
+
|
57
|
+
instance_eval( &@after_sample ) if @after_sample
|
58
|
+
@samples << sample
|
59
|
+
end
|
60
|
+
|
61
|
+
instance_eval( &@after ) if @after
|
62
|
+
end
|
63
|
+
|
64
|
+
def report
|
65
|
+
puts self.name
|
66
|
+
puts "#{run_count} sample runs, #{sample_size} measurements each"
|
67
|
+
puts " Mean: #{self.mean}"
|
68
|
+
puts " Standard deviation: #{self.standard_deviation}"
|
69
|
+
puts
|
70
|
+
end
|
71
|
+
|
72
|
+
def mean
|
73
|
+
self.flattened_samples.mean
|
74
|
+
end
|
75
|
+
|
76
|
+
def median
|
77
|
+
self.flattened_samples.median
|
78
|
+
end
|
79
|
+
|
80
|
+
def min
|
81
|
+
self.flattened_samples.min
|
82
|
+
end
|
83
|
+
|
84
|
+
def max
|
85
|
+
self.flattened_samples.max
|
86
|
+
end
|
87
|
+
|
88
|
+
def standard_deviation
|
89
|
+
self.flattened_samples.standard_deviation
|
90
|
+
end
|
91
|
+
|
92
|
+
def sample_means
|
93
|
+
@samples.map { |s| s.mean }
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rsruby'
|
2
|
+
class Stevedore
|
3
|
+
|
4
|
+
module RSRuby
|
5
|
+
|
6
|
+
def rsruby
|
7
|
+
@rsruby ||= ::RSRuby.instance
|
8
|
+
end
|
9
|
+
|
10
|
+
def mean
|
11
|
+
rsruby.mean(self)
|
12
|
+
end
|
13
|
+
|
14
|
+
def standard_deviation
|
15
|
+
rsruby.sd(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
def median
|
19
|
+
rsruby.median(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.rsruby
|
23
|
+
@rsruby ||= ::RSRuby.instance
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.power_test(args)
|
27
|
+
delta, power, sig_level, sd = args[:delta], args[:power], args[:sig_level], args[:sd]
|
28
|
+
if sd < 0.00007
|
29
|
+
warn "Stddev is very small, which makes power.t.test sad. \nSetting stddev to 0.00007 so we can get this done."
|
30
|
+
sd = 0.00007
|
31
|
+
end
|
32
|
+
rsruby.power_t_test( :delta => delta, :power => power, :sig_level => sig_level, :sd => sd)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class Stevedore
|
2
|
+
class ShellR
|
3
|
+
|
4
|
+
def self.path(val=nil)
|
5
|
+
val ? @path = val : @path ||= `which R`.chomp
|
6
|
+
end
|
7
|
+
|
8
|
+
def path
|
9
|
+
self.class.path
|
10
|
+
end
|
11
|
+
|
12
|
+
def command(expression)
|
13
|
+
%Q{#{path} --slave -e '#{expression}'}
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute(expression)
|
17
|
+
command = command(expression)
|
18
|
+
r = `#{command}`
|
19
|
+
end
|
20
|
+
|
21
|
+
def power_test(options)
|
22
|
+
power, delta, sig_level, sd = options[:power], options[:delta], options[:sig_level], options[:sd]
|
23
|
+
if options[:sd] < 0.00007
|
24
|
+
warn "Stddev is very small, which makes power.t.test sad. \nSetting stddev to 0.00007 so we can get this done."
|
25
|
+
options[:sd] = 0.00007
|
26
|
+
end
|
27
|
+
expression = %Q{power.t.test(power=#{power}, delta=#{delta}, sd=#{sd}, sig.level=#{sig_level})[]}
|
28
|
+
parse(execute(expression))
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse(r_output)
|
32
|
+
attrs = r_output.scan( /\$([\w\-\.]+)\s+\[\d+\]\s+([\d\.\-e\+]+)/m )
|
33
|
+
r = attrs.map { |k,v| [k, v.to_f] }.flatten
|
34
|
+
Hash[*r]
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Stevedore
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'stevedore/rsruby'
|
5
|
+
Stats = Stevedore::RSRuby
|
6
|
+
puts "Stevedore will use RSRuby"
|
7
|
+
rescue
|
8
|
+
require 'mathstats'
|
9
|
+
Stats = Mathstats
|
10
|
+
module Stats
|
11
|
+
unless defined?(median)
|
12
|
+
def median
|
13
|
+
sorted = self.sort; i = sorted.size % 2
|
14
|
+
case i
|
15
|
+
when 0 then sorted[i/2 - 1, 2].mean
|
16
|
+
when 1 then sorted[i/2].to_f
|
17
|
+
end if sorted.size > 0
|
18
|
+
end
|
19
|
+
end
|
20
|
+
def self.power_test(*args)
|
21
|
+
Stevedore::ShellR.new.power_test(*args)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
puts "Stevedore will use Mathstats"
|
25
|
+
end
|
26
|
+
|
27
|
+
Array.send :include, Stats
|
28
|
+
|
29
|
+
end
|
30
|
+
|
data/stevedore.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{stevedore}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Matthew King"]
|
9
|
+
s.date = %q{2009-01-01}
|
10
|
+
s.description = %q{Benchmarking with a whiff of statistical awareness}
|
11
|
+
s.email = %q{automatthew@gmail.com}
|
12
|
+
s.extra_rdoc_files = ["lib/stevedore/class.rb", "lib/stevedore/instance.rb", "lib/stevedore/rsruby.rb", "lib/stevedore/shell_r.rb", "lib/stevedore/stats.rb", "lib/stevedore.rb", "README"]
|
13
|
+
s.files = ["examples/data.yml", "examples/instance_eval.rb", "examples/stats_libs.rb", "lib/stevedore/class.rb", "lib/stevedore/instance.rb", "lib/stevedore/rsruby.rb", "lib/stevedore/shell_r.rb", "lib/stevedore/stats.rb", "lib/stevedore.rb", "Manifest", "Rakefile", "README", "stevedore.gemspec", "test/helper.rb", "test/test_R.rb", "test/test_sample.rb"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Stevedore", "--main", "README"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{stevedore}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{Benchmarking with a whiff of statistical awareness}
|
21
|
+
s.test_files = ["test/helper.rb", "test/test_R.rb", "test/test_sample.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 2
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_development_dependency(%q<echoe>, [">= 0"])
|
29
|
+
else
|
30
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
31
|
+
end
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
34
|
+
end
|
35
|
+
end
|
data/test/helper.rb
ADDED
data/test/test_R.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/helper.rb"
|
2
|
+
|
3
|
+
R = Stevedore::ShellR
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
describe "ShellR class" do
|
9
|
+
|
10
|
+
it "tries to find the path to R using `which`" do
|
11
|
+
File.exist?(R.path).should == true
|
12
|
+
end
|
13
|
+
|
14
|
+
it "allows you to set the path to R" do
|
15
|
+
R.path "/monkey"
|
16
|
+
R.path.should == "/monkey"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "An instance of ShellR" do
|
22
|
+
|
23
|
+
before do
|
24
|
+
@r = R.new
|
25
|
+
end
|
26
|
+
|
27
|
+
it "gets the path to R from the class" do
|
28
|
+
R.path "/junkie"
|
29
|
+
@r.path.should == "/junkie"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "properly constructs the shell command" do
|
33
|
+
@r.command("shines").should == "/junkie --slave -e 'shines'"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "can shell out to call R" do
|
37
|
+
R.path `which R`.chomp
|
38
|
+
expression = %Q{power.t.test(power=0.9, delta=0.0001, sd=0.001133, sig.level=0.01)["n"]}
|
39
|
+
res = @r.execute(expression)
|
40
|
+
res.should == "$n\n[1] 3821.76\n\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "can scan the R result when printed as list of attrs" do
|
44
|
+
output = <<-TXT
|
45
|
+
$n
|
46
|
+
[1] 3821.76
|
47
|
+
|
48
|
+
$delta
|
49
|
+
[1] 1e-04
|
50
|
+
|
51
|
+
TXT
|
52
|
+
@r.parse(output).should == { "n" => 3821.76, "delta" => 1e-04 }
|
53
|
+
end
|
54
|
+
|
55
|
+
it "has a power_test method" do
|
56
|
+
options = {:power => 0.9, :delta => 0.003, :sig_level => 0.01, :sd => 0.02}
|
57
|
+
res = @r.power_test(options)
|
58
|
+
res.keys.sort.should == ["delta", "n", "power", "sd", "sig.level"]
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
end
|
data/test/test_sample.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/helper.rb"
|
2
|
+
|
3
|
+
Sample = Stevedore::Sample
|
4
|
+
|
5
|
+
describe "Stevedore::Sample" do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@sample = Sample.new((1..40).to_a)
|
9
|
+
@nested_sample = Sample.new [@sample, @sample, @sample ]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "a flattened Sample is still a Sample" do
|
13
|
+
@nested_sample.flatten.class.should == Sample
|
14
|
+
[@nested_sample].flatten.class.should == Array
|
15
|
+
end
|
16
|
+
|
17
|
+
it "has a mean" do
|
18
|
+
@sample.mean.should == 20.5
|
19
|
+
@nested_sample.mean.should == 20.5
|
20
|
+
end
|
21
|
+
|
22
|
+
it "has a standard deviation" do
|
23
|
+
@sample.standard_deviation.to_i.should == 11
|
24
|
+
@nested_sample.standard_deviation.to_i.should == 11
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: automatthew-stevedore
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matthew King
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-01 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: echoe
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
version:
|
24
|
+
description: Benchmarking with a whiff of statistical awareness
|
25
|
+
email: automatthew@gmail.com
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files:
|
31
|
+
- lib/stevedore/class.rb
|
32
|
+
- lib/stevedore/instance.rb
|
33
|
+
- lib/stevedore/rsruby.rb
|
34
|
+
- lib/stevedore/shell_r.rb
|
35
|
+
- lib/stevedore/stats.rb
|
36
|
+
- lib/stevedore.rb
|
37
|
+
- README
|
38
|
+
files:
|
39
|
+
- examples/data.yml
|
40
|
+
- examples/instance_eval.rb
|
41
|
+
- examples/stats_libs.rb
|
42
|
+
- lib/stevedore/class.rb
|
43
|
+
- lib/stevedore/instance.rb
|
44
|
+
- lib/stevedore/rsruby.rb
|
45
|
+
- lib/stevedore/shell_r.rb
|
46
|
+
- lib/stevedore/stats.rb
|
47
|
+
- lib/stevedore.rb
|
48
|
+
- Manifest
|
49
|
+
- Rakefile
|
50
|
+
- README
|
51
|
+
- stevedore.gemspec
|
52
|
+
- test/helper.rb
|
53
|
+
- test/test_R.rb
|
54
|
+
- test/test_sample.rb
|
55
|
+
has_rdoc: true
|
56
|
+
homepage: ""
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options:
|
59
|
+
- --line-numbers
|
60
|
+
- --inline-source
|
61
|
+
- --title
|
62
|
+
- Stevedore
|
63
|
+
- --main
|
64
|
+
- README
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: "0"
|
72
|
+
version:
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: "1.2"
|
78
|
+
version:
|
79
|
+
requirements: []
|
80
|
+
|
81
|
+
rubyforge_project: stevedore
|
82
|
+
rubygems_version: 1.2.0
|
83
|
+
signing_key:
|
84
|
+
specification_version: 2
|
85
|
+
summary: Benchmarking with a whiff of statistical awareness
|
86
|
+
test_files:
|
87
|
+
- test/helper.rb
|
88
|
+
- test/test_R.rb
|
89
|
+
- test/test_sample.rb
|