croupier 1.6.0 → 2.0.0.rc1
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 +7 -0
- data/README.md +2 -2
- data/Rakefile +7 -0
- data/lib/croupier/distribution.rb +115 -36
- data/lib/croupier/distribution_generator.rb +57 -0
- data/lib/croupier/distribution_generators/enumerator_block_generator.rb +23 -0
- data/lib/croupier/distribution_generators/enumerator_generator.rb +21 -0
- data/lib/croupier/distribution_generators/inverse_cdf_generator.rb +21 -0
- data/lib/croupier/distribution_generators/minimum_sample_generator.rb +24 -0
- data/lib/croupier/distribution_generators.rb +18 -0
- data/lib/croupier/distributions/bernoulli.rb +18 -25
- data/lib/croupier/distributions/binomial.rb +30 -29
- data/lib/croupier/distributions/cauchy.rb +22 -19
- data/lib/croupier/distributions/credit_card.rb +39 -29
- data/lib/croupier/distributions/degenerate.rb +16 -19
- data/lib/croupier/distributions/exponential.rb +18 -19
- data/lib/croupier/distributions/gamma.rb +66 -37
- data/lib/croupier/distributions/geometric.rb +19 -20
- data/lib/croupier/distributions/nbinomial.rb +22 -33
- data/lib/croupier/distributions/normal.rb +30 -34
- data/lib/croupier/distributions/poisson.rb +26 -25
- data/lib/croupier/distributions/triangular.rb +39 -25
- data/lib/croupier/distributions/uniform.rb +43 -19
- data/lib/croupier/distributions.rb +3 -4
- data/lib/croupier/version.rb +1 -1
- data/lib/croupier.rb +43 -6
- data/test/minitest/distribution_class/test_class_methods.rb +142 -0
- data/test/{test_distribution_class.rb → minitest/distribution_class/test_instance_methods.rb} +26 -28
- data/test/minitest/distribution_generator_class/test_class_methods.rb +24 -0
- data/test/minitest/distribution_generator_class/test_instance_methods.rb +35 -0
- data/test/minitest/distribution_generators/test_enumerator_block_generator.rb +31 -0
- data/test/minitest/distribution_generators/test_enumerator_generator.rb +33 -0
- data/test/minitest/distribution_generators/test_inverse_cdf_generator.rb +36 -0
- data/test/minitest/distribution_generators/test_minimum_sample_generator.rb +33 -0
- data/test/minitest/distributions/test_bernoulli_distribution.rb +13 -0
- data/test/minitest/distributions/test_binomial_distribution.rb +18 -0
- data/test/minitest/distributions/test_cauchy_distribution.rb +18 -0
- data/test/{distributions/minitest/test_credit_card.rb → minitest/distributions/test_credit_card_distribution.rb} +5 -0
- data/test/{distributions/minitest → minitest/distributions}/test_degenerate_distribution.rb +2 -2
- data/test/minitest/distributions/test_exponential_distribution.rb +13 -0
- data/test/minitest/distributions/test_gamma_distribution.rb +23 -0
- data/test/minitest/distributions/test_geometric_distribution.rb +13 -0
- data/test/minitest/distributions/test_normal_distribution.rb +17 -0
- data/test/minitest/distributions/test_poisson_distribution.rb +13 -0
- data/test/minitest/distributions/test_triangular_distribution.rb +26 -0
- data/test/minitest/distributions/test_uniform_distribution.rb +54 -0
- data/test/{test_croupier_module.rb → minitest/test_croupier_module.rb} +0 -0
- data/test/minitest/test_distribution_generators_module.rb +37 -0
- data/test/{test_distributions_module.rb → minitest/test_distributions_module.rb} +0 -0
- data/test/rtests.R +1 -0
- metadata +62 -44
- data/test/distributions/R_tests/test_bernoulli.R +0 -17
- data/test/distributions/R_tests/test_binomial.R +0 -17
- data/test/distributions/R_tests/test_cauchy.R +0 -28
- data/test/distributions/R_tests/test_exponential.R +0 -28
- data/test/distributions/R_tests/test_gamma.R +0 -27
- data/test/distributions/R_tests/test_geometric.R +0 -23
- data/test/distributions/R_tests/test_nbinomial.R +0 -17
- data/test/distributions/R_tests/test_normal.R +0 -52
- data/test/distributions/R_tests/test_poisson.R +0 -17
- data/test/distributions/R_tests/test_triangular.R +0 -28
- data/test/distributions/R_tests/test_uniform.R +0 -30
- data/test/testsuite.R +0 -37
@@ -4,9 +4,9 @@ module Croupier
|
|
4
4
|
class << self
|
5
5
|
# An array containing all available Distribution classes
|
6
6
|
def all
|
7
|
-
::Croupier::Distributions.constants(false).
|
7
|
+
::Croupier::Distributions.constants(false).each_with_object([]){|distrib, list|
|
8
8
|
d = ::Croupier::Distributions.const_get(distrib)
|
9
|
-
(d.is_a?(Class) && d.superclass == Croupier::Distribution)
|
9
|
+
list << d if (d.is_a?(Class) && d.superclass == Croupier::Distribution)
|
10
10
|
}.uniq.compact
|
11
11
|
end
|
12
12
|
|
@@ -17,7 +17,7 @@ module Croupier
|
|
17
17
|
|
18
18
|
def method_missing(method, *args, &block) # :nodoc:
|
19
19
|
return super unless self.respond_to?(method)
|
20
|
-
self.all.
|
20
|
+
self.all.find{|d| d.cli_name == method.to_s}.new(*args)
|
21
21
|
end
|
22
22
|
|
23
23
|
def respond_to?(method, include_private = false) # :nodoc:
|
@@ -25,5 +25,4 @@ module Croupier
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
|
-
|
29
28
|
end
|
data/lib/croupier/version.rb
CHANGED
data/lib/croupier.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
require_relative 'croupier/version'
|
2
|
+
require_relative 'croupier/cli/trollop'
|
3
|
+
require_relative 'croupier/exceptions'
|
4
|
+
require_relative 'croupier/distribution_generator'
|
5
|
+
require_relative 'croupier/distribution_generators'
|
6
|
+
Dir[File.join(File.dirname(__FILE__), "./croupier/distribution_generators/*.rb")].each {|f| require f}
|
7
|
+
require_relative 'croupier/distribution'
|
8
|
+
require_relative 'croupier/distributions'
|
6
9
|
Dir[File.join(File.dirname(__FILE__), "./croupier/distributions/*.rb")].each {|f| require f}
|
7
|
-
|
10
|
+
require_relative 'croupier/cli/application'
|
8
11
|
#####################################################################
|
9
12
|
# Croupier module.
|
10
13
|
# Used as a namespace containing all the Croupier code.
|
@@ -62,5 +65,39 @@ module Croupier
|
|
62
65
|
Croupier.stop("\nCroupier Exiting... Interrupt signal received.")
|
63
66
|
end
|
64
67
|
end
|
68
|
+
|
69
|
+
## Random generator related stuff.
|
70
|
+
|
71
|
+
# Same as Random#rand applied to Croupier random object.
|
72
|
+
#
|
73
|
+
# @return random number x, 0 <= x < 1
|
74
|
+
def rand *args
|
75
|
+
random.rand *args
|
76
|
+
end
|
77
|
+
|
78
|
+
# Sets Croupier random generator to a new object
|
79
|
+
# with provided seed.
|
80
|
+
# If seed is omitted, a new Random object is created
|
81
|
+
# without explicit seed.
|
82
|
+
# @param seed [Numeric] optional seed
|
83
|
+
# @return [NilClass] nil
|
84
|
+
def srand(seed=nil)
|
85
|
+
@random_generator = seed ? Random.new(seed) : Random.new
|
86
|
+
nil
|
87
|
+
end
|
88
|
+
|
89
|
+
# Croupier Random object
|
90
|
+
#
|
91
|
+
# @return [Random] croupier random object
|
92
|
+
def random
|
93
|
+
@random_generator ||= Random.new
|
94
|
+
end
|
95
|
+
|
96
|
+
# Croupier Random object seed.
|
97
|
+
#
|
98
|
+
# @return [Numeric] croupier random object seed
|
99
|
+
def seed
|
100
|
+
random.seed
|
101
|
+
end
|
65
102
|
end
|
66
103
|
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'croupier'
|
3
|
+
|
4
|
+
class TestDistributionClassClassMethods < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def distribution_subclass_with_name name
|
7
|
+
Class.new Croupier::Distribution do
|
8
|
+
distribution_name name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def distribution_subclass_with_description description
|
13
|
+
Class.new Croupier::Distribution do
|
14
|
+
distribution_description description
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def distribution_subclass_with_generator_class klazz
|
19
|
+
Class.new Croupier::Distribution do
|
20
|
+
generator_class klazz
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def distribution_subclass_with_generator_block &block
|
25
|
+
Class.new Croupier::Distribution do
|
26
|
+
generator_block &block
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def distribution_subclass_with_cli_options opts
|
31
|
+
Class.new Croupier::Distribution do
|
32
|
+
cli_options opts
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def distribution_subclass_with_cli_name name
|
37
|
+
Class.new Croupier::Distribution do
|
38
|
+
cli_name name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_name_setter_adds_the_name
|
43
|
+
a = distribution_subclass_with_name "My name"
|
44
|
+
assert_equal "My name", a.distribution_name
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_name_sets_separated_names_for_each_subclass
|
48
|
+
a = distribution_subclass_with_name "A"
|
49
|
+
b = distribution_subclass_with_name "B"
|
50
|
+
assert_equal "A", a.distribution_name
|
51
|
+
assert_equal "B", b.distribution_name
|
52
|
+
assert_nil Croupier::Distribution.distribution_name
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_description_setter_adds_the_description
|
56
|
+
a = distribution_subclass_with_description "My desc"
|
57
|
+
assert_equal "My desc", a.distribution_description
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_description_sets_separated_descriptions_for_each_subclass
|
61
|
+
a = distribution_subclass_with_description "A"
|
62
|
+
b = distribution_subclass_with_description "B"
|
63
|
+
assert_equal "A", a.distribution_description
|
64
|
+
assert_equal "B", b.distribution_description
|
65
|
+
assert_nil Croupier::Distribution.distribution_description
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_cli_name_setter_adds_the_cli_name
|
69
|
+
a = distribution_subclass_with_cli_name "name"
|
70
|
+
assert_equal "name", a.cli_name
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_cli_name_sets_separated_names_for_each_subclass
|
74
|
+
a = distribution_subclass_with_cli_name "a"
|
75
|
+
b = distribution_subclass_with_cli_name "b"
|
76
|
+
assert_equal "a", a.cli_name
|
77
|
+
assert_equal "b", b.cli_name
|
78
|
+
assert_nil Croupier::Distribution.cli_name
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_cli_options_setter_adds_the_options
|
82
|
+
opts = Hash.new
|
83
|
+
a = distribution_subclass_with_cli_options opts
|
84
|
+
assert_equal opts, a.cli_options
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_default_parameters_correctly_computed_from_cli_options
|
88
|
+
opts = {banner: 'Something', options: [[:a, "A", {type: :float, default: 0.5}], [:b, "B", {type: :float, default: 0.7}]]}
|
89
|
+
a = distribution_subclass_with_cli_options opts
|
90
|
+
assert_equal 0.5, a.default_parameters[:a]
|
91
|
+
assert_equal 0.7, a.default_parameters[:b]
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_cli_options_sets_separated_cli_options_for_each_subclass
|
95
|
+
ha = Hash.new
|
96
|
+
hb = Hash.new
|
97
|
+
a = distribution_subclass_with_cli_options ha
|
98
|
+
b = distribution_subclass_with_cli_options hb
|
99
|
+
assert_equal ha, a.cli_options
|
100
|
+
assert_equal hb, b.cli_options
|
101
|
+
assert_empty Croupier::Distribution.cli_options
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_responds_to_generators_methods
|
105
|
+
assert_respond_to ::Croupier::Distribution, 'inv_cdf'
|
106
|
+
assert_respond_to ::Croupier::Distribution, 'minimum_sample'
|
107
|
+
assert_respond_to ::Croupier::Distribution, 'enumerator_block'
|
108
|
+
assert_respond_to ::Croupier::Distribution, 'enumerator'
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_generator_class_setter_adds_generator_class
|
112
|
+
klazz = Class.new
|
113
|
+
a = distribution_subclass_with_generator_class klazz
|
114
|
+
assert_equal klazz, a.generator_class
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_generator_class_sets_separated_classes_for_each_subclass
|
118
|
+
ka = Class.new
|
119
|
+
kb = Class.new
|
120
|
+
a = distribution_subclass_with_generator_class ka
|
121
|
+
b = distribution_subclass_with_generator_class kb
|
122
|
+
assert_equal ka, a.generator_class
|
123
|
+
assert_equal kb, b.generator_class
|
124
|
+
assert_nil Croupier::Distribution.generator_class
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_generator_block_setter_adds_generator_class
|
128
|
+
block = -> { 2 }
|
129
|
+
a = distribution_subclass_with_generator_block &block
|
130
|
+
assert_equal block, a.generator_block
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_generator_block_sets_separated_blocks_for_each_subclass
|
134
|
+
pa = -> { 2 }
|
135
|
+
pb = -> { 3 }
|
136
|
+
a = distribution_subclass_with_generator_block &pa
|
137
|
+
b = distribution_subclass_with_generator_block &pb
|
138
|
+
assert_equal pa, a.generator_block
|
139
|
+
assert_equal pb, b.generator_block
|
140
|
+
assert_nil Croupier::Distribution.generator_block
|
141
|
+
end
|
142
|
+
end
|
data/test/{test_distribution_class.rb → minitest/distribution_class/test_instance_methods.rb}
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
|
-
class
|
3
|
+
class TestDistributionClassInstanceMethods < MiniTest::Unit::TestCase
|
4
4
|
|
5
5
|
def test_distribution_has_name_and_description
|
6
6
|
dist = Croupier::Distribution.new
|
@@ -8,10 +8,26 @@ class TestDistributionClass < MiniTest::Unit::TestCase
|
|
8
8
|
assert_respond_to dist, 'description'
|
9
9
|
end
|
10
10
|
|
11
|
+
def test_name_returns_distribution_name
|
12
|
+
dist = Class.new Croupier::Distribution do
|
13
|
+
distribution_name "Dist"
|
14
|
+
end
|
15
|
+
sample = dist.new
|
16
|
+
assert_equal "Dist", sample.name
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_description_returns_distribution_description
|
20
|
+
dist = Class.new Croupier::Distribution do
|
21
|
+
distribution_description "Desc"
|
22
|
+
end
|
23
|
+
sample = dist.new
|
24
|
+
assert_equal "Desc", sample.description
|
25
|
+
end
|
26
|
+
|
11
27
|
def test_distribution_accepts_parameter_configuration
|
12
28
|
dist = Croupier::Distribution.new
|
13
29
|
assert_equal dist.parameters, dist.default_parameters
|
14
|
-
dist.configure({:
|
30
|
+
dist.configure({larry: 'bird', leonard: 'euler'})
|
15
31
|
refute_equal dist.parameters, dist.default_parameters
|
16
32
|
assert_equal dist.parameters[:larry], 'bird'
|
17
33
|
assert_equal dist.parameters[:leonard], 'euler'
|
@@ -23,36 +39,18 @@ class TestDistributionClass < MiniTest::Unit::TestCase
|
|
23
39
|
end
|
24
40
|
|
25
41
|
def test_distribution_generates_array_of_n_results
|
26
|
-
|
27
|
-
|
28
|
-
assert_equal a.generate_sample(15).size, 15
|
42
|
+
u = Croupier::Distributions.uniform
|
43
|
+
assert_equal u.generate_sample(15).size, 15
|
29
44
|
end
|
30
45
|
|
31
|
-
def
|
46
|
+
def test_initialize_creates_a_generator
|
32
47
|
c = Class.new(Croupier::Distribution) do
|
33
|
-
|
34
|
-
|
35
|
-
end
|
36
|
-
a = c.new
|
37
|
-
assert a.generate_number
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_generate_sample_calls_inv_cdf_if_present
|
41
|
-
c = Class.new(Croupier::Distribution) do
|
42
|
-
def inv_cdf n; true; end
|
43
|
-
def generate_number n; false; end
|
44
|
-
end
|
45
|
-
a = c.new
|
46
|
-
assert a.generate_sample(3).all?
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_generate_number_not_returning_array_when_inv_cdf_not_implemented
|
50
|
-
c = Class.new(Croupier::Distribution) do
|
51
|
-
def generate_sample n
|
52
|
-
[1]*n
|
48
|
+
inv_cdf do |n|
|
49
|
+
2
|
53
50
|
end
|
54
51
|
end
|
55
|
-
|
56
|
-
|
52
|
+
|
53
|
+
d = c.new
|
54
|
+
assert_kind_of ::Croupier::DistributionGenerators::InverseCDFGenerator, d.generator
|
57
55
|
end
|
58
56
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
|
4
|
+
class DistributionGeneratorClassClassMethods < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def create_generator_with_method_name name
|
7
|
+
Class.new Croupier::DistributionGenerator do
|
8
|
+
method_name name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_method_name_setter_sets_the_name
|
13
|
+
gen = create_generator_with_method_name "method_name"
|
14
|
+
assert_equal "method_name", gen.method_name
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_method_name_sets_different_names_for_each_subclass
|
18
|
+
a = create_generator_with_method_name "method_a"
|
19
|
+
b = create_generator_with_method_name "method_b"
|
20
|
+
assert_equal "method_a", a.method_name
|
21
|
+
assert_equal "method_b", b.method_name
|
22
|
+
assert_nil Croupier::DistributionGenerator.method_name
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
|
4
|
+
class DistributionGeneratorClassIntanceMethods < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@distribution = Croupier::Distribution.new
|
8
|
+
@params = @distribution.parameters
|
9
|
+
@block = Proc.new { }
|
10
|
+
@generator = Croupier::DistributionGenerator.new @distribution, &@block
|
11
|
+
def @generator.generate_minimum_sample
|
12
|
+
[1,2,3]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_parameters_returns_distribution_parameters
|
17
|
+
assert_same @params, @generator.params
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_distribution_accessor
|
21
|
+
assert_equal @distribution, @generator.distribution
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_block_accessor
|
25
|
+
assert_equal @block, @generator.block
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_croupier_method_returns_distributions
|
29
|
+
assert_same Croupier::Distributions, @generator.croupier
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_to_enum
|
33
|
+
assert_equal [1,2,3,1,2], @generator.to_enum.take(5)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
|
4
|
+
class TestEnumeratorBlockGenerator < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@klazz = Class.new(::Croupier::Distribution) do
|
8
|
+
def my_num
|
9
|
+
2
|
10
|
+
end
|
11
|
+
end
|
12
|
+
@distribution = @klazz.new
|
13
|
+
@block = ->(y) { y << my_num while true }
|
14
|
+
@gen = ::Croupier::DistributionGenerators::EnumeratorBlockGenerator.new @distribution, &@block
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_initialize_calls_super_and_it_works
|
18
|
+
assert_equal @distribution, @gen.distribution
|
19
|
+
assert_equal @block, @gen.block
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_to_enum_calls_the_block
|
23
|
+
assert_kind_of Enumerator, @gen.to_enum
|
24
|
+
assert_equal 2, @gen.to_enum.first
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_block_can_access_methods_in_distribution
|
28
|
+
assert_kind_of Enumerator, @gen.to_enum
|
29
|
+
assert_equal 2, @gen.to_enum.first
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
|
4
|
+
class TestEnumeratorGenerator < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@klazz = Class.new(::Croupier::Distribution) do
|
8
|
+
def my_num
|
9
|
+
2
|
10
|
+
end
|
11
|
+
end
|
12
|
+
@distribution = @klazz.new
|
13
|
+
@block = ->(c) { Enumerator.new do |y| loop do y << [c, my_num]; end; end }
|
14
|
+
@gen = ::Croupier::DistributionGenerators::EnumeratorGenerator.new @distribution, &@block
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_initialize_calls_super_and_it_works
|
18
|
+
assert_equal @distribution, @gen.distribution
|
19
|
+
assert_equal @block, @gen.block
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_to_enum_calls_the_block
|
23
|
+
assert_kind_of Enumerator, @gen.to_enum
|
24
|
+
mod, num = @gen.to_enum.first
|
25
|
+
assert_equal 2, num
|
26
|
+
assert_equal ::Croupier::Distributions, mod
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_block_can_access_methods_in_distribution
|
30
|
+
assert_kind_of Enumerator, @gen.to_enum
|
31
|
+
assert_equal 2, @gen.to_enum.first.last
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestInverseCdfGenerator < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@distribution = ::Croupier::Distribution.new
|
7
|
+
@block = ->(n) { 2+n }
|
8
|
+
@gen = ::Croupier::DistributionGenerators::InverseCDFGenerator.new @distribution, &@block
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_initialize_calls_super_and_it_works
|
12
|
+
assert_equal @distribution, @gen.distribution
|
13
|
+
assert_equal @block, @gen.block
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_to_enum_calls_the_block
|
17
|
+
@gen.to_enum.take(10).each do |n|
|
18
|
+
assert_operator 2, :<=, n, "#{n} is not at least 2"
|
19
|
+
assert_operator 3, :>, n, "#{n} is not strictly less than 3"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_block_can_access_methods_in_distribution
|
24
|
+
@distribution = Class.new(::Croupier::Distribution) do
|
25
|
+
def my_method n
|
26
|
+
2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
@block = ->(n) { my_method n }
|
31
|
+
|
32
|
+
@gen = ::Croupier::DistributionGenerators::InverseCDFGenerator.new @distribution.new, &@block
|
33
|
+
|
34
|
+
assert_equal [2,2,2,2], @gen.to_enum.take(4).to_a
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestMinimumSampleGenerator < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@distribution = ::Croupier::Distribution.new
|
7
|
+
@block = ->() { [1,2,3] }
|
8
|
+
@gen = ::Croupier::DistributionGenerators::MinimumSampleGenerator.new @distribution, &@block
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_initialize_calls_super_and_it_works
|
12
|
+
assert_equal @distribution, @gen.distribution
|
13
|
+
assert_equal @block, @gen.block
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_to_enum_calls_the_block
|
17
|
+
assert_equal [1,2,3,1,2,3,1], @gen.to_enum.take(7).to_a
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_block_can_access_methods_in_distribution
|
21
|
+
@distribution = Class.new(::Croupier::Distribution) do
|
22
|
+
def my_method
|
23
|
+
[1,2,3]
|
24
|
+
end
|
25
|
+
end.new
|
26
|
+
|
27
|
+
@block = ->() { my_method }
|
28
|
+
|
29
|
+
@gen = ::Croupier::DistributionGenerators::MinimumSampleGenerator.new @distribution, &@block
|
30
|
+
|
31
|
+
assert_equal [1,2,3,1], @gen.to_enum.take(4).to_a
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestBinomialDistribution < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def bernoulli *args
|
6
|
+
::Croupier::Distributions.bernoulli *args
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_success_returns_correct_success
|
10
|
+
b = bernoulli success: 0.3
|
11
|
+
assert_in_delta 0.3, b.success, 1e-10, "success is not right"
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestBinomialDistribution < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def binomial *args
|
6
|
+
::Croupier::Distributions.binomial *args
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_success_returns_correct_success
|
10
|
+
b = binomial size: 15, success: 0.3
|
11
|
+
assert_in_delta 0.3, b.success, 1e-10, "success is not right"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_size_returns_correct_size
|
15
|
+
b = binomial size: 15, success: 0.3
|
16
|
+
assert_equal 15, b.size
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestCauchyDistribution < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def cauchy *args
|
6
|
+
::Croupier::Distributions.cauchy *args
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_location_returns_correct_location
|
10
|
+
c = cauchy location: 3.1, scale: 5.2
|
11
|
+
assert_in_delta 3.1, c.location, 1e-10, "location is not right"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_scale_returns_correct_scale
|
15
|
+
c = cauchy location: 3.1, scale: 5.2
|
16
|
+
assert_in_delta 5.2, c.scale, 1e-10, "scale is not right"
|
17
|
+
end
|
18
|
+
end
|
@@ -16,6 +16,11 @@ class TestDistributionClass < MiniTest::Unit::TestCase
|
|
16
16
|
assert_respond_to dist, 'description'
|
17
17
|
end
|
18
18
|
|
19
|
+
def test_init_method
|
20
|
+
c = Croupier::Distributions::CreditCard.new visa: true, initial_values: "5678"
|
21
|
+
assert_equal "45678", c.init
|
22
|
+
end
|
23
|
+
|
19
24
|
def test_visa_starts_with_4
|
20
25
|
assert_equal "4", credit_card(visa: true)[0]
|
21
26
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "croupier"
|
3
|
-
class
|
3
|
+
class TestDegenerateDistribution < MiniTest::Unit::TestCase
|
4
4
|
|
5
5
|
def test_distribution_has_name_and_description
|
6
6
|
dist = Croupier::Distributions::Degenerate.new
|
@@ -18,6 +18,6 @@ class TestDistributionClass < MiniTest::Unit::TestCase
|
|
18
18
|
def test_to_enum
|
19
19
|
enum = Croupier::Distributions::Degenerate.new(constant: 5).to_enum
|
20
20
|
assert_kind_of Enumerator, enum
|
21
|
-
assert_equal [5,5,5], enum.take(3)
|
21
|
+
assert_equal [5,5,5], enum.take(3).to_a
|
22
22
|
end
|
23
23
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestExponentialDistribution < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def exponential *args
|
6
|
+
::Croupier::Distributions.exponential *args
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_lambda_returns_params_lambda
|
10
|
+
e = exponential lambda: 30.3
|
11
|
+
assert_in_delta 30.3, e.lambda, 1e-10, "lambda is not right"
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestGammaDistribution < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def gamma *args
|
6
|
+
::Croupier::Distributions.gamma *args
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_shape_returns_right_shape
|
10
|
+
g = gamma shape: 5.3, scale: 3.1
|
11
|
+
assert_in_delta 5.3, g.shape, 1e-10, "shape is not right"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_scale_returns_right_scale
|
15
|
+
g = gamma shape: 5.3, scale: 3.1
|
16
|
+
assert_in_delta 3.1, g.scale, 1e-10, "scale is not right"
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_delta_is_correct_delta
|
20
|
+
g = gamma shape: 5.3, scale: 3.1
|
21
|
+
assert_in_delta 0.3, g.delta, 1e-10, "delta is not right"
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestGeometricDistribution < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def geometric *args
|
6
|
+
::Croupier::Distributions.geometric *args
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_success_returns_success_param
|
10
|
+
g = geometric success: 0.7
|
11
|
+
assert_in_delta 0.7, g.success, 1e-10, "success is right param"
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestNormalDistribution < MiniTest::Unit::TestCase
|
4
|
+
def normal *args
|
5
|
+
::Croupier::Distributions.normal *args
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_mean_returns_mean
|
9
|
+
n = normal std: 1, mean: 23.2
|
10
|
+
assert_in_delta 23.2, n.mean, 1e-10, "mean is right"
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_std_returns_standard_deviation
|
14
|
+
n = normal std: 1.23, mean: 2
|
15
|
+
assert_in_delta 1.23, n.std, 1e-10, "standard deviation is right"
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "croupier"
|
3
|
+
class TestPoissonDistribution < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def poisson *args
|
6
|
+
::Croupier::Distributions.poisson *args
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_lambda_gets_correct_value
|
10
|
+
p = poisson lambda: 10.1
|
11
|
+
assert_equal 10.1, p.lambda, "lambda is not right"
|
12
|
+
end
|
13
|
+
end
|