random_variable 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/distros.rb +96 -0
- data/lib/ext/random_variable.c +32 -24
- data/lib/ext/xrandlib.c +0 -5
- data/lib/random_variable.rb +10 -2
- metadata +4 -5
- data/lib/test/test_poisson_rv.rb +0 -48
- data/lib/test.rb +0 -9
data/lib/distros.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
################################################################################
|
2
|
+
# #
|
3
|
+
# File: distros.rb #
|
4
|
+
# #
|
5
|
+
################################################################################
|
6
|
+
# #
|
7
|
+
# Author: Jorge F.M. Rinaldi #
|
8
|
+
# Contact: jorge.madronal.rinaldi@gmail.com #
|
9
|
+
# #
|
10
|
+
################################################################################
|
11
|
+
# #
|
12
|
+
# Date: 2012/11/28 #
|
13
|
+
# #
|
14
|
+
################################################################################
|
15
|
+
|
16
|
+
module RandomVariable
|
17
|
+
class Bernoulli
|
18
|
+
# create a new <i>Bernoulli Random Variable</i> with
|
19
|
+
# parameter +p+
|
20
|
+
def self.new(p)
|
21
|
+
intern_new(p)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Beta
|
26
|
+
# create a new <i>Beta Random Variable</i> with parameters
|
27
|
+
# +alpha+ and +beta+
|
28
|
+
def self.new(alpha, beta)
|
29
|
+
intern_new(alpha, beta)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Binomial
|
34
|
+
# create a new <i>Binomial Random Variable</i> with parameters
|
35
|
+
# +n+ and +p+
|
36
|
+
def self.new(n, p)
|
37
|
+
intern_new(n, p)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class ContinuousUniform
|
42
|
+
# create a new <i>Continuous Uniform Random Variable</i> with
|
43
|
+
# parameters +a+ and +b+
|
44
|
+
def self.new(a, b)
|
45
|
+
intern_new(a, b)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class DiscreteUniform
|
50
|
+
# create a new <i>Discrete Uniform Random Variable</i> with
|
51
|
+
# parameters +a+ and +b+
|
52
|
+
def self.new(a, b)
|
53
|
+
intern_new(a, b)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class Exponential
|
58
|
+
# create a new <i>Exponential Random Variable</i> with a mean of
|
59
|
+
# +mean+
|
60
|
+
def self.new(mean)
|
61
|
+
intern_new(mean)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class F
|
66
|
+
# create a new <i>F Random Variable</i> with parameters
|
67
|
+
# +d1+ and +d2+
|
68
|
+
def self.new(d1, d2)
|
69
|
+
intern_new(d1, d2)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class Normal
|
74
|
+
# create a new <i>Normal Random Variable</i> with parameters
|
75
|
+
# +mu+ and +sigma+
|
76
|
+
def self.new(mu = 0.0, sigma = 1.0)
|
77
|
+
intern_new(mu, sigma)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class Poisson
|
82
|
+
# create a new <i>Poisson Random Variable</i> with a mean of
|
83
|
+
# +mean+
|
84
|
+
def self.new(mean)
|
85
|
+
intern_new(mean)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class Rayleigh
|
90
|
+
# create a new <i>Rayleigh Random Variable</i> with parameter
|
91
|
+
# +sigma+
|
92
|
+
def self.new(sigma)
|
93
|
+
intern_new(sigma)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/lib/ext/random_variable.c
CHANGED
@@ -97,10 +97,10 @@ typedef struct {
|
|
97
97
|
struct { long n; double p; } binomial;
|
98
98
|
struct { double a,b; } continuous_uniform;
|
99
99
|
struct { long a,b; } discrete_uniform;
|
100
|
-
struct { double
|
100
|
+
struct { double mean; } exponential;
|
101
101
|
struct { double d1, d2; } f;
|
102
102
|
struct { double mu, sigma; } normal;
|
103
|
-
struct { double
|
103
|
+
struct { double mean; } poisson;
|
104
104
|
struct { double sigma; } rayleigh;
|
105
105
|
} RANDVAR_DATA; /* union */
|
106
106
|
} randvar_t;
|
@@ -177,8 +177,8 @@ CREATE_RANDVAR_OUTCOME_FUNC2(discrete_uniform, ignuin, long, a, b)
|
|
177
177
|
CREATE_RANDVAR_RB_OUTCOME(discrete_uniform, LONG2NUM)
|
178
178
|
/* exponential */
|
179
179
|
RV_NR_PARAMS(exponential, 1)
|
180
|
-
CREATE_RANDVAR_ACCESSOR(exponential,
|
181
|
-
CREATE_RANDVAR_OUTCOME_FUNC1(exponential,
|
180
|
+
CREATE_RANDVAR_ACCESSOR(exponential, mean, double)
|
181
|
+
CREATE_RANDVAR_OUTCOME_FUNC1(exponential, genexp , double, mean)
|
182
182
|
CREATE_RANDVAR_RB_OUTCOME(exponential, DBL2NUM)
|
183
183
|
/* f */
|
184
184
|
RV_NR_PARAMS(f, 2)
|
@@ -194,8 +194,8 @@ CREATE_RANDVAR_OUTCOME_FUNC2(normal, gennor, double, mu, sigma)
|
|
194
194
|
CREATE_RANDVAR_RB_OUTCOME(normal, DBL2NUM)
|
195
195
|
/* poisson */
|
196
196
|
RV_NR_PARAMS(poisson, 1)
|
197
|
-
CREATE_RANDVAR_ACCESSOR(poisson,
|
198
|
-
CREATE_RANDVAR_OUTCOME_FUNC1(poisson, ignpoi, long,
|
197
|
+
CREATE_RANDVAR_ACCESSOR(poisson, mean, double)
|
198
|
+
CREATE_RANDVAR_OUTCOME_FUNC1(poisson, ignpoi, long, mean)
|
199
199
|
CREATE_RANDVAR_RB_OUTCOME(poisson, LONG2NUM)
|
200
200
|
/* rayleigh */
|
201
201
|
RV_NR_PARAMS(rayleigh, 1)
|
@@ -423,20 +423,20 @@ VALUE rb_create_instance(VALUE rb_obj, ...)
|
|
423
423
|
CASE_END
|
424
424
|
|
425
425
|
CASE(exponential)
|
426
|
-
VALUE
|
427
|
-
double
|
426
|
+
VALUE rb_mean;
|
427
|
+
double mean;
|
428
428
|
|
429
429
|
SET_KLASS(exponential);
|
430
430
|
|
431
|
-
|
432
|
-
|
431
|
+
rb_mean = GET_NEXT_ARG(ap);
|
432
|
+
mean = NUM2DBL(rb_mean);
|
433
433
|
|
434
|
-
/*
|
435
|
-
CHECK_POSITIVE(
|
434
|
+
/* mean > 0 */
|
435
|
+
CHECK_POSITIVE(mean);
|
436
436
|
|
437
|
-
/*
|
437
|
+
/* mean parameter correct */
|
438
438
|
RANDVAR_INIT(exponential);
|
439
|
-
SET_PARAM(exponential,
|
439
|
+
SET_PARAM(exponential, mean);
|
440
440
|
CASE_END
|
441
441
|
|
442
442
|
CASE(f)
|
@@ -483,19 +483,19 @@ VALUE rb_create_instance(VALUE rb_obj, ...)
|
|
483
483
|
CASE_END
|
484
484
|
|
485
485
|
CASE(poisson)
|
486
|
-
VALUE
|
487
|
-
double
|
486
|
+
VALUE rb_mean;
|
487
|
+
double mean;
|
488
488
|
|
489
489
|
SET_KLASS(poisson);
|
490
490
|
|
491
|
-
|
492
|
-
|
493
|
-
/*
|
494
|
-
CHECK_POSITIVE(
|
491
|
+
rb_mean = GET_NEXT_ARG(ap);
|
492
|
+
mean = NUM2DBL(rb_mean);
|
493
|
+
/* mean > 0 */
|
494
|
+
CHECK_POSITIVE(mean);;
|
495
495
|
|
496
|
-
/*
|
496
|
+
/* mean parameter correct */
|
497
497
|
RANDVAR_INIT(poisson);
|
498
|
-
SET_PARAM(poisson,
|
498
|
+
SET_PARAM(poisson, mean);;
|
499
499
|
CASE_END
|
500
500
|
|
501
501
|
CASE(rayleigh)
|
@@ -584,17 +584,25 @@ VALUE rb_outcomes(VALUE rb_obj, VALUE rb_nr_times)
|
|
584
584
|
/******************************************************************************/
|
585
585
|
#define CREATE_RANDOM_VARIABLE_CLASS(rb_name, name) \
|
586
586
|
do { \
|
587
|
-
VALUE *rb_objp
|
587
|
+
VALUE *rb_objp; \
|
588
|
+
VALUE rb_metaclass; \
|
589
|
+
\
|
590
|
+
rb_objp = &rb_cRandomVariables[rv_type_ ##name]; \
|
588
591
|
\
|
589
592
|
*rb_objp = rb_define_class_under(rb_mRandomVariable, \
|
590
593
|
rb_name, rb_cRandomVariables[rv_type_generic]); \
|
591
594
|
\
|
592
|
-
|
595
|
+
rb_metaclass = rb_singleton_class(*rb_objp); \
|
596
|
+
\
|
597
|
+
rb_define_private_method(rb_metaclass, "intern_new", \
|
593
598
|
(VALUE (*) (ANYARGS)) rb_create_instance, \
|
594
599
|
rv_ ##name ##_nr_params); \
|
595
600
|
\
|
596
601
|
rb_define_method(*rb_objp, "outcome" , rb_outcome, 0); \
|
602
|
+
rb_define_alias(*rb_objp, "sample", "outcome"); \
|
603
|
+
\
|
597
604
|
rb_define_method(*rb_objp, "outcomes", rb_outcomes, 1); \
|
605
|
+
rb_define_alias(*rb_objp, "samples", "outcomes"); \
|
598
606
|
outcome_func[rv_type_ ##name] = \
|
599
607
|
randvar_ ##name ##_rb_outcome; \
|
600
608
|
} while (0)
|
data/lib/ext/xrandlib.c
CHANGED
data/lib/random_variable.rb
CHANGED
@@ -68,22 +68,29 @@ module RandomVariable
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
+
# obtain a single outcome from the random variable
|
71
72
|
def outcome
|
72
73
|
@blk.call
|
73
74
|
end
|
75
|
+
alias :sample :outcome
|
74
76
|
|
75
|
-
|
77
|
+
# obtain +number+ outcomes from the random variable
|
78
|
+
def outcomes(number)
|
76
79
|
ary = []
|
77
|
-
|
80
|
+
number.times do
|
78
81
|
ary << @blk.call
|
79
82
|
end
|
80
83
|
ary
|
81
84
|
end
|
85
|
+
alias :samples :outcomes
|
82
86
|
|
83
87
|
|
84
88
|
end
|
85
89
|
end
|
86
90
|
|
91
|
+
require_relative 'distros.rb'
|
92
|
+
|
93
|
+
=begin
|
87
94
|
module Math
|
88
95
|
|
89
96
|
functions = [:acos, :acosh, :asin, :asinh, :atan, :atanh, :cbrt,
|
@@ -105,5 +112,6 @@ module Math
|
|
105
112
|
end
|
106
113
|
|
107
114
|
end
|
115
|
+
=end
|
108
116
|
|
109
117
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: random_variable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-28 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Create and operate with random variables in Ruby
|
15
15
|
email: jorge.madronal.rinaldi@gmail.com
|
@@ -20,9 +20,9 @@ extra_rdoc_files: []
|
|
20
20
|
files:
|
21
21
|
- lib/random_variable.rb
|
22
22
|
- lib/ext/extconf.rb
|
23
|
+
- lib/distros.rb
|
23
24
|
- LICENSE
|
24
25
|
- COPYING
|
25
|
-
- lib/test.rb
|
26
26
|
- lib/ext/random_variable.c
|
27
27
|
- lib/ext/randlib.c
|
28
28
|
- lib/ext/randlib.h
|
@@ -30,7 +30,6 @@ files:
|
|
30
30
|
- lib/ext/xrandlib.h
|
31
31
|
- lib/ext/linpack.c
|
32
32
|
- lib/ext/com.c
|
33
|
-
- lib/test/test_poisson_rv.rb
|
34
33
|
homepage: http://mrinaldi.net/random_variable
|
35
34
|
licenses:
|
36
35
|
- GPLv3
|
@@ -43,7 +42,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
43
42
|
requirements:
|
44
43
|
- - ! '>='
|
45
44
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
45
|
+
version: 1.9.3
|
47
46
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
47
|
none: false
|
49
48
|
requirements:
|
data/lib/test/test_poisson_rv.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
################################################################################
|
2
|
-
# #
|
3
|
-
# File: test_poisson_rv.rb #
|
4
|
-
# #
|
5
|
-
################################################################################
|
6
|
-
# #
|
7
|
-
# Author: Jorge F.M. Rinaldi #
|
8
|
-
# Contact: jorge.madronal.rinaldi@gmail.com #
|
9
|
-
# #
|
10
|
-
################################################################################
|
11
|
-
# #
|
12
|
-
# Date: 2012/10/27 #
|
13
|
-
# #
|
14
|
-
################################################################################
|
15
|
-
|
16
|
-
class TestPoissonRV < Test::Unit::TestCase
|
17
|
-
def test_no_parameter
|
18
|
-
assert_raise(ArgumentError) { PoissonRV.new }
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_infinite_parameter
|
22
|
-
assert_raise(ArgumentError) { PoissonRV.new(113.0 / 0) }
|
23
|
-
x = 2**65536
|
24
|
-
assert_raise(ArgumentError) { PoissonRV.new(x) }
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_nan_parameter
|
28
|
-
assert_raise(ArgumentError) { PoissonRV.new(0.0 / 0) }
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_invalid_finite_paramter
|
32
|
-
assert_raise(ArgumentError) { PoissonRV.new(-7) }
|
33
|
-
assert_raise(ArgumentError) { PoissonRV.new(-0.0000001) }
|
34
|
-
assert_raise(ArgumentError) { PoissonRV.new(0) }
|
35
|
-
lambda_param = 2 * PoissonRV.lambda_max
|
36
|
-
assert_raise(ArgumentError) { PoissonRV.new(lambda_param) }
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_max_lambda_produces_good_results
|
41
|
-
lambda_max = PoissonRV.lambda_max
|
42
|
-
x = PoissonRV.new(lambda_max)
|
43
|
-
outcomes = x.outcomes(10_000_000)
|
44
|
-
outcomes.each do |e|
|
45
|
-
assert(e > 0)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|