bernoulli 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +2 -2
- data/bernoulli.gemspec +20 -19
- data/lib/bernoulli/math.rb +18 -18
- data/lib/bernoulli/version.rb +1 -1
- data/lib/bernoulli.rb +79 -80
- data/test/test_bernoulli.rb +54 -54
- data/test/test_math.rb +32 -32
- metadata +4 -4
data/Rakefile
CHANGED
@@ -8,13 +8,13 @@ end
|
|
8
8
|
|
9
9
|
desc 'Remove pkg directory'
|
10
10
|
task :clean do
|
11
|
-
|
11
|
+
rm_rf 'pkg/'
|
12
12
|
end
|
13
13
|
|
14
14
|
spec = eval File.read('bernoulli.gemspec')
|
15
15
|
|
16
16
|
desc "Remove and uninstall #{spec.name}-#{spec.version}.gem from system gems"
|
17
17
|
task :uninstall => :clean do
|
18
|
-
|
18
|
+
sh 'gem uninstall bernoulli'
|
19
19
|
end
|
20
20
|
|
data/bernoulli.gemspec
CHANGED
@@ -1,24 +1,25 @@
|
|
1
1
|
require File.expand_path('../lib/bernoulli/version', __FILE__)
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
4
|
+
|
5
|
+
spec.name = 'bernoulli'
|
6
|
+
spec.version = Bernoulli::VERSION
|
7
|
+
spec.summary = 'Binomial experiments library'
|
8
|
+
spec.description = 'A library that allows calculation of probibilities and properties of binomial experiments like coin tossing'
|
9
|
+
spec.homepage = 'http://mkonutgan.github.com/bernoulli'
|
10
|
+
|
11
|
+
spec.author = 'Mikael Konutgan'
|
12
|
+
spec.email = 'mkonutgan@shortmail.com'
|
13
|
+
|
14
|
+
spec.required_ruby_version = '>= 1.8.7'
|
15
|
+
spec.required_rubygems_version = '>= 1.3.6'
|
16
|
+
|
17
|
+
spec.files = `git ls-files`.split($\)
|
18
|
+
spec.test_files = spec.files.grep(/test/)
|
19
|
+
|
20
|
+
spec.add_development_dependency 'minitest', '~> 3.0.1'
|
21
|
+
spec.add_development_dependency 'rake', '~> 0.9.2.2'
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.1.4'
|
23
|
+
|
23
24
|
end
|
24
25
|
|
data/lib/bernoulli/math.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
module Math
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
3
|
+
def self.factorial(n)
|
4
|
+
|
5
|
+
if n < 0 or not n.is_a? Integer
|
6
|
+
raise Math::DomainError, 'Numerical argument is out of domain - "factorial"'
|
7
|
+
end
|
8
|
+
if n == 0
|
9
|
+
1
|
10
|
+
else
|
11
|
+
(1..n).inject(:*)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.binomial(n, k)
|
16
|
+
if n < 0 or n < k or not (n.is_a? Integer and k.is_a? Integer)
|
17
|
+
raise Math::DomainError, 'Numerical argument is out of domain - "binomial"'
|
18
|
+
end
|
19
|
+
factorial(n)/(factorial(k) * factorial(n - k))
|
20
|
+
end
|
21
21
|
|
22
22
|
end
|
23
23
|
|
data/lib/bernoulli/version.rb
CHANGED
data/lib/bernoulli.rb
CHANGED
@@ -1,86 +1,85 @@
|
|
1
1
|
require 'bernoulli/math'
|
2
2
|
require 'bernoulli/version'
|
3
|
-
require 'csv'
|
4
3
|
|
5
4
|
module Bernoulli
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
5
|
+
class Distribution
|
6
|
+
|
7
|
+
def initialize(n, p)
|
8
|
+
if n < 0 or p > 1.0 or p < 0.0 or not n.is_a? Integer
|
9
|
+
raise 'Could not initialize Bernoulli experiment'
|
10
|
+
end
|
11
|
+
@n = n
|
12
|
+
@p = p
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"#<Bernoulli::Distribution @n=#@n, @p=#@p>"
|
17
|
+
end
|
18
|
+
|
19
|
+
def probability(k)
|
20
|
+
Math.binomial(@n, k) * @p**k * (1 - @p)**(@n - k)
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](k)
|
24
|
+
if k.is_a? Integer
|
25
|
+
raise Math::DomainError if not (k <= @n and k >= 0)
|
26
|
+
probability(k).to_f
|
27
|
+
elsif k.is_a? Range
|
28
|
+
raise Math::DomainError if not (k.begin >= 0 and k.end <= @n)
|
29
|
+
sum = 0
|
30
|
+
k.each do |i|
|
31
|
+
sum += probability(i)
|
32
|
+
end
|
33
|
+
sum.to_f
|
34
|
+
else
|
35
|
+
raise TypeError
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def sample
|
40
|
+
s = []
|
41
|
+
@n.times do
|
42
|
+
s << (rand < @p ? 1 : 0)
|
43
|
+
end
|
44
|
+
s
|
45
|
+
end
|
46
|
+
|
47
|
+
def sample_value
|
48
|
+
sample.count(1)
|
49
|
+
end
|
50
|
+
alias :sv :sample_value
|
51
|
+
|
52
|
+
def expected_value
|
53
|
+
@n * @p
|
54
|
+
end
|
55
|
+
alias :ev :expected_value
|
56
|
+
|
57
|
+
def variance
|
58
|
+
@n * @p * (1 - @p)
|
59
|
+
end
|
60
|
+
alias :v :variance
|
61
|
+
|
62
|
+
def standard_deviation
|
63
|
+
Math.sqrt(variance)
|
64
|
+
end
|
65
|
+
alias :sd :standard_deviation
|
66
|
+
|
67
|
+
def skewness
|
68
|
+
(1 - 2 * @p) / (Math.sqrt(@n * @p * (1 - @p)))
|
69
|
+
end
|
70
|
+
|
71
|
+
def excess
|
72
|
+
(1 - 6 * @p * (1 - @p)) / (@n * @p * (1 - @p))
|
73
|
+
end
|
74
|
+
|
75
|
+
def table
|
76
|
+
csv = ""
|
77
|
+
(0..@n).each do |n|
|
78
|
+
csv << n.to_s << "," << probability(n).to_s << "\n"
|
79
|
+
end
|
80
|
+
csv
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
85
84
|
end
|
86
85
|
|
data/test/test_bernoulli.rb
CHANGED
@@ -3,59 +3,59 @@ require 'minitest/pride'
|
|
3
3
|
require 'bernoulli'
|
4
4
|
|
5
5
|
class DistributionTest < MiniTest::Unit::TestCase
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
6
|
+
|
7
|
+
def test_new_experiment
|
8
|
+
assert_raises RuntimeError do
|
9
|
+
Bernoulli::Distribution.new(10, 1.1)
|
10
|
+
end
|
11
|
+
assert_raises RuntimeError do
|
12
|
+
Bernoulli::Distribution.new(-10, 0.7)
|
13
|
+
end
|
14
|
+
assert_raises RuntimeError do
|
15
|
+
Bernoulli::Distribution.new(4.5, 0.2)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def setup
|
20
|
+
@x = Bernoulli::Distribution.new(180, 1.0/6)
|
21
|
+
@y = Bernoulli::Distribution.new(2, 0.5)
|
22
|
+
@z = Bernoulli::Distribution.new(4, 0.5)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_to_s
|
26
|
+
assert_equal "#<Bernoulli::Distribution @n=2, @p=0.5>", @y.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_coin_toss
|
30
|
+
assert_equal 0.5, @y[1]
|
31
|
+
assert_equal 0.25, @y[2]
|
32
|
+
assert_equal 1.0, @y[0..2]
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_expected_value
|
36
|
+
assert_equal 30, @x.expected_value
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_variance
|
40
|
+
assert_equal 25, @x.variance
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_standard_deviation
|
44
|
+
assert_equal 5, @x.standard_deviation
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_skewness
|
48
|
+
assert_in_delta 0.1333333333333333, @x.skewness, 1.0e-7
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_excess
|
52
|
+
assert_in_delta 0.0066666666666667, @x.excess, 1.0e-7
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_table
|
56
|
+
str = "0,0.0625\n1,0.25\n2,0.375\n3,0.25\n4,0.0625\n"
|
57
|
+
assert_equal str, @z.table
|
58
|
+
end
|
59
|
+
|
60
60
|
end
|
61
61
|
|
data/test/test_math.rb
CHANGED
@@ -3,37 +3,37 @@ require 'minitest/pride'
|
|
3
3
|
require 'bernoulli'
|
4
4
|
|
5
5
|
class MathTest < MiniTest::Unit::TestCase
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
6
|
+
|
7
|
+
def test_factorial
|
8
|
+
assert_raises(Math::DomainError) { Math.factorial(-1) }
|
9
|
+
assert_raises(Math::DomainError) { Math.factorial(2.4) }
|
10
|
+
assert_equal 1, Math.factorial(0)
|
11
|
+
assert_equal 1, Math.factorial(1)
|
12
|
+
assert_equal 120, Math.factorial(5)
|
13
|
+
assert_equal 263130836933693530167218012160000000, Math.factorial(32)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_binomial
|
17
|
+
pairs = [[-1, 0], [2, 4], [-2, -1], [1.2, 3.4], [12, 50]]
|
18
|
+
pairs.each do |pair|
|
19
|
+
assert_raises Math::DomainError do
|
20
|
+
Math.binomial *pair
|
21
|
+
end
|
22
|
+
end
|
23
|
+
assert_equal 1, Math.binomial(0, 0)
|
24
|
+
(1..20).each do |k|
|
25
|
+
assert_equal 1, Math.binomial(k, 0)
|
26
|
+
assert_equal 1, Math.binomial(k, k)
|
27
|
+
assert_equal k, Math.binomial(k, 1)
|
28
|
+
assert_equal k, Math.binomial(k, k - 1)
|
29
|
+
end
|
30
|
+
(15..20).each do |n|
|
31
|
+
(5..15).each do |k|
|
32
|
+
assert_equal Math.binomial(n, k), Math.binomial(n, n - k)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
assert_equal 100947, Math.binomial(23, 17)
|
36
|
+
end
|
37
|
+
|
38
38
|
end
|
39
39
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bernoulli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
@@ -86,13 +86,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
87
87
|
- - ! '>='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.
|
89
|
+
version: 1.8.7
|
90
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
91
|
none: false
|
92
92
|
requirements:
|
93
93
|
- - ! '>='
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
95
|
+
version: 1.3.6
|
96
96
|
requirements: []
|
97
97
|
rubyforge_project:
|
98
98
|
rubygems_version: 1.8.24
|