distribution 0.7.3 → 0.8.0

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.
Files changed (100) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +4 -6
  3. data/.yardopts +5 -0
  4. data/History.txt +3 -0
  5. data/README.md +87 -44
  6. data/benchmark/binomial_coefficient.rb +19 -23
  7. data/benchmark/binomial_coefficient/experiment.rb +33 -36
  8. data/benchmark/factorial_hash.rb +7 -8
  9. data/benchmark/factorial_method.rb +4 -6
  10. data/benchmark/odd.rb +6 -7
  11. data/benchmark/power.rb +11 -11
  12. data/bin/distribution +26 -26
  13. data/distribution.gemspec +3 -4
  14. data/lib/distribution.rb +55 -96
  15. data/lib/distribution/beta/gsl.rb +10 -5
  16. data/lib/distribution/beta/ruby.rb +3 -1
  17. data/lib/distribution/binomial/ruby.rb +5 -2
  18. data/lib/distribution/bivariatenormal.rb +4 -5
  19. data/lib/distribution/bivariatenormal/gsl.rb +2 -2
  20. data/lib/distribution/bivariatenormal/java.rb +1 -1
  21. data/lib/distribution/bivariatenormal/ruby.rb +245 -254
  22. data/lib/distribution/chisquare.rb +8 -10
  23. data/lib/distribution/chisquare/gsl.rb +24 -19
  24. data/lib/distribution/chisquare/java.rb +1 -1
  25. data/lib/distribution/chisquare/ruby.rb +25 -25
  26. data/lib/distribution/chisquare/statistics2.rb +16 -13
  27. data/lib/distribution/distributable.rb +40 -0
  28. data/lib/distribution/exponential.rb +4 -5
  29. data/lib/distribution/exponential/gsl.rb +13 -9
  30. data/lib/distribution/exponential/ruby.rb +14 -9
  31. data/lib/distribution/f.rb +1 -1
  32. data/lib/distribution/f/gsl.rb +26 -22
  33. data/lib/distribution/f/java.rb +1 -1
  34. data/lib/distribution/f/ruby.rb +16 -19
  35. data/lib/distribution/f/statistics2.rb +22 -19
  36. data/lib/distribution/gamma.rb +5 -7
  37. data/lib/distribution/gamma/gsl.rb +13 -9
  38. data/lib/distribution/gamma/java.rb +1 -1
  39. data/lib/distribution/gamma/ruby.rb +5 -11
  40. data/lib/distribution/hypergeometric.rb +5 -8
  41. data/lib/distribution/hypergeometric/gsl.rb +4 -5
  42. data/lib/distribution/hypergeometric/java.rb +1 -1
  43. data/lib/distribution/hypergeometric/ruby.rb +34 -35
  44. data/lib/distribution/logistic.rb +5 -8
  45. data/lib/distribution/logistic/ruby.rb +13 -8
  46. data/lib/distribution/lognormal.rb +5 -7
  47. data/lib/distribution/lognormal/gsl.rb +8 -6
  48. data/lib/distribution/lognormal/ruby.rb +5 -9
  49. data/lib/distribution/math_extension.rb +6 -15
  50. data/lib/distribution/math_extension/chebyshev_series.rb +281 -272
  51. data/lib/distribution/math_extension/erfc.rb +26 -29
  52. data/lib/distribution/math_extension/exponential_integral.rb +17 -17
  53. data/lib/distribution/math_extension/gammastar.rb +19 -20
  54. data/lib/distribution/math_extension/gsl_utilities.rb +12 -12
  55. data/lib/distribution/math_extension/incomplete_beta.rb +52 -61
  56. data/lib/distribution/math_extension/incomplete_gamma.rb +166 -168
  57. data/lib/distribution/math_extension/log_utilities.rb +20 -22
  58. data/lib/distribution/normal.rb +11 -13
  59. data/lib/distribution/normal/gsl.rb +13 -10
  60. data/lib/distribution/normal/java.rb +14 -13
  61. data/lib/distribution/normal/ruby.rb +68 -58
  62. data/lib/distribution/normal/statistics2.rb +5 -2
  63. data/lib/distribution/normalmultivariate.rb +64 -64
  64. data/lib/distribution/poisson.rb +11 -13
  65. data/lib/distribution/poisson/gsl.rb +7 -7
  66. data/lib/distribution/poisson/java.rb +19 -24
  67. data/lib/distribution/poisson/ruby.rb +38 -9
  68. data/lib/distribution/shorthand.rb +17 -0
  69. data/lib/distribution/t.rb +13 -15
  70. data/lib/distribution/t/gsl.rb +27 -24
  71. data/lib/distribution/t/java.rb +1 -1
  72. data/lib/distribution/t/ruby.rb +99 -100
  73. data/lib/distribution/t/statistics2.rb +19 -19
  74. data/lib/distribution/uniform.rb +26 -0
  75. data/lib/distribution/uniform/gsl.rb +36 -0
  76. data/lib/distribution/uniform/ruby.rb +91 -0
  77. data/lib/distribution/version.rb +1 -1
  78. data/lib/distribution/weibull.rb +6 -7
  79. data/lib/distribution/weibull/gsl.rb +16 -16
  80. data/lib/distribution/weibull/ruby.rb +30 -23
  81. data/spec/beta_spec.rb +45 -47
  82. data/spec/binomial_spec.rb +77 -85
  83. data/spec/bivariatenormal_spec.rb +28 -35
  84. data/spec/chisquare_spec.rb +48 -52
  85. data/spec/distribution_spec.rb +10 -10
  86. data/spec/exponential_spec.rb +44 -49
  87. data/spec/f_spec.rb +4 -4
  88. data/spec/gamma_spec.rb +50 -53
  89. data/spec/hypergeometric_spec.rb +63 -69
  90. data/spec/logistic_spec.rb +32 -37
  91. data/spec/lognormal_spec.rb +25 -31
  92. data/spec/math_extension_spec.rb +192 -210
  93. data/spec/normal_spec.rb +80 -73
  94. data/spec/poisson_spec.rb +63 -41
  95. data/spec/shorthand_spec.rb +19 -22
  96. data/spec/spec_helper.rb +8 -9
  97. data/spec/t_spec.rb +63 -77
  98. data/spec/uniform_spec.rb +154 -0
  99. data/spec/weibull_spec.rb +13 -14
  100. metadata +17 -8
@@ -0,0 +1,154 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/spec_helper.rb")
2
+ require 'distribution/uniform'
3
+
4
+ describe Distribution::Uniform do
5
+
6
+ shared_examples_for "uniform engine" do
7
+
8
+ it ".rng should generate sequences with the right mean & variance" do
9
+ skip("This method is very innacurrate due to the low convergence rate")
10
+ # samples = 100_000
11
+ # sum = 0
12
+ # ss = 0
13
+ # lower = 0
14
+ # upper = 20
15
+
16
+ # # Expectations
17
+ # exp_mean = (upper + lower) / 2
18
+ # exp_variance = ((upper - lower) ** 2) / 12
19
+ # rng = @engine.rng(lower, upper)
20
+
21
+ # samples.times do
22
+ # v = rng.call
23
+ # sum += v
24
+ # ss += (v - exp_mean) ** 2
25
+ # end
26
+
27
+ # mean = sum.to_f / samples
28
+ # variance = ss.to_f / samples
29
+ # mean.should be_within(1e-5).of(exp_mean)
30
+ # variance.should be_within(1e-5).of(exp_variance)
31
+ end
32
+
33
+ it ".rng with a specified seed should be reproducible" do
34
+ seed = Random.new_seed.modulo 100000007
35
+ gen_a = @engine.rng(0, 1, seed)
36
+ gen_b = @engine.rng(0, 1, seed)
37
+
38
+ expect((gen_a.call)).to eq(gen_b.call)
39
+ end
40
+
41
+ it ".pdf should return correct pdf for values within the defined range" do
42
+ if @engine.respond_to? :pdf
43
+ 10.times do
44
+ low, width = rand, rand
45
+ x = low + rand * width
46
+ epdf = 1.0 / width
47
+ expect(@engine.pdf(x, low, low + width)).to be_within(1e-10).of(epdf)
48
+ end
49
+
50
+ else
51
+ pending("No #{@engine}.pdf")
52
+ end
53
+ end
54
+
55
+ it ".pdf should return 0 for values outside the defined range" do
56
+ if @engine.respond_to? :pdf
57
+ 10.times do
58
+ low, width = rand, rand
59
+ # x lies just outside of where the pdf exists as a non-zero value
60
+ # A small amount (1e-10) is removed from bad_x to ensure no overlap
61
+ x = low - (1 + rand) * width - 1e-10
62
+ expect(@engine.pdf(x, low, low + width)).to be_within(1e-10).of(0.0)
63
+ end
64
+
65
+ else
66
+ pending("No #{@engine}.pdf")
67
+ end
68
+ end
69
+
70
+
71
+ it ".cdf should return 0 for values smaller than the lower bound" do
72
+ if @engine.respond_to? :cdf
73
+ low, width = rand, rand
74
+ x = low - rand * width
75
+ expect(@engine.cdf(x, low, low + width)).to be_within(1e-10).of(0.0)
76
+ else
77
+ pending("No #{@engine}.cdf")
78
+ end
79
+ end
80
+
81
+ it ".cdf should return correct cdf for x within defined range" do
82
+ if @engine.respond_to? :cdf
83
+ low, width = rand, rand
84
+ x = low + rand * width
85
+ ecdf = (x - low) / width
86
+ expect(@engine.cdf(x, low, low + width)).to be_within(1e-10).of(ecdf)
87
+ else
88
+ pending("No #{@engine}.cdf")
89
+ end
90
+ end
91
+
92
+ it ".cdf should return 1 for values greater than the upper bound" do
93
+ if @engine.respond_to? :cdf
94
+ low, width = rand, rand
95
+ x = low + (1 + rand) * (width)
96
+ expect(@engine.cdf(x, low, low + width)).to be_within(1e-10).of(1.0)
97
+ else
98
+ pending("No #{@engine}.cdf")
99
+ end
100
+ end
101
+
102
+ it ".quantile should return correct inverse cdf" do
103
+ if @engine.respond_to? :quantile
104
+ low, width = rand, rand
105
+ scale = rand
106
+ x = low + scale * width
107
+ qn = (x - low) / width
108
+ expect(@engine.quantile(qn, low, low + width)).to be_within(1e-10).of(x)
109
+ else
110
+ pending("No #{@engine}.quantile")
111
+ end
112
+ end
113
+
114
+ it ".p_value should return same result as .quantile" do
115
+ if @engine.respond_to? :p_value and @engine.respond_to? :quantile
116
+ low, width = rand, rand
117
+ scale = rand
118
+ x = low + scale * width
119
+ qn = (x - low) / width
120
+
121
+ expect(@engine.quantile(qn, low, low + width)).to eq(@engine.p_value(qn, low, low + width))
122
+ else
123
+ pending("No #{@engine}.p_value")
124
+ end
125
+ end
126
+ end
127
+
128
+
129
+ describe "singleton" do
130
+ before do
131
+ @engine = Distribution::Uniform
132
+ end
133
+ it_should_behave_like "uniform engine"
134
+ end
135
+
136
+ describe Distribution::Uniform::Ruby_ do
137
+ before do
138
+ @engine = Distribution::Uniform::Ruby_
139
+ end
140
+ it_should_behave_like "uniform engine"
141
+
142
+ end
143
+
144
+ if Distribution.has_gsl?
145
+ describe Distribution::Uniform::GSL_ do
146
+ before do
147
+ @engine = Distribution::Uniform::GSL_
148
+ end
149
+ it_should_behave_like "uniform engine"
150
+ end
151
+ end
152
+
153
+
154
+ end
@@ -1,18 +1,17 @@
1
- require File.expand_path(File.dirname(__FILE__)+"/spec_helper.rb")
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
2
2
 
3
3
  include ExampleWithGSL
4
4
 
5
5
  describe Distribution::Weibull do
6
-
7
- #shared_examples for "Weibull engine" do
8
- it "should return correct pdf" do
9
- Distribution::Weibull::pdf(2, 1, 1).should be_within(1e-3).of(0.13533)
10
- end
11
- it "should return correct cdf" do
12
- Distribution::Weibull::cdf(2, 1, 1).should be_within(1e-3).of(0.86466)
13
- end
14
- it "should return correct p-value" do
15
- Distribution::Weibull::p_value(0.86466, 1, 1).should be_within(1e-3).of(2.0)
16
- end
17
- #end
18
- end
6
+ # shared_examples for "Weibull engine" do
7
+ it 'should return correct pdf' do
8
+ expect(Distribution::Weibull.pdf(2, 1, 1)).to be_within(1e-3).of(0.13533)
9
+ end
10
+ it 'should return correct cdf' do
11
+ expect(Distribution::Weibull.cdf(2, 1, 1)).to be_within(1e-3).of(0.86466)
12
+ end
13
+ it 'should return correct p-value' do
14
+ expect(Distribution::Weibull.p_value(0.86466, 1, 1)).to be_within(1e-3).of(2.0)
15
+ end
16
+ # end
17
+ end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: distribution
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Bustos
8
- autorequire:
8
+ - Carlos Agarie
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2015-05-28 00:00:00.000000000 Z
12
+ date: 2020-07-05 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
@@ -52,9 +53,11 @@ dependencies:
52
53
  - - "~>"
53
54
  - !ruby/object:Gem::Version
54
55
  version: '3.2'
55
- description: Distribution
56
+ description: Distribution is a gem with several probabilistic distributions. Pure
57
+ Ruby is used by default, C (GSL) or Java extensions are used if available
56
58
  email:
57
59
  - clbustos@gmail.com
60
+ - carlos.agarie@gmail.com
58
61
  executables:
59
62
  - distribution
60
63
  extensions: []
@@ -62,6 +65,7 @@ extra_rdoc_files: []
62
65
  files:
63
66
  - ".gitignore"
64
67
  - ".travis.yml"
68
+ - ".yardopts"
65
69
  - Gemfile
66
70
  - History.txt
67
71
  - LICENCE.md
@@ -100,6 +104,7 @@ files:
100
104
  - lib/distribution/chisquare/java.rb
101
105
  - lib/distribution/chisquare/ruby.rb
102
106
  - lib/distribution/chisquare/statistics2.rb
107
+ - lib/distribution/distributable.rb
103
108
  - lib/distribution/exponential.rb
104
109
  - lib/distribution/exponential/gsl.rb
105
110
  - lib/distribution/exponential/ruby.rb
@@ -140,11 +145,15 @@ files:
140
145
  - lib/distribution/poisson/gsl.rb
141
146
  - lib/distribution/poisson/java.rb
142
147
  - lib/distribution/poisson/ruby.rb
148
+ - lib/distribution/shorthand.rb
143
149
  - lib/distribution/t.rb
144
150
  - lib/distribution/t/gsl.rb
145
151
  - lib/distribution/t/java.rb
146
152
  - lib/distribution/t/ruby.rb
147
153
  - lib/distribution/t/statistics2.rb
154
+ - lib/distribution/uniform.rb
155
+ - lib/distribution/uniform/gsl.rb
156
+ - lib/distribution/uniform/ruby.rb
148
157
  - lib/distribution/version.rb
149
158
  - lib/distribution/weibull.rb
150
159
  - lib/distribution/weibull/gsl.rb
@@ -167,12 +176,13 @@ files:
167
176
  - spec/spec.opts
168
177
  - spec/spec_helper.rb
169
178
  - spec/t_spec.rb
179
+ - spec/uniform_spec.rb
170
180
  - spec/weibull_spec.rb
171
181
  - vendor/java/commons-math-2.2.jar
172
182
  homepage: https://github.com/sciruby/distribution
173
183
  licenses: []
174
184
  metadata: {}
175
- post_install_message:
185
+ post_install_message:
176
186
  rdoc_options: []
177
187
  require_paths:
178
188
  - lib
@@ -187,9 +197,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
197
  - !ruby/object:Gem::Version
188
198
  version: '0'
189
199
  requirements: []
190
- rubyforge_project:
191
- rubygems_version: 2.4.5
192
- signing_key:
200
+ rubygems_version: 3.1.2
201
+ signing_key:
193
202
  specification_version: 4
194
203
  summary: Distribution
195
204
  test_files: []