croupier 2.0.0.rc1 → 2.0.0.rc2
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 +4 -4
- data/README.md +19 -20
- data/RUNNING_TESTS.md +11 -4
- data/lib/croupier.rb +25 -0
- data/lib/croupier/cli/application.rb +1 -1
- data/lib/croupier/distribution.rb +76 -7
- data/lib/croupier/distributions/bernoulli.rb +5 -11
- data/lib/croupier/distributions/binomial.rb +5 -16
- data/lib/croupier/distributions/cauchy.rb +4 -15
- data/lib/croupier/distributions/credit_card.rb +14 -13
- data/lib/croupier/distributions/degenerate.rb +4 -7
- data/lib/croupier/distributions/exponential.rb +3 -10
- data/lib/croupier/distributions/gamma.rb +9 -18
- data/lib/croupier/distributions/geometric.rb +3 -10
- data/lib/croupier/distributions/nbinomial.rb +4 -16
- data/lib/croupier/distributions/normal.rb +12 -19
- data/lib/croupier/distributions/poisson.rb +3 -10
- data/lib/croupier/distributions/triangular.rb +7 -22
- data/lib/croupier/distributions/uniform.rb +19 -25
- data/lib/croupier/version.rb +1 -1
- data/test/minitest/distribution_class/test_class_methods.rb +117 -3
- data/test/minitest/distribution_class/test_instance_methods.rb +19 -1
- data/test/minitest/distribution_generator_class/test_class_methods.rb +1 -1
- data/test/minitest/distribution_generator_class/test_instance_methods.rb +1 -1
- data/test/minitest/distribution_generators/test_enumerator_block_generator.rb +1 -1
- data/test/minitest/distribution_generators/test_enumerator_generator.rb +1 -1
- data/test/minitest/distribution_generators/test_inverse_cdf_generator.rb +1 -1
- data/test/minitest/distribution_generators/test_minimum_sample_generator.rb +1 -1
- data/test/minitest/distributions/test_bernoulli_distribution.rb +1 -1
- data/test/minitest/distributions/test_binomial_distribution.rb +1 -1
- data/test/minitest/distributions/test_cauchy_distribution.rb +1 -1
- data/test/minitest/distributions/test_credit_card_distribution.rb +1 -1
- data/test/minitest/distributions/test_degenerate_distribution.rb +6 -1
- data/test/minitest/distributions/test_exponential_distribution.rb +1 -1
- data/test/minitest/distributions/test_gamma_distribution.rb +1 -1
- data/test/minitest/distributions/test_geometric_distribution.rb +1 -1
- data/test/minitest/distributions/test_normal_distribution.rb +1 -1
- data/test/minitest/distributions/test_poisson_distribution.rb +1 -1
- data/test/minitest/distributions/test_triangular_distribution.rb +9 -1
- data/test/minitest/distributions/test_uniform_distribution.rb +1 -1
- data/test/minitest/test_croupier_module.rb +1 -2
- data/test/minitest/test_distribution_generators_module.rb +2 -2
- data/test/minitest/test_distributions_module.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3360595bc4f0222b501d7c3d420c8589050a7a7d
|
4
|
+
data.tar.gz: e9e3889ae3c87181b2dcd1552457ecd793ccb5ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0da2b840c987376dd020441e08016582e2d0db6b34c41d064409b2a4777319ff3f7dd2861332f21fb73e85583cab9c9952f31085a9597d3c6fc99c318a2ce52a
|
7
|
+
data.tar.gz: 47fa3fc6a2426ac785ca207f2b296687b7fb111a206d8467ed8b9a575aa264056f462233788de785449aa519165e13676dc555e6e29ef63dcdd570419570bb91
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ Croupier generates random samples of numbers with specific probability distribut
|
|
9
9
|
|
10
10
|
You need to have Ruby and Rubygems installed in your system. Then install croupier with:
|
11
11
|
|
12
|
-
$ gem install croupier
|
12
|
+
$ gem install croupier --pre
|
13
13
|
|
14
14
|
## Getting Started
|
15
15
|
|
@@ -29,8 +29,8 @@ where:
|
|
29
29
|
|
30
30
|
### Examples
|
31
31
|
|
32
|
-
$ croupier uniform 500 # => 500 numbers with uniform distribution in [0,1
|
33
|
-
$ croupier uniform 125
|
32
|
+
$ croupier uniform 500 # => 500 numbers with uniform distribution in [0,1) (default interval)
|
33
|
+
$ croupier uniform 125 --included 15 --excluded 7 # => 125 numbers with uniform distribution in (7,15]
|
34
34
|
$ croupier exponential 1000 -lambda 1.3 # => 1000 numbers following an exponential distribution with rate 1.3
|
35
35
|
|
36
36
|
### Available distributions and options
|
@@ -40,6 +40,7 @@ Current version implements the following distributions:
|
|
40
40
|
* Bernoulli
|
41
41
|
* Binomial
|
42
42
|
* Cauchy
|
43
|
+
* Credit Card
|
43
44
|
* Degenerate
|
44
45
|
* Exponential
|
45
46
|
* Gamma
|
@@ -66,38 +67,36 @@ First of all require the croupier library:
|
|
66
67
|
|
67
68
|
require 'croupier'
|
68
69
|
|
69
|
-
And then use the the distribution you want to generate the sample.
|
70
|
+
And then use the the distribution you want to generate the sample. Since version 2.0, all ```Croupier::Distribution```s
|
71
|
+
are ```Enumerable```s, and the ```.generate_number``` and ```.generate_sample(n)``` methods are now deprecated.
|
72
|
+
```first``` and ```take(n)``` can be used instead.
|
70
73
|
|
71
|
-
dist = Croupier::Distributions
|
72
|
-
dist.
|
73
|
-
dist.
|
74
|
+
dist = Croupier::Distributions.exponential(lambda: 1.7)
|
75
|
+
dist.take(100) #=> returns an array of 100 random numbers following an exponential with rate 1.7
|
76
|
+
dist.first #=> returns one random number following an exponential with rate 1.7
|
74
77
|
|
75
|
-
|
78
|
+
Though it's posible to instantiate each Distribution class directly:
|
76
79
|
|
77
|
-
dist = Croupier::Distributions::Exponential.new(:
|
80
|
+
dist = Croupier::Distributions::Exponential.new(lambda: 1.7)
|
78
81
|
|
79
|
-
|
82
|
+
calling methods on ```Croupier::Distributions``` (note the final s) module is recommended:
|
80
83
|
|
81
|
-
dist = Croupier::Distributions.exponential :
|
84
|
+
dist = Croupier::Distributions.exponential lambda: 1.7
|
82
85
|
|
83
|
-
To get a list of all available distributions/methods in Distributions module call ```list```
|
86
|
+
To get a list of all available distributions/methods in ```Distributions``` module call ```list```
|
84
87
|
|
85
88
|
Croupier::Distributions.list
|
86
89
|
|
87
|
-
Distributions
|
88
|
-
|
90
|
+
Distributions' Enumerable behaviour comes from an infinite ```Enumerator::Lazy```. Take this into account
|
91
|
+
when calling ```Enumerable``` methods.
|
89
92
|
|
90
|
-
dist = Croupier::Distributions.exponential(:
|
93
|
+
dist = Croupier::Distributions.exponential(lambda: 17)
|
91
94
|
dist.each_slice(2).take(3)
|
92
95
|
=> [[0.7455570432863594, 1.6543154039789472], [4.261950709816685, 0.2860058032480469], [1.4761279576207826, 0.6433699882662834]]
|
93
96
|
|
94
97
|
## How to generate a new distribution.
|
95
98
|
|
96
|
-
|
97
|
-
|
98
|
-
Nonetheless there is another cool way to implement a distribution: implementing ```inv_cdf```:
|
99
|
-
|
100
|
-
```ìnv_cdf``` receives a parameter ```n``` that is a sample of a uniform distribution. It should return the inverse of the cdf applied to ```n```.
|
99
|
+
TO BE COMPLETED WHEN API IS FINISHED.
|
101
100
|
|
102
101
|
## License
|
103
102
|
|
data/RUNNING_TESTS.md
CHANGED
@@ -12,7 +12,14 @@ You can run these tests using the default Rake task:
|
|
12
12
|
|
13
13
|
$ rake
|
14
14
|
|
15
|
-
### R tests
|
15
|
+
### R tests (automagic)
|
16
|
+
|
17
|
+
Make sure you have downloaded all git submodules first since R tests are now a
|
18
|
+
dependency. From the 2.0 release, validating the distributions is as simple as running:
|
19
|
+
|
20
|
+
> rake test:distributions
|
21
|
+
|
22
|
+
### R tests (manual steps)
|
16
23
|
|
17
24
|
There's a group of tests validating the probability distribution of several samples of numbers generated with Croupier.
|
18
25
|
To generate samples to be tested, run the script ```generate_test_data.sh```:
|
@@ -35,13 +42,13 @@ Other R packages needed:
|
|
35
42
|
* vcd
|
36
43
|
|
37
44
|
The test script will try to install all dependencies if they are not found in your R installation.
|
38
|
-
You can run the test/
|
45
|
+
You can run the test/rtests.R file:
|
39
46
|
|
40
47
|
Using Rscript:
|
41
48
|
|
42
|
-
$ Rscript
|
49
|
+
$ Rscript rtests.R
|
43
50
|
|
44
51
|
or from the R console:
|
45
52
|
|
46
|
-
source('
|
53
|
+
source('rtests.R')
|
47
54
|
|
data/lib/croupier.rb
CHANGED
@@ -99,5 +99,30 @@ module Croupier
|
|
99
99
|
def seed
|
100
100
|
random.seed
|
101
101
|
end
|
102
|
+
|
103
|
+
# Croupier Warn
|
104
|
+
#
|
105
|
+
# @param *args [String[,String...]] messages
|
106
|
+
# @return NilClass
|
107
|
+
def warn *args
|
108
|
+
if @warn
|
109
|
+
args.each {|m| message m }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Activates warning messages (activated by default)
|
114
|
+
def activate_warnings
|
115
|
+
@warn = true
|
116
|
+
end
|
117
|
+
|
118
|
+
# Deactivates warning messages
|
119
|
+
def deactivate_warnings
|
120
|
+
@warn = false
|
121
|
+
end
|
122
|
+
|
123
|
+
def warn?
|
124
|
+
@warn = true if @warn.nil?
|
125
|
+
@warn
|
126
|
+
end
|
102
127
|
end
|
103
128
|
end
|
@@ -27,7 +27,7 @@ module Croupier
|
|
27
27
|
def run
|
28
28
|
Croupier.trap_interrupt
|
29
29
|
distribution, sample_size, params = parse_distribution_options
|
30
|
-
distribution.new(params).
|
30
|
+
distribution.new(params).take(sample_size).each{|n| Croupier.message n}
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
@@ -62,11 +62,36 @@ module Croupier
|
|
62
62
|
# @param options [Hash] new cli options
|
63
63
|
# return [Hash] current cli options
|
64
64
|
def cli_options options=nil
|
65
|
-
|
66
|
-
|
65
|
+
if options
|
66
|
+
cli_banner options[:banner] if options[:banner]
|
67
|
+
(options[:options] || []).each do |opt|
|
68
|
+
cli_option *opt
|
69
|
+
end
|
70
|
+
end
|
71
|
+
@cli_options ||= {}
|
67
72
|
end
|
68
73
|
|
69
|
-
#
|
74
|
+
# Adds an option to the :options Array in cli_options hash.
|
75
|
+
#
|
76
|
+
# @param option [Symbol] new cli option
|
77
|
+
# @param description [String] description of the cli option
|
78
|
+
# @param params [Hash] option params for the cli option
|
79
|
+
# return [Array] current cli options
|
80
|
+
def cli_option option, description, params
|
81
|
+
cli_options[:options] ||= []
|
82
|
+
define_method_for_option option, params[:type]
|
83
|
+
cli_options[:options] << [option, description, params]
|
84
|
+
end
|
85
|
+
|
86
|
+
# Sets the value for the :banner key in cli_options hash.
|
87
|
+
#
|
88
|
+
# @param banner [String] new cli banner
|
89
|
+
# return [String] current cli banner
|
90
|
+
def cli_banner banner
|
91
|
+
cli_options[:banner] = banner
|
92
|
+
end
|
93
|
+
|
94
|
+
# Sets the cli_name if given.
|
70
95
|
#
|
71
96
|
# @param cli_name [String] new cli name
|
72
97
|
# @return [String] current cli name
|
@@ -75,6 +100,23 @@ module Croupier
|
|
75
100
|
@cli_name
|
76
101
|
end
|
77
102
|
|
103
|
+
# Adds an adjustment. And adjustment is the
|
104
|
+
# block that will go through a map after the
|
105
|
+
# enumerator is created.
|
106
|
+
#
|
107
|
+
# @param [Proc] block for the map.
|
108
|
+
# @returns [Array] procs
|
109
|
+
def adjust &block
|
110
|
+
adjustments << block
|
111
|
+
end
|
112
|
+
|
113
|
+
# Returns current adjustments.
|
114
|
+
#
|
115
|
+
# @returns [Array] array of procs.
|
116
|
+
def adjustments
|
117
|
+
@adjustment ||= []
|
118
|
+
end
|
119
|
+
|
78
120
|
def default_parameters
|
79
121
|
Hash[(cli_options[:options]||{}).map do |name, desc, hash|
|
80
122
|
[name,hash[:default]]
|
@@ -91,6 +133,14 @@ module Croupier
|
|
91
133
|
def respond_to?(method, include_private = false) # :nodoc:
|
92
134
|
::Croupier::DistributionGenerators.list.include?(method.to_s) || super(method, include_private)
|
93
135
|
end
|
136
|
+
|
137
|
+
protected
|
138
|
+
def define_method_for_option name, type=:float
|
139
|
+
name = :"#{name}?" if type == :boolean
|
140
|
+
self.send :define_method, name do
|
141
|
+
self.params[name.to_sym]
|
142
|
+
end
|
143
|
+
end
|
94
144
|
end
|
95
145
|
|
96
146
|
# Initializes Distribution object and adds received options to the distribution parameters.
|
@@ -135,21 +185,40 @@ module Croupier
|
|
135
185
|
end
|
136
186
|
|
137
187
|
# Make Croupier::Distribution an Enumerable
|
138
|
-
|
188
|
+
# Read the tests for the instance methods.
|
189
|
+
# Then, cry.
|
190
|
+
Enumerable.instance_methods.each do |method|
|
191
|
+
self.send(:define_method, method) do |*args, &block|
|
192
|
+
self.to_enum.send(method, *args, &block)
|
193
|
+
end
|
194
|
+
end
|
139
195
|
|
140
196
|
def each &block
|
141
197
|
if block_given?
|
142
|
-
|
198
|
+
to_enum.each &block
|
143
199
|
else
|
144
|
-
|
200
|
+
to_enum.each
|
145
201
|
end
|
146
202
|
end
|
147
203
|
|
204
|
+
def take n
|
205
|
+
to_enum.take(n).to_a
|
206
|
+
end
|
207
|
+
|
148
208
|
def to_enum
|
149
|
-
@enum ||= @generator.to_enum.lazy
|
209
|
+
@enum ||= apply_adjustments(@generator.to_enum.lazy)
|
150
210
|
end
|
151
211
|
|
152
212
|
protected
|
213
|
+
|
214
|
+
def apply_adjustments enum
|
215
|
+
self.class.adjustments.inject(enum) do |enum, adj|
|
216
|
+
enum.map do |n|
|
217
|
+
self.instance_exec(n, &adj)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
153
222
|
def create_generator
|
154
223
|
if self.class.generator_class && self.class.generator_block
|
155
224
|
@generator = self.class.generator_class.new self, &self.class.generator_block
|
@@ -13,25 +13,19 @@ module Croupier
|
|
13
13
|
|
14
14
|
cli_name "bernoulli"
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
banner: "Bernoulli distribution. Discrete probability distribution taking value 1 with success probability p and value 0 with failure probability 1-p."
|
21
|
-
})
|
16
|
+
cli_option :success, 'success probability', {type: :float, short: "-p", default: 0.5}
|
17
|
+
|
18
|
+
cli_banner "Bernoulli distribution. Discrete probability distribution taking value 1 with success probability p and value 0 with failure probability 1-p."
|
19
|
+
|
22
20
|
|
23
21
|
enumerator do |c|
|
24
|
-
c.binomial(success: success, size: 1).to_enum
|
22
|
+
c.binomial(success: success, size: 1).to_enum
|
25
23
|
end
|
26
24
|
|
27
25
|
def initialize(options={})
|
28
26
|
super(options)
|
29
27
|
raise Croupier::InputParamsError, "Probability of success must be in the interval [0,1]" if params[:success] > 1 || params[:success] < 0
|
30
28
|
end
|
31
|
-
|
32
|
-
def success
|
33
|
-
params[:success]
|
34
|
-
end
|
35
29
|
end
|
36
30
|
end
|
37
31
|
end
|
@@ -14,13 +14,11 @@ module Croupier
|
|
14
14
|
|
15
15
|
cli_name "binomial"
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
banner: "Binomial distribution. Discrete probability distribution of the number of successes in a sequence of Bernoulli trials."
|
23
|
-
})
|
17
|
+
cli_option :size, 'number of trials', {type: :integer, default: 1}
|
18
|
+
cli_option :success, 'success probability of each trial', {type: :float, short: "-p", default: 0.5}
|
19
|
+
|
20
|
+
cli_banner "Binomial distribution. Discrete probability distribution of the number of successes in a sequence of Bernoulli trials."
|
21
|
+
|
24
22
|
|
25
23
|
enumerator_block do |y|
|
26
24
|
g = ::Croupier::Distributions.geometric(success: success).to_enum.lazy
|
@@ -40,15 +38,6 @@ module Croupier
|
|
40
38
|
super(options)
|
41
39
|
raise Croupier::InputParamsError, "Probability of success must be in the interval [0,1]" if params[:success] > 1 || params[:success] < 0
|
42
40
|
end
|
43
|
-
|
44
|
-
def size
|
45
|
-
params[:size]
|
46
|
-
end
|
47
|
-
|
48
|
-
def success
|
49
|
-
params[:success]
|
50
|
-
end
|
51
|
-
|
52
41
|
end
|
53
42
|
end
|
54
43
|
end
|
@@ -13,13 +13,10 @@ module Croupier
|
|
13
13
|
|
14
14
|
cli_name "cauchy"
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
],
|
21
|
-
banner: "Cauchy continuous distribution. Generate numbers following a Cauchy distribution with location and scale parameters"
|
22
|
-
})
|
16
|
+
cli_option :location, 'location param', {type: :float, default:0.0}
|
17
|
+
cli_option :scale, 'scale param', {type: :float, default: 1.0}
|
18
|
+
|
19
|
+
cli_banner "Cauchy continuous distribution. Generate numbers following a Cauchy distribution with location and scale parameters"
|
23
20
|
|
24
21
|
inv_cdf do |n|
|
25
22
|
location + (scale * Math.tan( Math::PI * (0.5 - n)))
|
@@ -29,14 +26,6 @@ module Croupier
|
|
29
26
|
super(options)
|
30
27
|
raise Croupier::InputParamsError, "Invalid scale value, it must be positive" unless params[:scale] > 0
|
31
28
|
end
|
32
|
-
|
33
|
-
def location
|
34
|
-
params[:location]
|
35
|
-
end
|
36
|
-
|
37
|
-
def scale
|
38
|
-
params[:scale]
|
39
|
-
end
|
40
29
|
end
|
41
30
|
end
|
42
31
|
end
|
@@ -13,34 +13,35 @@ module Croupier
|
|
13
13
|
|
14
14
|
cli_name "credit_card"
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
],
|
24
|
-
banner: "Credit Card distribution. Generate random card numbers"
|
25
|
-
})
|
16
|
+
cli_option :master_card, 'master card type', {type: :boolean, default: false}
|
17
|
+
cli_option :american_express, 'american express card type', {type: :boolean, default: false}
|
18
|
+
cli_option :visa, 'visa card type', {type: :boolean, default: false}
|
19
|
+
cli_option :discover, 'discover card type', {type: :boolean, default: false}
|
20
|
+
cli_option :initial_values, 'initial values for the credit card. They will be placed after card type if one is given.', {type: :string, default: ""}
|
21
|
+
|
22
|
+
cli_banner "Credit Card distribution. Generate random card numbers"
|
26
23
|
|
27
24
|
# Returns a lambda that completes
|
28
25
|
# the credit card number up to
|
29
26
|
# 15 numbers.
|
30
|
-
def fill_number
|
27
|
+
def self.fill_number
|
31
28
|
->(n) { "#{n}#{generate_random_string(15-n.size)}"[0..14] }
|
32
29
|
end
|
33
30
|
|
34
31
|
# Returns a lambda that adds
|
35
32
|
# the checksum number
|
36
|
-
def add_checksum
|
33
|
+
def self.add_checksum
|
37
34
|
->(n) { "#{n}#{check_digit_for(n)}" }
|
38
35
|
end
|
39
36
|
|
40
37
|
enumerator do |c|
|
41
|
-
c.degenerate(constant: init)
|
38
|
+
c.degenerate(constant: init)
|
42
39
|
end
|
43
40
|
|
41
|
+
adjust &fill_number
|
42
|
+
|
43
|
+
adjust &add_checksum
|
44
|
+
|
44
45
|
def initialize(options={})
|
45
46
|
super(options)
|
46
47
|
end
|
@@ -12,16 +12,13 @@ module Croupier
|
|
12
12
|
|
13
13
|
cli_name "degenerate"
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
],
|
19
|
-
banner: "Degenerate distribution. Discrete probability distribution that returns the same value each time."
|
20
|
-
})
|
15
|
+
cli_option :constant, 'value to be returned', {type: :float, default: 42.0}
|
16
|
+
|
17
|
+
cli_banner "Degenerate distribution. Discrete probability distribution that returns the same value each time."
|
21
18
|
|
22
19
|
enumerator_block do |y|
|
23
20
|
loop do
|
24
|
-
y <<
|
21
|
+
y << constant
|
25
22
|
end
|
26
23
|
end
|
27
24
|
|
@@ -14,12 +14,9 @@ module Croupier
|
|
14
14
|
|
15
15
|
cli_name "exponential"
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
],
|
21
|
-
banner: "Exponential distribution. Generate numbers following a exponential distribution for a given lambda rate"
|
22
|
-
})
|
17
|
+
cli_option :lambda, 'rate param', {type: :float, default: 1.0}
|
18
|
+
|
19
|
+
cli_banner "Exponential distribution. Generate numbers following a exponential distribution for a given lambda rate"
|
23
20
|
|
24
21
|
inv_cdf do |n|
|
25
22
|
(-1 / lambda) * Math.log(1 - n)
|
@@ -29,10 +26,6 @@ module Croupier
|
|
29
26
|
super(options)
|
30
27
|
raise Croupier::InputParamsError, "lambda cannot be negative" if params[:lambda] <= 0
|
31
28
|
end
|
32
|
-
|
33
|
-
def lambda
|
34
|
-
params[:lambda]
|
35
|
-
end
|
36
29
|
end
|
37
30
|
end
|
38
31
|
end
|
@@ -13,30 +13,21 @@ module Croupier
|
|
13
13
|
|
14
14
|
cli_name "gamma"
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
[:shape, 'shape of the distribution', {type: :float, default: 1.0}],
|
19
|
-
[:scale, 'scale of the distribution', {type: :float, default: 1.0}]
|
20
|
-
],
|
21
|
-
banner: "Family of continuous distributions with two parameters, shape and scale."
|
22
|
-
})
|
16
|
+
cli_option :shape, 'shape of the distribution', {type: :float, default: 1.0}
|
17
|
+
cli_option :scale, 'scale of the distribution', {type: :float, default: 1.0}
|
23
18
|
|
24
|
-
|
25
|
-
c.degenerate(constant: scale).to_enum.lazy.zip(xi_enum, adjust_enum).map do |s,x,a|
|
26
|
-
s * (x - a)
|
27
|
-
end
|
28
|
-
end
|
19
|
+
cli_banner "Family of continuous distributions with two parameters, shape and scale."
|
29
20
|
|
30
|
-
|
31
|
-
|
21
|
+
enumerator do |c|
|
22
|
+
c.degenerate(constant: scale).zip(xi_enum, adjust_enum)
|
32
23
|
end
|
33
24
|
|
34
|
-
|
35
|
-
|
25
|
+
adjust do |scale, xi, adj|
|
26
|
+
scale * (xi - adj)
|
36
27
|
end
|
37
28
|
|
38
|
-
def
|
39
|
-
|
29
|
+
def initialize(options={})
|
30
|
+
super(options)
|
40
31
|
end
|
41
32
|
|
42
33
|
def delta
|
@@ -18,12 +18,9 @@ module Croupier
|
|
18
18
|
|
19
19
|
cli_name "geometric"
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
],
|
25
|
-
banner: "Geometric distribution. Discrete probability distribution that expresses the number of X Bernoulli trials needed to get one success, supported on the set { 1, 2, 3, ...} }"
|
26
|
-
})
|
21
|
+
cli_option :success, 'success probability of each trial', {type: :float, short: "-p", default: 0.5}
|
22
|
+
|
23
|
+
cli_banner "Geometric distribution. Discrete probability distribution that expresses the number of X Bernoulli trials needed to get one success, supported on the set { 1, 2, 3, ...} }"
|
27
24
|
|
28
25
|
# Fair point: it is not the inverse of the cdf,
|
29
26
|
# but it generates the distribution from an uniform.
|
@@ -35,10 +32,6 @@ module Croupier
|
|
35
32
|
super(options)
|
36
33
|
raise Croupier::InputParamsError, "Probability of success must be in the interval [0,1]" if params[:success] > 1 || params[:success] < 0
|
37
34
|
end
|
38
|
-
|
39
|
-
def success
|
40
|
-
params[:success]
|
41
|
-
end
|
42
35
|
end
|
43
36
|
end
|
44
37
|
end
|
@@ -16,16 +16,12 @@ module Croupier
|
|
16
16
|
|
17
17
|
cli_name "nbinomial"
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
[:success, 'success probability of each trial', {type: :float, short: "-p", default: 0.5}]
|
23
|
-
],
|
24
|
-
banner: "Negative binomial distribution. Discrete probability distribution of the number of successes in a sequence of Bernoulli trials before a specified (non-random) number of failures (denoted size) occur."
|
25
|
-
})
|
19
|
+
cli_option :size, 'number of errors', {type: :integer, default: 1}
|
20
|
+
cli_option :success, 'success probability of each trial', {type: :float, short: "-p", default: 0.5}
|
21
|
+
cli_banner "Negative binomial distribution. Discrete probability distribution of the number of successes in a sequence of Bernoulli trials before a specified (non-random) number of failures (denoted size) occur."
|
26
22
|
|
27
23
|
enumerator do |c|
|
28
|
-
c.geometric(success: success).
|
24
|
+
c.geometric(success: success).each_slice(size).map do |x|
|
29
25
|
x.inject(-size,&:+)
|
30
26
|
end
|
31
27
|
end
|
@@ -34,14 +30,6 @@ module Croupier
|
|
34
30
|
super(options)
|
35
31
|
raise Croupier::InputParamsError, "Probability of success must be in the interval [0,1]" if params[:success] > 1 || params[:success] < 0
|
36
32
|
end
|
37
|
-
|
38
|
-
def success
|
39
|
-
params[:success]
|
40
|
-
end
|
41
|
-
|
42
|
-
def size
|
43
|
-
params[:size]
|
44
|
-
end
|
45
33
|
end
|
46
34
|
end
|
47
35
|
end
|
@@ -14,13 +14,10 @@ module Croupier
|
|
14
14
|
|
15
15
|
cli_name "normal"
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
],
|
22
|
-
banner: "Normal distribution. Generate numbers following a continuous distribution in the real line with mean :mean and standard deviation :std."
|
23
|
-
})
|
17
|
+
cli_option :mean, 'mean of the distribution', {type: :float, default: 0.0}
|
18
|
+
cli_option :std, 'standard deviation of the distribution', {type: :float, default: 1.0}
|
19
|
+
|
20
|
+
cli_banner "Normal distribution. Generate numbers following a continuous distribution in the real line with mean :mean and standard deviation :std."
|
24
21
|
|
25
22
|
minimum_sample do
|
26
23
|
x, y = 1 - ::Croupier.rand, 1 - ::Croupier.rand
|
@@ -30,22 +27,18 @@ module Croupier
|
|
30
27
|
]
|
31
28
|
end
|
32
29
|
|
33
|
-
|
34
|
-
|
30
|
+
# Adjust std
|
31
|
+
adjust do |n|
|
32
|
+
n * std
|
35
33
|
end
|
36
34
|
|
37
|
-
|
38
|
-
|
35
|
+
# Adjust mean
|
36
|
+
adjust do |n|
|
37
|
+
n + mean
|
39
38
|
end
|
40
39
|
|
41
|
-
def
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
def to_enum
|
46
|
-
@generator.to_enum.
|
47
|
-
map {|x| x * std}. # Adjust standard deviation
|
48
|
-
map {|x| x + mean} # Adjust mean
|
40
|
+
def initialize(options={})
|
41
|
+
super(options)
|
49
42
|
end
|
50
43
|
end
|
51
44
|
end
|
@@ -17,12 +17,9 @@ module Croupier
|
|
17
17
|
|
18
18
|
cli_name "poisson"
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
],
|
24
|
-
banner: "Poisson distribution. Discrete probability distribution that expresses the probability of a given number of events occurring in a fixed interval of time."
|
25
|
-
})
|
20
|
+
cli_option :lambda, 'rate parameter (equal to the mean of the distribution)', {type: :integer, default: 50}
|
21
|
+
|
22
|
+
cli_banner "Poisson distribution. Discrete probability distribution that expresses the probability of a given number of events occurring in a fixed interval of time."
|
26
23
|
|
27
24
|
enumerator_block do |y|
|
28
25
|
l = Math.exp(-lambda)
|
@@ -39,10 +36,6 @@ module Croupier
|
|
39
36
|
def initialize(options={})
|
40
37
|
super(options)
|
41
38
|
end
|
42
|
-
|
43
|
-
def lambda
|
44
|
-
params[:lambda]
|
45
|
-
end
|
46
39
|
end
|
47
40
|
end
|
48
41
|
end
|
@@ -13,14 +13,11 @@ module Croupier
|
|
13
13
|
|
14
14
|
cli_name "triangular"
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
],
|
22
|
-
banner: "Triangular distribution. Continuous distribution whose support is the interval (a,b), with mode c."
|
23
|
-
})
|
16
|
+
cli_option :lower, 'lower limit', {type: :float, short: '-a', default: 0.0}
|
17
|
+
cli_option :upper, 'upper limit', {type: :float, short: '-b', default: 1.0}
|
18
|
+
cli_option :mode, 'mode', {type: :float, short: '-c', default: 0.5}
|
19
|
+
|
20
|
+
cli_banner "Triangular distribution. Continuous distribution whose support is the interval (a,b), with mode c."
|
24
21
|
|
25
22
|
inv_cdf do |n|
|
26
23
|
if n < @F_c
|
@@ -33,28 +30,16 @@ module Croupier
|
|
33
30
|
def initialize(options={})
|
34
31
|
super(options)
|
35
32
|
if params[:lower] >= params[:upper]
|
36
|
-
warn("Lower limit is greater than upper limit. Changing their values.")
|
33
|
+
::Croupier.warn("Lower limit is greater than upper limit. Changing their values.")
|
37
34
|
params[:lower], params[:upper] = params[:upper], params[:lower]
|
38
35
|
end
|
39
36
|
if params[:mode] < params[:lower] || params[:upper] < params[:mode]
|
40
|
-
warn("Mode is not in the support. Mode value will be change to median.")
|
37
|
+
::Croupier.warn("Mode is not in the support. Mode value will be change to median.")
|
41
38
|
params[:mode] = (params[:lower]+params[:upper])/2.0;
|
42
39
|
end
|
43
40
|
@F_c = (params[:mode]-params[:lower]).to_f/(params[:upper]-params[:lower])
|
44
41
|
end
|
45
42
|
|
46
|
-
def lower
|
47
|
-
params[:lower]
|
48
|
-
end
|
49
|
-
|
50
|
-
def upper
|
51
|
-
params[:upper]
|
52
|
-
end
|
53
|
-
|
54
|
-
def mode
|
55
|
-
params[:mode]
|
56
|
-
end
|
57
|
-
|
58
43
|
def range
|
59
44
|
@range ||= upper - lower
|
60
45
|
end
|
@@ -14,13 +14,24 @@ module Croupier
|
|
14
14
|
|
15
15
|
cli_name "uniform"
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
cli_option :included, 'interval included value', {type: :float, short: "-i", default: 0.0}
|
18
|
+
cli_option :excluded, 'interval excluded value', {type: :float, short: "-e", default: 1.0}
|
19
|
+
|
20
|
+
cli_banner "Uniform distribution. Generate numbers following a continuous distribution on [a,b] (given a=min(included, excluded) and b=max(included,excluded)) where all points in the interval are equally likely."
|
21
|
+
|
22
|
+
enumerator_block do |y|
|
23
|
+
loop do
|
24
|
+
y << ::Croupier.rand
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
adjust do |n|
|
29
|
+
exclude_value.(n)
|
30
|
+
end
|
31
|
+
|
32
|
+
adjust do |n|
|
33
|
+
min + range * n
|
34
|
+
end
|
24
35
|
|
25
36
|
def initialize(options={})
|
26
37
|
super options
|
@@ -40,24 +51,7 @@ module Croupier
|
|
40
51
|
attr_reader :exclude_value, :min, :max, :range
|
41
52
|
|
42
53
|
def inverted?
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
def to_enum
|
47
|
-
@enum ||= base_enum.lazy.
|
48
|
-
map(&exclude_value).
|
49
|
-
map do |n|
|
50
|
-
min + range * n
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
protected
|
55
|
-
def base_enum
|
56
|
-
Enumerator.new do |y|
|
57
|
-
loop do
|
58
|
-
y << Croupier.rand
|
59
|
-
end
|
60
|
-
end
|
54
|
+
included > excluded
|
61
55
|
end
|
62
56
|
end
|
63
57
|
end
|
data/lib/croupier/version.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
3
|
|
4
|
-
class TestDistributionClassClassMethods <
|
4
|
+
class TestDistributionClassClassMethods < Minitest::Test
|
5
|
+
|
6
|
+
def distribution_subclass
|
7
|
+
Class.new ::Croupier::Distribution
|
8
|
+
end
|
5
9
|
|
6
10
|
def distribution_subclass_with_name name
|
7
11
|
Class.new Croupier::Distribution do
|
@@ -33,6 +37,12 @@ class TestDistributionClassClassMethods < MiniTest::Unit::TestCase
|
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
40
|
+
def distribution_subclass_with_cli_banner banner
|
41
|
+
Class.new Croupier::Distribution do
|
42
|
+
cli_banner banner
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
36
46
|
def distribution_subclass_with_cli_name name
|
37
47
|
Class.new Croupier::Distribution do
|
38
48
|
cli_name name
|
@@ -78,6 +88,65 @@ class TestDistributionClassClassMethods < MiniTest::Unit::TestCase
|
|
78
88
|
assert_nil Croupier::Distribution.cli_name
|
79
89
|
end
|
80
90
|
|
91
|
+
def test_cli_banner_setter_adds_the_cli_banner
|
92
|
+
a = distribution_subclass_with_cli_banner "Instructions for use of this Distribution"
|
93
|
+
assert_equal "Instructions for use of this Distribution", a.cli_options[:banner]
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_cli_banner_sets_separated_banners_for_each_subclass
|
97
|
+
a = distribution_subclass_with_cli_banner "a"
|
98
|
+
b = distribution_subclass_with_cli_banner "b"
|
99
|
+
assert_equal "a", a.cli_options[:banner]
|
100
|
+
assert_equal "b", b.cli_options[:banner]
|
101
|
+
assert_nil Croupier::Distribution.cli_options[:banner]
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_cli_option_setter_adds_a_cli_option
|
105
|
+
option = [:abc, "prints ABC", {}]
|
106
|
+
a = distribution_subclass_with_name "Test"
|
107
|
+
a.cli_option option[0], option[1], option[2]
|
108
|
+
assert_equal [option], a.cli_options[:options]
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_cli_option_does_not_delete_previous_cli_options
|
112
|
+
opts = {banner: 'Hey', options: [[:a, "A", {type: :boolean}], [:b, "B", {type: :float}]]}
|
113
|
+
option = [:abc, "prints ABC", {}]
|
114
|
+
a = distribution_subclass_with_cli_options opts
|
115
|
+
a.cli_option option[0], option[1], option[2]
|
116
|
+
assert_equal (opts[:options] << option), a.cli_options[:options]
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_cli_option_adds_separated_option_for_each_subclass
|
120
|
+
optionA = [:abc, "prints ABC", {}]
|
121
|
+
optionB = [:xyz, "prints XYZ", {type: :boolean}]
|
122
|
+
a = distribution_subclass_with_name "A"
|
123
|
+
b = distribution_subclass_with_name "B"
|
124
|
+
a.cli_option optionA[0], optionA[1], optionA[2]
|
125
|
+
b.cli_option optionB[0], optionB[1], optionB[2]
|
126
|
+
assert_equal [optionA], a.cli_options[:options]
|
127
|
+
assert_equal [optionB], b.cli_options[:options]
|
128
|
+
assert_empty Croupier::Distribution.cli_options
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_cli_option_adds_instance_method
|
132
|
+
a = distribution_subclass_with_name "A"
|
133
|
+
a.cli_option :cowabunga, "TMNT", {type: :float}
|
134
|
+
assert_respond_to a.new, :cowabunga
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_cli_options_adds_instance_method_with_modified_name
|
138
|
+
a = distribution_subclass_with_name "A"
|
139
|
+
a.cli_option :are_you_my_mummy, "Doctor Who", {type: :boolean}
|
140
|
+
assert_respond_to a.new, :are_you_my_mummy?
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_cli_option_defines_an_accessor
|
144
|
+
a = distribution_subclass_with_name "A"
|
145
|
+
a.cli_option :cowabunga, "TMNT", {type: :float}
|
146
|
+
instance = a.new cowabunga: 1.3
|
147
|
+
assert_equal 1.3, instance.cowabunga
|
148
|
+
end
|
149
|
+
|
81
150
|
def test_cli_options_setter_adds_the_options
|
82
151
|
opts = Hash.new
|
83
152
|
a = distribution_subclass_with_cli_options opts
|
@@ -139,4 +208,49 @@ class TestDistributionClassClassMethods < MiniTest::Unit::TestCase
|
|
139
208
|
assert_equal pb, b.generator_block
|
140
209
|
assert_nil Croupier::Distribution.generator_block
|
141
210
|
end
|
211
|
+
|
212
|
+
def test_adjustments_is_empty_at_first
|
213
|
+
a = distribution_subclass
|
214
|
+
assert_empty a.adjustments, "Adjustments are not empty"
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_adjustment_add_proc_to_adjustments_in_order
|
218
|
+
a = distribution_subclass
|
219
|
+
proc1 = -> { 1 }
|
220
|
+
proc2 = -> { 2 }
|
221
|
+
a.adjust &proc1
|
222
|
+
a.adjust &proc2
|
223
|
+
assert_equal 2, a.adjustments.length
|
224
|
+
assert_equal proc1, a.adjustments.first
|
225
|
+
assert_equal proc2, a.adjustments.last
|
226
|
+
end
|
227
|
+
|
228
|
+
def test_adjustment_adds_separated_adjustment_for_different_subclasses
|
229
|
+
a = distribution_subclass
|
230
|
+
a.adjust do |x| 1 end
|
231
|
+
b = distribution_subclass
|
232
|
+
b.adjust do |x| 2 end
|
233
|
+
|
234
|
+
assert a.adjustments != b.adjustments
|
235
|
+
assert_empty distribution_subclass.adjustments
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_adjustments_are_called_in_order
|
239
|
+
a = distribution_subclass
|
240
|
+
a.enumerator_block do |y|
|
241
|
+
num = 0
|
242
|
+
loop do
|
243
|
+
num += 1; y << num
|
244
|
+
end
|
245
|
+
end
|
246
|
+
a.adjust do |n|
|
247
|
+
n + 3
|
248
|
+
end
|
249
|
+
|
250
|
+
a.adjust do |n|
|
251
|
+
n * 2
|
252
|
+
end
|
253
|
+
|
254
|
+
assert_equal [8, 10, 12], a.new.take(3)
|
255
|
+
end
|
142
256
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
|
-
class TestDistributionClassInstanceMethods <
|
3
|
+
class TestDistributionClassInstanceMethods < Minitest::Test
|
4
4
|
|
5
5
|
def test_distribution_has_name_and_description
|
6
6
|
dist = Croupier::Distribution.new
|
@@ -53,4 +53,22 @@ class TestDistributionClassInstanceMethods < MiniTest::Unit::TestCase
|
|
53
53
|
d = c.new
|
54
54
|
assert_kind_of ::Croupier::DistributionGenerators::InverseCDFGenerator, d.generator
|
55
55
|
end
|
56
|
+
|
57
|
+
# What The Fuck
|
58
|
+
# Making ::Croupier::Distribution a subclass of Enumerator::Lazy
|
59
|
+
# is a fucking hell. Impossible, as far as I am concerned.
|
60
|
+
# Yes, I can say fucking since trying to do so made MRI to break
|
61
|
+
# and cry like Captain Hammer at the end of Dr. Horrible.
|
62
|
+
# If Enumerable gets just included, we lose the lazy part.
|
63
|
+
#
|
64
|
+
# My solution, bang my head against the train window and then
|
65
|
+
# delegate all the methods to the enum.
|
66
|
+
def test_distribution_is_enumerable
|
67
|
+
dist = ::Croupier::Distribution.new
|
68
|
+
|
69
|
+
assert_respond_to dist, :each, "distribution does not respond to each"
|
70
|
+
Enumerable.instance_methods.each do |method|
|
71
|
+
assert_respond_to dist, method, "distribution does not respond to #{method}"
|
72
|
+
end
|
73
|
+
end
|
56
74
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
3
|
|
4
|
-
class DistributionGeneratorClassClassMethods <
|
4
|
+
class DistributionGeneratorClassClassMethods < Minitest::Test
|
5
5
|
|
6
6
|
def create_generator_with_method_name name
|
7
7
|
Class.new Croupier::DistributionGenerator do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
|
-
class TestDegenerateDistribution <
|
3
|
+
class TestDegenerateDistribution < Minitest::Test
|
4
4
|
|
5
5
|
def test_distribution_has_name_and_description
|
6
6
|
dist = Croupier::Distributions::Degenerate.new
|
@@ -8,6 +8,11 @@ class TestDegenerateDistribution < MiniTest::Unit::TestCase
|
|
8
8
|
assert_respond_to dist, 'description'
|
9
9
|
end
|
10
10
|
|
11
|
+
def test_constant_returns_current_distribution_constant
|
12
|
+
dist = Croupier::Distributions::Degenerate.new constant: "Macarena"
|
13
|
+
assert_equal "Macarena", dist.constant
|
14
|
+
end
|
15
|
+
|
11
16
|
def test_returns_only_one_value
|
12
17
|
dist = Croupier::Distributions::Degenerate.new constant: 5.34
|
13
18
|
5.times do
|
@@ -1,11 +1,19 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
|
-
class TestTriangularDistribution <
|
3
|
+
class TestTriangularDistribution < Minitest::Test
|
4
4
|
|
5
5
|
def triangular(opts={})
|
6
6
|
::Croupier::Distributions.triangular(opts)
|
7
7
|
end
|
8
8
|
|
9
|
+
def setup
|
10
|
+
::Croupier.deactivate_warnings
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
::Croupier.activate_warnings
|
15
|
+
end
|
16
|
+
|
9
17
|
def test_change_lower_and_upper_values_if_they_are_not_in_the_right_order
|
10
18
|
t = triangular lower: 8, upper: 3, mode: 4
|
11
19
|
assert_equal 3, t.lower, "lower is not 3"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
|
-
class TestCroupierModule <
|
3
|
+
class TestCroupierModule < Minitest::Test
|
4
4
|
|
5
5
|
def test_module_manages_a_croupier_cli_application_object
|
6
6
|
app = Croupier.application
|
@@ -12,5 +12,4 @@ class TestCroupierModule < MiniTest::Unit::TestCase
|
|
12
12
|
Croupier.application = app
|
13
13
|
assert Croupier.application == app
|
14
14
|
end
|
15
|
-
|
16
15
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
3
|
|
4
|
-
class TestDistributionGeneratorsModule <
|
4
|
+
class TestDistributionGeneratorsModule < Minitest::Test
|
5
5
|
|
6
6
|
def test_list_of_all_distribution_generators
|
7
7
|
all = Croupier::DistributionGenerators.all
|
@@ -27,7 +27,7 @@ class TestDistributionGeneratorsModule < MiniTest::Unit::TestCase
|
|
27
27
|
assert_includes list, d.method_name, "#{d.method_name} not included in list"
|
28
28
|
}
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def test_all_and_list_have_same_size
|
32
32
|
all = Croupier::DistributionGenerators.all
|
33
33
|
list = Croupier::DistributionGenerators.list
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
|
-
class TestDistributionsModule <
|
3
|
+
class TestDistributionsModule < Minitest::Test
|
4
4
|
|
5
5
|
def test_list_of_all_distributions
|
6
6
|
all = Croupier::Distributions.all
|
@@ -25,13 +25,13 @@ class TestDistributionsModule < MiniTest::Unit::TestCase
|
|
25
25
|
assert list.include?(d.cli_name), "#{d.cli_name} not included in list"
|
26
26
|
}
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def test_all_and_list_have_same_size
|
30
30
|
all = Croupier::Distributions.all
|
31
31
|
list = Croupier::Distributions.list
|
32
32
|
assert list.size == all.size
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def test_dynamic_distribution_methods
|
36
36
|
Croupier::Distributions.list.each{|method|
|
37
37
|
assert Croupier::Distributions.respond_to?(method), "No response for #{method} method"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: croupier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juanjo Bazán
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-22 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Croupier is a Ruby gem to generate a random sample of numbers with a
|
15
15
|
given probability distribution.
|