binomial_distribution 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6622daa3e81337424a264d794ab0cf6f7c86c375
4
+ data.tar.gz: 725288b83c2568b74a45ad7391aa813e3c3e222c
5
+ SHA512:
6
+ metadata.gz: d472d9760571bd9bb1cc2ec21b7d23d485406e67efa3afcdb57e203c3974cc32b7c813027e137bf724c6b9d769fa7896fd6bbd46cb6d9acdb84f045591208ce5
7
+ data.tar.gz: e853d80ff48ffea3dee69b5f8b46ecc814f4ad626b3090144a2c2ab6e5ab8c53ac012bdb55c5d02f57460b44376ab89460735e9001d8d2fb0fc78bd167cca9cc
checksums.yaml.gz.sig ADDED
@@ -0,0 +1,3 @@
1
+ T�+=M9R�W8���{h�5�>�{$�X�ܗ��1]�����P���T�d@�R��LC�7��-�R��!Y��e�
2
+ P聐2L�䘜q����)
3
+ L{QM!�y:\@��n�m.��vI1��e��g������핇�S)����:� �v���-؅I���^�AXj
data.tar.gz.sig ADDED
Binary file
data/CHANGELOG ADDED
@@ -0,0 +1,5 @@
1
+ v0.1.1
2
+ * Initialize the project
3
+ * Add tests
4
+ * Improve names
5
+ * Fix few bugs
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'nomorebeer' # action against drunk driving
4
+
data/Gemfile.lock ADDED
@@ -0,0 +1,13 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ nomorebeer (1.1)
5
+
6
+ PLATFORMS
7
+ ruby
8
+
9
+ DEPENDENCIES
10
+ nomorebeer
11
+
12
+ BUNDLED WITH
13
+ 1.11.2
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # A ruby implementation of the Binomial Distribution
2
+
3
+ ## Installation
4
+
5
+ ```sh
6
+ gem install binomial_distribution
7
+ ```
8
+
9
+ or in the ``Gemfile``
10
+
11
+ ```ruby
12
+ gem 'binomial_distribution'
13
+ ```
14
+
15
+
16
+ ## Usage in Ruby
17
+
18
+ ```ruby
19
+ require 'binomial_distribution'
20
+
21
+ Math.binomial_distribution(tries: 1, probability: 0.4, success: 1) # => 0.4
22
+ ```
23
+
24
+
25
+ ## Unitary tests
26
+
27
+ ```sh
28
+ rake test
29
+ ```
30
+
31
+
32
+ ## Contributes !
33
+
34
+ Find a bug ? Want a new feature ?
35
+ Create a clear pull request and we'll see :)
36
+
37
+ - Nephos (poulet_a)
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ #encoding: utf-8
2
+
3
+ task :default => [:test]
4
+
5
+ task :test do
6
+ ruby "test/unit_test.rb"
7
+ end
8
+
9
+ namespace :test do
10
+
11
+ desc "Unitary tests."
12
+ task :test do
13
+ ruby "test/unit_test.rb"
14
+ end
15
+
16
+ end
@@ -0,0 +1,37 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'binomial_distribution'
3
+ s.version = File.read("version")
4
+ s.date = Time.now.getgm.to_s.split.first
5
+ s.summary = File.read("CHANGELOG").match(/^v[^\n]+\n((\t[^\n]+\n)+)/m)[1].split("\t").join
6
+ s.description = 'A ruby implementation of the Binomial Distribution'
7
+ s.authors = ['Nephos (poulet_a)']
8
+ s.email = ['arthur.poulet@mailoo.org']
9
+ s.files = %w(
10
+ lib/binomial_distribution.rb
11
+
12
+ README.md
13
+ CHANGELOG
14
+
15
+ Rakefile
16
+ Gemfile
17
+ Gemfile.lock
18
+ binomial_distribution.gemspec
19
+ version
20
+
21
+ test/unit_test.rb
22
+ test/binomial_distribution.rb
23
+
24
+ certs/nephos.pem
25
+ )
26
+ s.executables = %w(
27
+ )
28
+ s.homepage = 'https://github.com/Nephos/BinomialDistribution'
29
+ s.license = 'WTFPL'
30
+
31
+ s.cert_chain = ['certs/nephos.pem']
32
+ s.signing_key = File.expand_path('~/.ssh/gem-private_key.pem') if $0 =~ /gem\z/
33
+
34
+ # s.add_dependency 'nephos', '~> 1.0'
35
+ s.add_dependency 'nomorebeer', '~> 1.1'
36
+
37
+ end
data/certs/nephos.pem ADDED
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRYwFAYDVQQDDA1hcnRo
3
+ dXIucG91bGV0MRkwFwYKCZImiZPyLGQBGRYJY3J5cHRvbGFiMRMwEQYKCZImiZPy
4
+ LGQBGRYDbmV0MB4XDTE1MTAwMzIxNTQyMFoXDTE2MTAwMjIxNTQyMFowSDEWMBQG
5
+ A1UEAwwNYXJ0aHVyLnBvdWxldDEZMBcGCgmSJomT8ixkARkWCWNyeXB0b2xhYjET
6
+ MBEGCgmSJomT8ixkARkWA25ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
7
+ ggEBANnLB9vH7/O0aUWi0f9VtC7F73zMC1OvxDaJq+qIcmGBFiKPOngDCRyKffWf
8
+ A6gyf7VsJAlDVFYoyNw7bzLFjBT9gkb5xmED3Uaxvt8Ax131YvKv0sTsQeiTVHHW
9
+ 1crq7266hW1McrFU2A1uQRV8FHuruUJBuP7UUYK7fZi0barbkdAIb4VvQFZxXByI
10
+ lKdQSuhu8k0RcG1vTACEsQXJIUImc8CWMi8/TG3HidJdASMvIWtV2rNQXlQ+UgIc
11
+ UeHC0p+SNTrc09H6q+5eH8NRYhJ91xKuLXv7NNy8M3quAMHcQ1GM6DWljc+Jc4cm
12
+ uAPQMYJf7Vy6OzWLoEiv2QU6sE0CAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
13
+ DwQEAwIEsDAdBgNVHQ4EFgQU08cDEZOTZNjP/0+E2unJWyw4NzQwJgYDVR0RBB8w
14
+ HYEbYXJ0aHVyLnBvdWxldEBjcnlwdG9sYWIubmV0MCYGA1UdEgQfMB2BG2FydGh1
15
+ ci5wb3VsZXRAY3J5cHRvbGFiLm5ldDANBgkqhkiG9w0BAQUFAAOCAQEAo60BuRZM
16
+ 5Vtn0H0kHHTPiXz09lwxx4cFpTqrTTM0T6qM3gKsR5eLyR1Rt5hGmYLPgY4ZW4zI
17
+ XcuDbgRJrczZs7AZNy5NXyVWpxCwkZzklpbGTuYQdFz7mKfVyALjLjrilOIktXcz
18
+ PvB7EoLlqYvq9cnwV3WE1MkRcBd07xpofcp0kxae2dCOZPUq24TcNaRe7Utw6jjA
19
+ iL0bcH7zZkzMsNoNpPAgsd3ovU4Mf9M+A3M8COmd7KzKyZ0k7P12u5InPWUsNQS2
20
+ tcYkgfqUJPitIJx1RvWZpIyH5uJhRUYK3+vU9nMOxez5WbIlC1TtpByKAPMX+sht
21
+ gib3AoIT8jh/2w==
22
+ -----END CERTIFICATE-----
@@ -0,0 +1,83 @@
1
+ module Math
2
+
3
+ def self.factorial(n)
4
+ raise ArgumentError, 'The argument muse be a natural Fixnum N' if not n.is_a? Fixnum
5
+ raise Math::DomainError, 'The argument must be a natural (out of domain -- factorial)' if n < 0
6
+ return 1 if n.zero?
7
+ return (1..n).inject(:*)
8
+ end unless self.method_defined? :factorial
9
+
10
+ def self.coef_binomial(n, k)
11
+ return 0 if n < 0 or k < 0 or n < k
12
+ return factorial(n) / (factorial(k) * factorial(n - k))
13
+ end
14
+
15
+ # @note if no named parameters are used, then it will try to use the unamed parameters (tries, success, probability)
16
+ def self.binomial_distribution(*unamed, tries: nil, success: nil, probability: nil)
17
+ unamed.reverse! # pop works on a stack
18
+ Binomial.new(tries: tries || unamed.pop, probability: probability || unamed.pop).distribute(success || unamed.pop)
19
+ end
20
+
21
+ class SuperiorityError < Exception; end
22
+ end
23
+
24
+ class Array
25
+ def second
26
+ self[1]
27
+ end unless self.method_defined? :second
28
+ end
29
+
30
+ class Binomial
31
+
32
+ # @param n [Fixnum] number of tries
33
+ # @param p [Float] probability of success
34
+ # @param tries [Fixnum] alias for n
35
+ # @param probability [Float] alias for p
36
+ # @param failure [Float] alias for `p = 1 - failure`
37
+ # @note if no probability is defined, the default value will be 0.5
38
+ def initialize n: nil, p: nil, tries: nil, probability: nil, failure: nil
39
+ tries_count = n || tries
40
+ probability = p || probability || (failure && 1.0 - failure) || 0.5
41
+ raise ArgumentError, "The argument `n` `#{tries_count}` is not an Integer" unless tries_count.is_a? Integer
42
+ raise ArgumentError, "The argument `p` `#{probability}` is not a Numeric" unless probability.is_a? Numeric
43
+ tries_count = Float(tries_count)
44
+ raise Math::DomainError, "The argument `n` `#{tries_count}` is not in greater or equal to 0" if tries_count < 0.0
45
+ raise Math::DomainError, "The argument `p` `#{probability}` is not in greater or equal to 0" if probability < 0.0
46
+ raise Math::DomainError, "The argument `p` `#{probability}` is not in lesser or equal to 1" if probability > 1.0
47
+ @n = tries_count.to_i
48
+ @p = probability.to_f
49
+ end
50
+
51
+ def to_s
52
+ "#<#{self.class} @n=#@n, @p=#@p>"
53
+ end
54
+
55
+ # @param k [Fixnum] number of test successful.
56
+ # @param k [Enumerable] list of number of test successful.
57
+ # @return [Float] probability
58
+ def distribute k
59
+ if k.is_a? Enumerable
60
+ distribute_enumerable k
61
+ elsif k.is_a? Integer
62
+ distribute_integer k
63
+ else
64
+ raise ArgumentError
65
+ end
66
+ end
67
+
68
+ private def distribute_enumerable k
69
+ k.map{|p| calc(p) }.inject(&:+)
70
+ end
71
+
72
+ private def distribute_integer k
73
+ raise Math::SuperiorityError, "the number of success must be lesser or equal to the number of tries (#{@n})" if k > @n
74
+ Math.coef_binomial(@n, k) * @p**k * (1 - @p) ** (@n - k)
75
+ end
76
+
77
+ end
78
+
79
+ #
80
+ # if __FILE__ == $0
81
+ # require 'pry'
82
+ # binding.pry
83
+ # end
@@ -0,0 +1,20 @@
1
+ class TestBinomialDistribution < Test::Unit::TestCase
2
+
3
+ def test_simple
4
+ 0.0.step(by: 0.1, to: 1.0) do |proba|
5
+ assert_equal proba, Math.binomial_distribution(tries: 1, probability: proba, success: 1)
6
+ end
7
+ end
8
+
9
+ def test_nonamed_arguments
10
+ assert_equal 0.4, Math.binomial_distribution(tries: 1, probability: 0.4, success: 1)
11
+ assert_equal 0.4, Math.binomial_distribution(1, probability: 0.4, success: 1)
12
+ assert_equal 0.4, Math.binomial_distribution(1, tries: 1, probability: 0.4)
13
+ assert_equal 0.4, Math.binomial_distribution(0.4, tries: 1, success: 1)
14
+ assert_equal 0.4, Math.binomial_distribution(1, 0.4, success: 1)
15
+ assert_equal 0.4, Math.binomial_distribution(0.4, 1, tries: 1)
16
+ assert_equal 0.4, Math.binomial_distribution(1, 0.4, 1)
17
+ assert_equal 0.4, Math.binomial_distribution(1, 1, probability: 0.4)
18
+ end
19
+
20
+ end
data/test/unit_test.rb ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "test/unit"
4
+
5
+ require_relative '../lib/binomial_distribution'
6
+
7
+ require_relative 'binomial_distribution'
data/version ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: binomial_distribution
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Nephos (poulet_a)
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRYwFAYDVQQDDA1hcnRo
14
+ dXIucG91bGV0MRkwFwYKCZImiZPyLGQBGRYJY3J5cHRvbGFiMRMwEQYKCZImiZPy
15
+ LGQBGRYDbmV0MB4XDTE1MTAwMzIxNTQyMFoXDTE2MTAwMjIxNTQyMFowSDEWMBQG
16
+ A1UEAwwNYXJ0aHVyLnBvdWxldDEZMBcGCgmSJomT8ixkARkWCWNyeXB0b2xhYjET
17
+ MBEGCgmSJomT8ixkARkWA25ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
+ ggEBANnLB9vH7/O0aUWi0f9VtC7F73zMC1OvxDaJq+qIcmGBFiKPOngDCRyKffWf
19
+ A6gyf7VsJAlDVFYoyNw7bzLFjBT9gkb5xmED3Uaxvt8Ax131YvKv0sTsQeiTVHHW
20
+ 1crq7266hW1McrFU2A1uQRV8FHuruUJBuP7UUYK7fZi0barbkdAIb4VvQFZxXByI
21
+ lKdQSuhu8k0RcG1vTACEsQXJIUImc8CWMi8/TG3HidJdASMvIWtV2rNQXlQ+UgIc
22
+ UeHC0p+SNTrc09H6q+5eH8NRYhJ91xKuLXv7NNy8M3quAMHcQ1GM6DWljc+Jc4cm
23
+ uAPQMYJf7Vy6OzWLoEiv2QU6sE0CAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
+ DwQEAwIEsDAdBgNVHQ4EFgQU08cDEZOTZNjP/0+E2unJWyw4NzQwJgYDVR0RBB8w
25
+ HYEbYXJ0aHVyLnBvdWxldEBjcnlwdG9sYWIubmV0MCYGA1UdEgQfMB2BG2FydGh1
26
+ ci5wb3VsZXRAY3J5cHRvbGFiLm5ldDANBgkqhkiG9w0BAQUFAAOCAQEAo60BuRZM
27
+ 5Vtn0H0kHHTPiXz09lwxx4cFpTqrTTM0T6qM3gKsR5eLyR1Rt5hGmYLPgY4ZW4zI
28
+ XcuDbgRJrczZs7AZNy5NXyVWpxCwkZzklpbGTuYQdFz7mKfVyALjLjrilOIktXcz
29
+ PvB7EoLlqYvq9cnwV3WE1MkRcBd07xpofcp0kxae2dCOZPUq24TcNaRe7Utw6jjA
30
+ iL0bcH7zZkzMsNoNpPAgsd3ovU4Mf9M+A3M8COmd7KzKyZ0k7P12u5InPWUsNQS2
31
+ tcYkgfqUJPitIJx1RvWZpIyH5uJhRUYK3+vU9nMOxez5WbIlC1TtpByKAPMX+sht
32
+ gib3AoIT8jh/2w==
33
+ -----END CERTIFICATE-----
34
+ date: 2016-05-05 00:00:00.000000000 Z
35
+ dependencies:
36
+ - !ruby/object:Gem::Dependency
37
+ name: nomorebeer
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.1'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.1'
50
+ description: A ruby implementation of the Binomial Distribution
51
+ email:
52
+ - arthur.poulet@mailoo.org
53
+ executables: []
54
+ extensions: []
55
+ extra_rdoc_files: []
56
+ files:
57
+ - CHANGELOG
58
+ - Gemfile
59
+ - Gemfile.lock
60
+ - README.md
61
+ - Rakefile
62
+ - binomial_distribution.gemspec
63
+ - certs/nephos.pem
64
+ - lib/binomial_distribution.rb
65
+ - test/binomial_distribution.rb
66
+ - test/unit_test.rb
67
+ - version
68
+ homepage: https://github.com/Nephos/BinomialDistribution
69
+ licenses:
70
+ - WTFPL
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.5.1
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: "* Initialize the project"
92
+ test_files: []
93
+ has_rdoc:
metadata.gz.sig ADDED
Binary file