binomial 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/Rakefile CHANGED
@@ -54,8 +54,8 @@ end
54
54
 
55
55
  desc "Generate SimpleCov test coverage and open in your browser"
56
56
  task :coverage do
57
- sh "rm -fr coverage"
58
- sh "ruby -e \"require 'simplecov'\; SimpleCov.start\" "
57
+ ENV['COVERAGE'] = 'true'
58
+ Rake::Task["spec"].execute
59
59
  sh "open coverage/index.html"
60
60
  end
61
61
 
@@ -83,7 +83,25 @@ end
83
83
  #
84
84
  #############################################################################
85
85
 
86
+ namespace :clean do
87
+ desc "Deletes the files generated by SimpleCov"
88
+ task :coverage do
89
+ sh "rm -rf coverage"
90
+ end
91
+
92
+ desc "Remove RDoc HTML files"
93
+ task :docs do
94
+ Rake::Task["clobber_rdoc"].invoke
95
+ end
96
+
97
+ desc "Delete all built versions of the gem"
98
+ task :built do
99
+ sh "rm -rf pkg"
100
+ end
101
+ end
86
102
 
103
+ desc "Delete SimpleCov reports, RDoc HTML and built versions"
104
+ task :clean => ["clean:coverage", "clean:docs", "clean:built"]
87
105
 
88
106
  #############################################################################
89
107
  #
data/binomial.gemspec CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'binomial'
16
- s.version = '0.1.1'
17
- s.date = '2012-12-01'
16
+ s.version = '0.1.2'
17
+ s.date = '2012-12-04'
18
18
  s.rubyforge_project = 'binomial'
19
19
 
20
20
  ## Make sure your summary is short. The description may be as long
@@ -54,6 +54,7 @@ Gem::Specification.new do |s|
54
54
  ## THE MANIFEST COMMENTS, they are used as delimiters by the task.
55
55
  # = MANIFEST =
56
56
  s.files = %w[
57
+ Gemfile
57
58
  LICENSE
58
59
  README.md
59
60
  Rakefile
@@ -63,10 +64,16 @@ Gem::Specification.new do |s|
63
64
  lib/binomial/cumulative_calculator.rb
64
65
  lib/binomial/integer.rb
65
66
  spec/calculator_spec.rb
67
+ spec/cumulative_calculator_spec.rb
68
+ spec/integer_spec.rb
69
+ spec/spec_helper.rb
66
70
  ]
67
71
  # = MANIFEST =
68
72
 
69
73
  ## Test files will be grabbed from the file list. Make sure the path glob
70
74
  ## matches what you actually use.
71
75
  s.test_files = s.files.select { |path| path =~ /^test\/test_.*\.rb/ }
76
+
77
+ s.add_development_dependency "rspec"
78
+ s.add_development_dependency "simplecov"
72
79
  end
data/lib/binomial.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'binomial/cumulative_calculator'
2
2
 
3
3
  module Binomial
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.2'
5
5
  end
@@ -12,25 +12,20 @@ module Binomial
12
12
  @probability = params[:probability]
13
13
  @target = params[:target]
14
14
 
15
- if @trials <= 0
16
- raise "Error: trials[#{@trials}] must be > 0"
17
- end
15
+ check_positive(:@trials)
16
+ check_positive(:@target)
17
+ check_positive(:@probability)
18
18
 
19
- if @target <= 0
20
- raise "Error: target[#{@target}] must be > 0"
21
- end
22
-
23
- if @probability <= 0
24
- raise "Error: probability[#{@probability}] must be > 0"
25
- end
26
-
27
- if @probability > 1
28
- raise "Error: probability[#{@probability}] must be <= 1"
29
- end
19
+ @probability <= 1 or raise "Error: probability[#{@probability}] must be <= 1"
20
+ @trials >= @target or raise "Error: target[#{@target}] must be < trials[#{@trials}]"
21
+ end
30
22
 
31
- if @trials < @target
32
- raise "Error: target[#{@target}] must be < trials[#{@trials}]"
33
- end
23
+ # param: name of instance variable WITH leading @
24
+ def check_positive(inst_var)
25
+ value = instance_variable_get(inst_var)
26
+ var_name = inst_var.to_s.delete('@')
27
+ value > 0 or
28
+ raise "Error: '#{var_name}' must be > 0, but was: #{value}"
34
29
  end
35
30
 
36
31
  def model
@@ -39,8 +34,7 @@ module Binomial
39
34
 
40
35
  # A representation of the equation performed
41
36
  def equation
42
- "P(X=#{@target}) = #{@trials}C#{@target} * #{@probability}^#{@target} *"
43
- + " #{1 - @probability}^#{@trials - @target} = #{calculate().to_s}"
37
+ "P(X=#{@target}) = #{@trials}C#{@target} * #{@probability}^#{@target} * #{1 - @probability}^#{@trials - @target} = #{calculate}"
44
38
  end
45
39
 
46
40
  # Calculates the result
@@ -26,13 +26,13 @@ module Binomial
26
26
  when :greater_than_or_equal_to
27
27
  1 - calc_cumulative(@target - 1)
28
28
  else
29
- p "Case not handled?!"
29
+ raise "Error: invalid sign '#{@sign.to_s}' supplied"
30
30
  end
31
31
  end
32
32
 
33
33
  def calc_cumulative(up_to)
34
34
  total = 0.0
35
- while up_to >= 0 do
35
+ while up_to > 0 do
36
36
  calc = Calculator.new trials: @trials, probability: @probability, target: up_to
37
37
  total += calc.calculate
38
38
  up_to -= 1
@@ -1,48 +1,39 @@
1
+ require 'spec_helper'
1
2
  require 'binomial'
2
3
 
3
4
  describe "Binomial::Calculator" do
4
5
  describe "calculate" do
6
+ def binom_calc(trials,prob,target)
7
+ Binomial::Calculator.new(
8
+ :trials => trials,
9
+ :probability => prob,
10
+ :target => target
11
+ )
12
+ end
13
+
5
14
  it "should validate probability is > 0" do
6
- expect {
7
- Binomial::Calculator.new(
8
- :trials => 10,
9
- :probability => 0,
10
- :target => 3
11
- ).calculate
12
- }.to raise_error
15
+ expect { binom_calc(10,0,3).calculate }.to raise_error
13
16
  end
14
17
 
15
18
  it "should validate probability is < 1" do
16
- expect {
17
- Binomial::Calculator.new(
18
- :trials => 10,
19
- :probability => 1.1,
20
- :target => 3
21
- ).calculate
22
- }.to raise_error
19
+ expect { binom_calc(10,1.1,3).calculate }.to raise_error
23
20
  end
24
21
 
25
22
  it "should succeed if probability is >0 and <1" do
26
- expect {
27
- Binomial::Calculator.new(
28
- :trials => 10,
29
- :probability => 0.2,
30
- :target => 3
31
- ).calculate
32
- }.to_not raise_error
23
+ expect { binom_calc(10, 0.2, 3).calculate }.to_not raise_error
33
24
  end
34
25
 
35
- it "should validate target < trials" do
26
+ it "should validate trial > 0" do
36
27
  expect {
37
28
  Binomial::Calculator.new(
38
- :trials => 10,
29
+ :trials => 0,
39
30
  :probability => 0.2,
40
- :target => 11
31
+ :target => 1
41
32
  ).calculate
42
33
  }.to raise_error
43
34
  end
44
35
 
45
- it "should succeed if target < trials" do
36
+ it "should succeed if trial > 0" do
46
37
  expect {
47
38
  Binomial::Calculator.new(
48
39
  :trials => 10,
@@ -52,24 +43,45 @@ describe "Binomial::Calculator" do
52
43
  }.to_not raise_error
53
44
  end
54
45
 
46
+ it "should validate target < trials" do
47
+ expect { binom_calc(10, 0.2, 11).calculate }.to raise_error
48
+ end
49
+
50
+ it "should succeed if target < trials" do
51
+ expect { binom_calc(10, 0.2, 3).calculate }.to_not raise_error
52
+ end
53
+
55
54
  it "should validate target > 0" do
55
+ expect { binom_calc(10, 0.2, 0).calculate }.to raise_error
56
+ end
57
+
58
+ it "should succeed if target > 0" do
59
+ expect { binom_calc(10, 0.2, 3).calculate }.to_not raise_error
60
+ end
61
+
62
+ it "should print out a representation of the equation performed" do
56
63
  expect {
57
64
  Binomial::Calculator.new(
58
- :trials => 10,
59
- :probability => 0.2,
60
- :target => 0
61
- ).calculate
62
- }.to raise_error
65
+ :trials => 2,
66
+ :probability => 0.5,
67
+ :target => 2
68
+ ).equation
69
+ }.to_not raise_error
63
70
  end
64
71
 
65
- it "should succeed if target > 0" do
72
+ it "should print out a representation of the model" do
66
73
  expect {
67
74
  Binomial::Calculator.new(
68
- :trials => 10,
69
- :probability => 0.2,
70
- :target => 3
71
- ).calculate
75
+ :trials => 2,
76
+ :probability => 0.5,
77
+ :target => 2
78
+ ).model
72
79
  }.to_not raise_error
73
80
  end
81
+
82
+ it "should produce the correct results" do
83
+ binom_calc(2,0.5,2).calculate.should == 0.25
84
+ binom_calc(2,0.5,1).calculate.should == 0.5
85
+ end
74
86
  end
75
87
  end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+ require 'binomial'
3
+
4
+ describe "Binomial::CumulativeCalculator" do
5
+ describe "calculate" do
6
+ def binom_calc(sign, trials, prob, target)
7
+ Binomial::CumulativeCalculator.new(
8
+ :sign => sign,
9
+ :trials => trials,
10
+ :probability => prob,
11
+ :target => target
12
+ )
13
+ end
14
+
15
+ it "should validate probability is > 0" do
16
+ expect {
17
+ binom_calc(:equals, 10, 0, 3).calculate
18
+ }.to raise_error
19
+ end
20
+
21
+ it "should validate probability is < 1" do
22
+ expect {
23
+ binom_calc(:equals, 10, 1.1, 3).calculate
24
+ }.to raise_error
25
+ end
26
+
27
+ it "should succeed if probability is >0 and <1" do
28
+ expect {
29
+ binom_calc(:equals, 10, 0.2, 3).calculate
30
+ }.to_not raise_error
31
+ end
32
+
33
+ it "should validate trial > 0" do
34
+ expect {
35
+ binom_calc(:equals, 0, 0.2, 1).calculate
36
+ }.to raise_error
37
+ end
38
+
39
+ it "should succeed if trial > 0" do
40
+ expect {
41
+ binom_calc(:equals, 10, 0.2, 3).calculate
42
+ }.to_not raise_error
43
+ end
44
+
45
+ it "should validate target < trials" do
46
+ expect {
47
+ binom_calc(:equals, 10, 0.2, 11).calculate
48
+ }.to raise_error
49
+ end
50
+
51
+ it "should succeed if target < trials" do
52
+ expect {
53
+ binom_calc(:equals, 10, 0.2, 3).calculate
54
+ }.to_not raise_error
55
+ end
56
+
57
+ it "should validate target > 0" do
58
+ expect {
59
+ binom_calc(:equals, 10, 0.2, 0).calculate
60
+ }.to raise_error
61
+ end
62
+
63
+ it "should succeed if target > 0" do
64
+ expect {
65
+ binom_calc(:equals, 10, 0.2, 3).calculate
66
+ }.to_not raise_error
67
+ end
68
+
69
+ it "should print out a representation of the equation performed" do
70
+ expect {
71
+ binom_calc(:equals, 2, 0.5, 2).equation
72
+ }.to_not raise_error
73
+ end
74
+
75
+ it "should print out a representation of the model" do
76
+ expect {
77
+ binom_calc(:equals, 2, 0.5, 2).model
78
+ }.to_not raise_error
79
+ end
80
+
81
+ it "should raise an exception when sign not recognized" do
82
+ expect {
83
+ binom_calc('=', 2, 0.5, 2).calculate
84
+ }.to raise_error
85
+ end
86
+
87
+ it "should produce the correct cumulative results" do
88
+ binom_calc(:equals, 2, 0.5, 2).calculate.should == 0.25
89
+ end
90
+
91
+ it "should produce the correct cumulative results with less_than" do
92
+ binom_calc(:less_than, 5, 0.5, 5).calculate.should == 0.9375
93
+ end
94
+
95
+ it "should produce the correct cumulative results with less_than_or_equal" do
96
+ binom_calc(:less_than_or_equal_to, 5, 0.5, 5).calculate.should == 0.96875
97
+ end
98
+
99
+ it "should produce the correct cumulative results with greater_than" do
100
+ binom_calc(:greater_than, 5, 0.5, 5).calculate.should == 0.03125
101
+ end
102
+
103
+ it "should produce the correct cumulative results with greater_than_or_equal" do
104
+ binom_calc(:greater_than_or_equal_to, 5, 0.5, 5).calculate.should == 0.0625
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'binomial'
3
+
4
+ describe "Integer" do
5
+ describe "#choose" do
6
+
7
+ it("should be correct when n is 0") { 0.choose(13).should == 0 }
8
+ it("should be correct when k is 0") { 5.choose(0).should == 1 }
9
+ it("should be correct when n and k are 0") { 0.choose(0).should == 1 }
10
+
11
+ it("should be correct when n is large") do
12
+ 59922092947261214857303164514091691.choose(7).should ==
13
+ 550399817117861542559553374183305880444453789686940825844792654274423774740226138320805430744153144877776025703863504009266563916236130288377323887215902973940458468633181977032752322590578526112480717050575426228710841090337272655324460690
14
+ end
15
+
16
+ it("should be correct when k is large") do
17
+ pending "algorithm is too slow"
18
+ 11.choose(314159)
19
+ .should == 0
20
+ end
21
+
22
+ it("should be correct when n and k are equal") do
23
+ 314.choose(314).should == 1
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,2 @@
1
+ require 'simplecov'
2
+ SimpleCov.start if ENV["COVERAGE"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binomial
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,40 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-01 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2012-12-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: simplecov
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
14
46
  description: A gem for calculating probabilities modelled by the binomial theorem.
15
47
  email: lewis.odriscoll@gmail.com
16
48
  executables: []
@@ -19,6 +51,7 @@ extra_rdoc_files:
19
51
  - README.md
20
52
  - LICENSE
21
53
  files:
54
+ - Gemfile
22
55
  - LICENSE
23
56
  - README.md
24
57
  - Rakefile
@@ -28,6 +61,9 @@ files:
28
61
  - lib/binomial/cumulative_calculator.rb
29
62
  - lib/binomial/integer.rb
30
63
  - spec/calculator_spec.rb
64
+ - spec/cumulative_calculator_spec.rb
65
+ - spec/integer_spec.rb
66
+ - spec/spec_helper.rb
31
67
  homepage: ''
32
68
  licenses: []
33
69
  post_install_message: