distribution 0.7.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +4 -6
- data/.yardopts +5 -0
- data/History.txt +3 -0
- data/README.md +87 -44
- data/benchmark/binomial_coefficient.rb +19 -23
- data/benchmark/binomial_coefficient/experiment.rb +33 -36
- data/benchmark/factorial_hash.rb +7 -8
- data/benchmark/factorial_method.rb +4 -6
- data/benchmark/odd.rb +6 -7
- data/benchmark/power.rb +11 -11
- data/bin/distribution +26 -26
- data/distribution.gemspec +3 -4
- data/lib/distribution.rb +55 -96
- data/lib/distribution/beta/gsl.rb +10 -5
- data/lib/distribution/beta/ruby.rb +3 -1
- data/lib/distribution/binomial/ruby.rb +5 -2
- data/lib/distribution/bivariatenormal.rb +4 -5
- data/lib/distribution/bivariatenormal/gsl.rb +2 -2
- data/lib/distribution/bivariatenormal/java.rb +1 -1
- data/lib/distribution/bivariatenormal/ruby.rb +245 -254
- data/lib/distribution/chisquare.rb +8 -10
- data/lib/distribution/chisquare/gsl.rb +24 -19
- data/lib/distribution/chisquare/java.rb +1 -1
- data/lib/distribution/chisquare/ruby.rb +25 -25
- data/lib/distribution/chisquare/statistics2.rb +16 -13
- data/lib/distribution/distributable.rb +40 -0
- data/lib/distribution/exponential.rb +4 -5
- data/lib/distribution/exponential/gsl.rb +13 -9
- data/lib/distribution/exponential/ruby.rb +14 -9
- data/lib/distribution/f.rb +1 -1
- data/lib/distribution/f/gsl.rb +26 -22
- data/lib/distribution/f/java.rb +1 -1
- data/lib/distribution/f/ruby.rb +16 -19
- data/lib/distribution/f/statistics2.rb +22 -19
- data/lib/distribution/gamma.rb +5 -7
- data/lib/distribution/gamma/gsl.rb +13 -9
- data/lib/distribution/gamma/java.rb +1 -1
- data/lib/distribution/gamma/ruby.rb +5 -11
- data/lib/distribution/hypergeometric.rb +5 -8
- data/lib/distribution/hypergeometric/gsl.rb +4 -5
- data/lib/distribution/hypergeometric/java.rb +1 -1
- data/lib/distribution/hypergeometric/ruby.rb +34 -35
- data/lib/distribution/logistic.rb +5 -8
- data/lib/distribution/logistic/ruby.rb +13 -8
- data/lib/distribution/lognormal.rb +5 -7
- data/lib/distribution/lognormal/gsl.rb +8 -6
- data/lib/distribution/lognormal/ruby.rb +5 -9
- data/lib/distribution/math_extension.rb +6 -15
- data/lib/distribution/math_extension/chebyshev_series.rb +281 -272
- data/lib/distribution/math_extension/erfc.rb +26 -29
- data/lib/distribution/math_extension/exponential_integral.rb +17 -17
- data/lib/distribution/math_extension/gammastar.rb +19 -20
- data/lib/distribution/math_extension/gsl_utilities.rb +12 -12
- data/lib/distribution/math_extension/incomplete_beta.rb +52 -61
- data/lib/distribution/math_extension/incomplete_gamma.rb +166 -168
- data/lib/distribution/math_extension/log_utilities.rb +20 -22
- data/lib/distribution/normal.rb +11 -13
- data/lib/distribution/normal/gsl.rb +13 -10
- data/lib/distribution/normal/java.rb +14 -13
- data/lib/distribution/normal/ruby.rb +68 -58
- data/lib/distribution/normal/statistics2.rb +5 -2
- data/lib/distribution/normalmultivariate.rb +64 -64
- data/lib/distribution/poisson.rb +11 -13
- data/lib/distribution/poisson/gsl.rb +7 -7
- data/lib/distribution/poisson/java.rb +19 -24
- data/lib/distribution/poisson/ruby.rb +38 -9
- data/lib/distribution/shorthand.rb +17 -0
- data/lib/distribution/t.rb +13 -15
- data/lib/distribution/t/gsl.rb +27 -24
- data/lib/distribution/t/java.rb +1 -1
- data/lib/distribution/t/ruby.rb +99 -100
- data/lib/distribution/t/statistics2.rb +19 -19
- data/lib/distribution/uniform.rb +26 -0
- data/lib/distribution/uniform/gsl.rb +36 -0
- data/lib/distribution/uniform/ruby.rb +91 -0
- data/lib/distribution/version.rb +1 -1
- data/lib/distribution/weibull.rb +6 -7
- data/lib/distribution/weibull/gsl.rb +16 -16
- data/lib/distribution/weibull/ruby.rb +30 -23
- data/spec/beta_spec.rb +45 -47
- data/spec/binomial_spec.rb +77 -85
- data/spec/bivariatenormal_spec.rb +28 -35
- data/spec/chisquare_spec.rb +48 -52
- data/spec/distribution_spec.rb +10 -10
- data/spec/exponential_spec.rb +44 -49
- data/spec/f_spec.rb +4 -4
- data/spec/gamma_spec.rb +50 -53
- data/spec/hypergeometric_spec.rb +63 -69
- data/spec/logistic_spec.rb +32 -37
- data/spec/lognormal_spec.rb +25 -31
- data/spec/math_extension_spec.rb +192 -210
- data/spec/normal_spec.rb +80 -73
- data/spec/poisson_spec.rb +63 -41
- data/spec/shorthand_spec.rb +19 -22
- data/spec/spec_helper.rb +8 -9
- data/spec/t_spec.rb +63 -77
- data/spec/uniform_spec.rb +154 -0
- data/spec/weibull_spec.rb +13 -14
- metadata +17 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b3c0292d160b0f59129c73e352855422d7f1d35cbc8eac916419a7146c5ee4eb
|
4
|
+
data.tar.gz: 63f7693122a361948ad79f60e26d5ab060fe69982477cf96e0eb7815dcf29d29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa9d6ccb96e181214325ad90a1bba142bb46b2b23c2826c314ece10e55de139e613999a63e0477ea9ba595158a4544fa9758ff6f0ea4eff04ac2c2a568502e67
|
7
|
+
data.tar.gz: 5730f217be13735748570c0b45d56c3a04dc6f0dffeee39b97addb64e4eadd6a03d3d731f25a99903a9624a999be58308116b494e46342ef0ecd9b36293a4f1a
|
data/.travis.yml
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
-
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
- 2.2
|
7
|
-
# - jruby-19mode # JRuby in 1.9 mode -> Problems with bigint
|
8
|
-
# - rbx-19mode
|
3
|
+
- 2.5
|
4
|
+
- 2.6
|
5
|
+
- 2.7
|
9
6
|
|
10
7
|
script:
|
11
8
|
bundle exec rake
|
@@ -13,3 +10,4 @@ script:
|
|
13
10
|
before_install:
|
14
11
|
- sudo apt-get update -qq
|
15
12
|
- sudo apt-get install -y libgsl0-dev
|
13
|
+
- gem update && gem install bundler
|
data/.yardopts
ADDED
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -3,76 +3,99 @@
|
|
3
3
|
[![Build Status](https://travis-ci.org/SciRuby/distribution.svg?branch=master)](https://travis-ci.org/SciRuby/distribution)
|
4
4
|
[![Code Climate](https://codeclimate.com/github/SciRuby/distribution/badges/gpa.svg)](https://codeclimate.com/github/SciRuby/distribution)
|
5
5
|
|
6
|
+
Distribution is a gem with several probabilistic distributions. Pure Ruby is used by default, C (GSL) or Java extensions are used if available. Some facts:
|
7
|
+
|
8
|
+
- Very fast ruby 1.9.3+ implementation, with improved method to calculate factorials and other common functions.
|
9
|
+
- All methods tested on several ranges. See `spec/`.
|
10
|
+
- Code for normal, Student's t and chi square is lifted from the [statistics2 gem](https://rubygems.org/gems/statistics2). Originally at [this site](http://blade.nagaokaut.ac.jp/~sinara/ruby/math/statistics2).
|
11
|
+
- The code for some functions and RNGs was lifted from Julia's [Rmath-julia](https://github.com/JuliaLang/Rmath-julia), a patched version of R's standalone math library.
|
12
|
+
|
13
|
+
The following table lists the available distributions and the methods available for each one. If a field is marked with an *x*, that distribution doesn't have that method implemented.
|
14
|
+
|
15
|
+
| Distribution | PDF | CDF | Quantile | RNG | Mean | Mode | Variance | Skewness | Kurtosis | Entropy |
|
16
|
+
| :--------------- | :-: | :-: | :------: | :-: | :--: | :--: | :------: | :------: | :------: | :-----: |
|
17
|
+
| Uniform | | | | | x | x | x | x | x | x |
|
18
|
+
| Normal | | | | | x | x | x | x | x | x |
|
19
|
+
| Lognormal | | | x | x | x | x | x | x | x | x |
|
20
|
+
| Bivariate Normal | | | x | x | x | x | x | x | x | x |
|
21
|
+
| Exponential | | | | | x | x | x | x | x | x |
|
22
|
+
| Logistic | | | | | x | x | x | x | x | x |
|
23
|
+
| Student's T | | | | x | x | x | x | x | x | x |
|
24
|
+
| Chi Square | | | | | x | x | x | x | x | x |
|
25
|
+
| Fisher-Snedecor | | | | x | x | x | x | x | x | x |
|
26
|
+
| Beta | | | | x | x | x | x | x | x | x |
|
27
|
+
| Gamma | | | x | x | x | x | x | x | x | x |
|
28
|
+
| Weibull | | | | x | x | x | x | x | x | x |
|
29
|
+
| Binomial | | | | x | x | x | x | x | x | x |
|
30
|
+
| Poisson | | | | | x | x | x | x | x | x |
|
31
|
+
| Hypergeometric | | | | x | x | x | x | x | x | x |
|
32
|
+
|
6
33
|
## Installation
|
7
34
|
|
8
35
|
```
|
9
36
|
$ gem install distribution
|
10
37
|
```
|
11
38
|
|
12
|
-
|
39
|
+
You can install GSL for better performance:
|
40
|
+
|
41
|
+
* For Mac OS X: `brew install gsl`
|
42
|
+
* For Ubuntu / Debian: `sudo apt-get install libgsl0-dev`
|
43
|
+
|
44
|
+
After successfully installing the library:
|
13
45
|
|
14
46
|
```bash
|
15
47
|
$ gem install rb-gsl
|
16
48
|
```
|
17
49
|
|
18
|
-
##
|
19
|
-
|
20
|
-
Statistical Distributions library. Includes Normal univariate and bivariate, T, F, Chi Square, Binomial, Hypergeometric, Exponential, Poisson, Beta, LogNormal and Gamma.
|
21
|
-
|
22
|
-
Uses Ruby by default and C (statistics2/GSL) or Java extensions where available.
|
23
|
-
|
24
|
-
Includes code from statistics2 on Normal, T, F and Chi Square ruby code [http://blade.nagaokaut.ac.jp/~sinara/ruby/math/statistics2]
|
25
|
-
|
26
|
-
## Synopsis
|
27
|
-
|
28
|
-
* Returns Gaussian PDF for x
|
29
|
-
|
30
|
-
```
|
31
|
-
pdf=Distribution::Normal.pdf(x)
|
32
|
-
```
|
50
|
+
## Examples
|
33
51
|
|
34
|
-
|
52
|
+
You can find automatically generated documentation on [RubyDoc](http://www.rubydoc.info/github/sciruby/distribution/master).
|
35
53
|
|
36
54
|
```
|
37
|
-
|
38
|
-
|
55
|
+
# Returns Gaussian PDF for x.
|
56
|
+
pdf = Distribution::Normal.pdf(x)
|
39
57
|
|
40
|
-
|
58
|
+
# Returns Gaussian CDF for x.
|
59
|
+
cdf = Distribution::Normal.cdf(x)
|
41
60
|
|
42
|
-
|
43
|
-
pv=Distribution::Normal.p_value(x)
|
44
|
-
```
|
61
|
+
# Returns inverse CDF (or p-value) for x.
|
62
|
+
pv = Distribution::Normal.p_value(x)
|
45
63
|
|
46
|
-
|
64
|
+
# API.
|
47
65
|
|
48
|
-
|
49
|
-
|
50
|
-
```
|
66
|
+
# You would normally use the following
|
67
|
+
p = Distribution::T.cdf(x)
|
51
68
|
|
52
|
-
|
69
|
+
# to get the cumulative probability of `x`. However, you can also:
|
53
70
|
|
54
|
-
|
55
|
-
|
71
|
+
include Distribution::Shorthand
|
72
|
+
tdist_cdf(x)
|
56
73
|
```
|
57
74
|
|
58
|
-
This should create the main distribution file, the directory with Ruby and GSL engines and specs on the spec/ directory.
|
59
|
-
|
60
75
|
## API Structure
|
61
76
|
|
62
|
-
|
77
|
+
```ruby
|
78
|
+
Distribution::<name>.(cdf|pdf|p_value|rng)
|
79
|
+
```
|
63
80
|
|
64
81
|
On discrete distributions, exact Ruby implementations of pdf, cdf and p_value could be provided, using
|
82
|
+
|
65
83
|
```
|
66
84
|
Distribution::<name>.exact_(cdf|pdf|p_value)
|
67
85
|
```
|
86
|
+
|
68
87
|
module Distribution::Shorthand provides (you guess?) shortands method to call all methods
|
88
|
+
|
69
89
|
```
|
70
90
|
<Distribution shortname>_(cdf|pdf|p|r)
|
71
91
|
```
|
92
|
+
|
72
93
|
On discrete distributions, exact cdf, pdf and p_value are
|
94
|
+
|
73
95
|
```
|
74
96
|
<Distribution shortname>_(ecdf|epdf|ep)
|
75
97
|
```
|
98
|
+
|
76
99
|
Shortnames for distributions:
|
77
100
|
|
78
101
|
* Normal: norm
|
@@ -87,26 +110,46 @@ Shortnames for distributions:
|
|
87
110
|
* Beta: beta
|
88
111
|
* Gamma: gamma
|
89
112
|
* LogNormal: lognormal
|
113
|
+
* Uniform: unif
|
90
114
|
|
91
|
-
|
115
|
+
## Roadmap
|
92
116
|
|
93
|
-
|
94
|
-
Distribution::T.cdf
|
95
|
-
```
|
117
|
+
This gem wasn't updated for a long time before I started working on it, so there are a lot of work to do. The first priority is cleaning the interface and removing cruft whenever possible. After that, I want to implement more distributions and make sure that each one has a RNG.
|
96
118
|
|
97
|
-
|
119
|
+
### Short-term
|
98
120
|
|
99
|
-
|
100
|
-
|
101
|
-
|
121
|
+
- Define a minimal interface for continuous and discrete distributions (e.g. mean, variance, mode, skewness, kurtosis, pdf, cdf, quantile, cquantile).
|
122
|
+
- Implement `Distribution::Uniform` with the default Ruby `Random`.
|
123
|
+
- Clean up the implementation of normal distribution. Implement the necessary functions.
|
124
|
+
- The same for Student's t, chi square, Fisher-Snedecor, beta, gamma, lognormal, logistic.
|
125
|
+
- The same for discrete distributions: binomial, hypergeometric, bernoulli (still missing), etc.
|
126
|
+
|
127
|
+
### Medium-term
|
102
128
|
|
103
|
-
|
129
|
+
- Implement [DSFMT](http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/) for the uniform random generator.
|
130
|
+
- Cauchy distribution.
|
104
131
|
|
105
|
-
|
106
|
-
|
132
|
+
### Long-term
|
133
|
+
|
134
|
+
- Implementing everything in the distributions x functions table above.
|
107
135
|
|
108
136
|
## Issues
|
109
137
|
|
110
138
|
* On JRuby and Rubinius, BivariateNormal returns incorrect pdf
|
111
139
|
|
112
140
|
For current issues see the [issue tracker pages](https://github.com/sciruby/distribution/issues).
|
141
|
+
|
142
|
+
## OMG! I want to help!
|
143
|
+
|
144
|
+
Everyone is welcome to help! Please, test these distributions with your own use
|
145
|
+
cases and give a shout on the issue tracker if you find a problem or something
|
146
|
+
is strange or hard to use. Documentation pull requests are totally welcome.
|
147
|
+
More generally, any ideas or suggestions are welcome -- even by private e-mail.
|
148
|
+
|
149
|
+
If you want to provide a new distribution, run `lib/distribution`:
|
150
|
+
|
151
|
+
```
|
152
|
+
$ distribution --new your_distribution
|
153
|
+
```
|
154
|
+
|
155
|
+
This should create the main distribution file, the directory with Ruby and GSL engines and specs on the spec/ directory.
|
@@ -1,56 +1,52 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
2
2
|
require 'distribution'
|
3
3
|
require 'bench_press'
|
4
4
|
|
5
5
|
extend BenchPress
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
samples=10.times.map {|i| 2**(i+1)}
|
7
|
+
samples = 10.times.map { |i| 2**(i + 1) }
|
10
8
|
|
11
9
|
name 'binomial coefficient: multiplicative, factorial and optimized factorial methods'
|
12
10
|
author 'Claudio Bustos'
|
13
11
|
date '2011-01-27'
|
14
|
-
summary "Exact calculation of Binomial Coefficient could be obtained using multiplicative, pure factorial or optimized factorial algorithm (failing + factorial).
|
12
|
+
summary "Exact calculation of Binomial Coefficient could be obtained using multiplicative, pure factorial or optimized factorial algorithm (failing + factorial).
|
15
13
|
Which one is faster?
|
16
14
|
|
17
|
-
Lower k is the best for all
|
15
|
+
Lower k is the best for all
|
18
16
|
k=n/2 is the worst case.
|
19
17
|
|
20
18
|
The factorial method uses the fastest Swing Prime Algorithm."
|
21
19
|
|
22
|
-
reps 10 #number of repetitions
|
23
|
-
|
24
|
-
x=100
|
25
|
-
|
26
|
-
n=100
|
27
|
-
k=50
|
20
|
+
reps 10 # number of repetitions
|
28
21
|
|
22
|
+
x = 100
|
29
23
|
|
24
|
+
n = 100
|
25
|
+
k = 50
|
30
26
|
|
31
|
-
measure
|
27
|
+
measure 'Multiplicative' do
|
32
28
|
samples.each do |n|
|
33
|
-
[5,n/2].each do |k|
|
34
|
-
k=[k,n-k].min
|
35
|
-
(1..k).inject(1) {|ac, i| (ac*(n-k+i).quo(i))}
|
29
|
+
[5, n / 2].each do |k|
|
30
|
+
k = [k, n - k].min
|
31
|
+
(1..k).inject(1) { |ac, i| (ac * (n - k + i).quo(i)) }
|
36
32
|
end
|
37
33
|
end
|
38
34
|
end
|
39
35
|
|
40
|
-
measure
|
36
|
+
measure 'Pure Factorial' do
|
41
37
|
samples.each do |n|
|
42
|
-
[5,n/2].each do |k|
|
43
|
-
k=[k,n-k].min
|
38
|
+
[5, n / 2].each do |k|
|
39
|
+
k = [k, n - k].min
|
44
40
|
Math.factorial(n).quo(Math.factorial(k) * Math.factorial(n - k))
|
45
41
|
end
|
46
42
|
end
|
47
43
|
end
|
48
44
|
|
49
|
-
measure
|
45
|
+
measure 'Failing factorial + factorial' do
|
50
46
|
samples.each do |n|
|
51
|
-
[5,n/2].each do |k|
|
52
|
-
k=[k,n-k].min
|
53
|
-
(((n-k+1)..n).inject(1) {|ac,v| ac * v}).quo(Math.factorial(k))
|
47
|
+
[5, n / 2].each do |k|
|
48
|
+
k = [k, n - k].min
|
49
|
+
(((n - k + 1)..n).inject(1) { |ac, v| ac * v }).quo(Math.factorial(k))
|
54
50
|
end
|
55
51
|
end
|
56
52
|
end
|
@@ -1,54 +1,51 @@
|
|
1
1
|
# This test create a database to adjust the best algorithm
|
2
2
|
# to use on correlation matrix
|
3
|
-
|
3
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../../lib'))
|
4
4
|
require 'distribution'
|
5
5
|
require 'statsample'
|
6
6
|
require 'benchmark'
|
7
7
|
|
8
|
-
if !File.
|
9
|
-
reps=100 #number of repetitions
|
10
|
-
ns={
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
}
|
20
|
-
|
21
|
-
rs=Statsample::Dataset.new(%w
|
22
|
-
|
23
|
-
ns.each do |n,ks|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
(((n-k+1)..n).inject(1) {|ac,v| ac * v}).quo(Math.factorial(k))
|
8
|
+
if !File.exist?('binomial_coefficient.ds') or File.mtime(__FILE__) > File.mtime('binomial_coefficient.ds')
|
9
|
+
reps = 100 # number of repetitions
|
10
|
+
ns = {
|
11
|
+
5 => [1, 3],
|
12
|
+
10 => [1, 3, 5],
|
13
|
+
50 => [1, 3, 5, 10, 25],
|
14
|
+
100 => [1, 3, 5, 10, 25, 50],
|
15
|
+
500 => [1, 3, 5, 10, 25, 50, 100, 250],
|
16
|
+
1000 => [1, 3, 5, 10, 25, 50, 100, 250, 500],
|
17
|
+
5000 => [1, 3, 5, 10, 25, 50, 100, 250, 500, 1000, 2500],
|
18
|
+
10_000 => [1, 3, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000]
|
19
|
+
}
|
20
|
+
|
21
|
+
rs = Statsample::Dataset.new(%w(n k mixed_factorial multiplicative))
|
22
|
+
|
23
|
+
ns.each do |n, ks|
|
24
|
+
ks.each do |k|
|
25
|
+
time_factorial = Benchmark.realtime do
|
26
|
+
reps.times {
|
27
|
+
(((n - k + 1)..n).inject(1) { |ac, v| ac * v }).quo(Math.factorial(k))
|
29
28
|
}
|
30
29
|
end
|
31
|
-
|
32
|
-
time_multiplicative= Benchmark.realtime do
|
33
|
-
reps.times {
|
34
|
-
(1..k).inject(1) {|ac, i| (ac*(n-k+i).quo(i))}
|
30
|
+
|
31
|
+
time_multiplicative = Benchmark.realtime do
|
32
|
+
reps.times {
|
33
|
+
(1..k).inject(1) { |ac, i| (ac * (n - k + i).quo(i)) }
|
35
34
|
}
|
36
35
|
end
|
37
|
-
|
36
|
+
|
38
37
|
puts "n:#{n}, k:#{k} -> factorial:%0.3f | multiplicative: %0.3f " % [time_factorial, time_multiplicative]
|
39
|
-
|
40
|
-
rs.add_case(
|
38
|
+
|
39
|
+
rs.add_case('n' => n, 'k' => k, 'mixed_factorial' => time_factorial, 'multiplicative' => time_multiplicative)
|
41
40
|
end
|
42
41
|
end
|
43
|
-
|
42
|
+
|
44
43
|
else
|
45
|
-
rs=Statsample.load(
|
44
|
+
rs = Statsample.load('binomial_coefficient.ds')
|
46
45
|
end
|
47
46
|
|
48
|
-
|
49
|
-
rs.fields.each {|f| rs[f].type=:scale}
|
50
|
-
|
47
|
+
rs.fields.each { |f| rs[f].type = :scale }
|
51
48
|
|
52
49
|
rs.update_valid_data
|
53
|
-
rs.save(
|
54
|
-
Statsample::Excel.write(rs,
|
50
|
+
rs.save('binomial_coefficient.ds')
|
51
|
+
Statsample::Excel.write(rs, 'binomial_coefficient.xls')
|
data/benchmark/factorial_hash.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
|
2
2
|
require 'bench_press'
|
3
3
|
require 'distribution'
|
4
4
|
extend BenchPress
|
@@ -8,17 +8,16 @@ author 'Claudio Bustos'
|
|
8
8
|
date '2011-01-31'
|
9
9
|
summary "
|
10
10
|
Is better create a lookup table for factorial or just calculate it?
|
11
|
-
Distribution::MathExtension::SwingFactorial has a lookup table
|
11
|
+
Distribution::MathExtension::SwingFactorial has a lookup table
|
12
12
|
for factorials n<20
|
13
13
|
"
|
14
14
|
|
15
|
-
reps 1000 #number of repetitions
|
15
|
+
reps 1000 # number of repetitions
|
16
16
|
|
17
|
-
measure
|
18
|
-
|
17
|
+
measure 'Lookup' do
|
18
|
+
Math.factorial(19)
|
19
19
|
end
|
20
20
|
|
21
|
-
measure
|
22
|
-
|
21
|
+
measure 'calculate' do
|
22
|
+
Distribution::MathExtension::SwingFactorial.naive_factorial(19)
|
23
23
|
end
|
24
|
-
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
|
2
2
|
require 'distribution'
|
3
3
|
require 'bench_press'
|
4
4
|
|
@@ -10,19 +10,17 @@ date '2011-01-27'
|
|
10
10
|
summary "
|
11
11
|
Factorization requires a lot of processing, so approximation method could be required. But for greats value, bigdecimal are required and things start to get harder.
|
12
12
|
* Approximation (fast_factorial): Luschny f.3
|
13
|
-
* Exact (factorial): Luschny Swing Prime
|
13
|
+
* Exact (factorial): Luschny Swing Prime
|
14
14
|
"
|
15
15
|
|
16
|
-
reps 10 #number of repetitions
|
16
|
+
reps 10 # number of repetitions
|
17
17
|
|
18
|
-
x=200
|
18
|
+
x = 200
|
19
19
|
|
20
20
|
measure "Math.factorial(#{x})" do
|
21
21
|
Math.factorial(x)
|
22
22
|
end
|
23
23
|
|
24
24
|
measure "Math.fast_factorial(#{x})" do
|
25
|
-
|
26
25
|
Math.fast_factorial(x)
|
27
26
|
end
|
28
|
-
|