random_variable 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/ext/gen.c CHANGED
@@ -15,37 +15,56 @@
15
15
 
16
16
  #include <ruby.h>
17
17
 
18
+ /* The Ruby "Random" class */
18
19
  extern VALUE rb_cRandom;
19
20
 
20
- /* the random number generator */
21
+ /* the random number generator (instance) */
21
22
  static VALUE rb_RandGen = Qnil;
22
23
 
24
+ /* For returning a random number at the C level */
23
25
  #define GET_RB_RANF rb_funcall(rb_RandGen, rb_intern("rand"), 0)
24
26
  double ranf(void)
25
27
  {
26
28
  return NUM2DBL(GET_RB_RANF);
27
29
  }
28
30
 
31
+ /* For returning a random number at the Ruby level */
29
32
  VALUE rb_ranf(void)
30
33
  {
31
34
  return GET_RB_RANF;
32
35
  }
33
36
  #undef GET_RB_RANF
34
37
 
38
+ /******************************************************************************/
39
+ /* Functions at C level */
40
+ /******************************************************************************/
41
+
42
+ /* get the current seed */
35
43
  VALUE rv_gen_get_seed(void)
36
44
  {
37
45
  return rb_funcall(rb_RandGen, rb_intern("seed"), 0);
38
46
  }
39
47
 
48
+ /* set the current seed */
40
49
  void rv_gen_set_seed(VALUE rb_seed)
41
50
  {
51
+ /* memory leak?! */
42
52
  rb_RandGen = rb_funcall(rb_cRandom, rb_intern("new"), 1, rb_seed);
43
53
  }
44
54
 
45
- /* Must be called before any kind ranf() call */
46
- void rv_init_gen(void)
55
+ VALUE rv_gen_new_seed(void)
47
56
  {
48
57
  rb_RandGen = rb_funcall(rb_cRandom, rb_intern("new"), 0);
58
+ return rv_gen_get_seed();
59
+ }
60
+ /******************************************************************************/
61
+
62
+
63
+ /* Must be called BEFORE any kind ranf() call !! */
64
+ void rv_init_gen(void)
65
+ {
66
+ /* create an instance of the random generator */
67
+ rv_gen_new_seed();
49
68
 
50
69
  /* tell the GC not to collect the random generator */
51
70
  rb_gc_register_address(&rb_RandGen);
data/lib/ext/gen.h CHANGED
@@ -21,6 +21,7 @@
21
21
 
22
22
  void rv_init_gen(void);
23
23
  double ranf(void);
24
+ VALUE rv_gen_new_seed(void);
24
25
  void rv_gen_set_seed(VALUE);
25
26
  VALUE rv_gen_get_seed(void);
26
27
 
@@ -768,6 +768,14 @@ VALUE rb_outcomes(VALUE rb_obj, VALUE rb_nr_times)
768
768
  }
769
769
  #undef GET_DATA
770
770
 
771
+ /******************************************************************************/
772
+ /* set and geet the seed at Ruby level */
773
+ /******************************************************************************/
774
+ static VALUE rb_seed_new(VALUE self)
775
+ {
776
+ return rv_gen_new_seed();
777
+ }
778
+
771
779
  static VALUE rb_seed_get(VALUE self)
772
780
  {
773
781
  return rv_gen_get_seed();
@@ -778,6 +786,8 @@ static VALUE rb_seed_set(VALUE self, VALUE rb_seed)
778
786
  rv_gen_set_seed(rb_seed);
779
787
  return rb_seed;
780
788
  }
789
+ /******************************************************************************/
790
+
781
791
 
782
792
  /******************************************************************************/
783
793
  /* macros for the extension entry point */
@@ -818,6 +828,7 @@ void Init_random_variable(void)
818
828
 
819
829
  /* Generator */
820
830
  rb_mGenerator = rb_define_module_under(rb_mRandomVariable, "Generator");
831
+ rb_define_singleton_method(rb_mGenerator, "new_seed", rb_seed_new, 0);
821
832
  rb_define_singleton_method(rb_mGenerator, "seed", rb_seed_get, 0);
822
833
  rb_define_singleton_method(rb_mGenerator, "seed=", rb_seed_set, 1);
823
834
 
@@ -35,6 +35,13 @@ require_relative 'ext/random_variable'
35
35
  require_relative 'sampleable'
36
36
 
37
37
  module RandomVariable
38
+ # obtain and set an arbitrary new seed
39
+ #
40
+ # @return [Numeric] the new seed
41
+ def self.new_seed
42
+ Generator::new_seed
43
+ end
44
+
38
45
  # obtain the current seed in use
39
46
  #
40
47
  # @return [Numeric] the current seed
data/lib/test.rb ADDED
@@ -0,0 +1,21 @@
1
+ ################################################################################
2
+ # #
3
+ # File: test.rb #
4
+ # #
5
+ ################################################################################
6
+ # #
7
+ # Author: Jorge F.M. Rinaldi #
8
+ # Contact: jorge.madronal.rinaldi@gmail.com #
9
+ # #
10
+ ################################################################################
11
+ # #
12
+ # Date: 2012/12/22 #
13
+ # #
14
+ ################################################################################
15
+
16
+ require 'random_variable'
17
+
18
+ module RandomVariable::Tests
19
+ end
20
+
21
+ require_relative 'tests/poisson.rb'
@@ -0,0 +1,27 @@
1
+ ################################################################################
2
+ # #
3
+ # File: common.rb #
4
+ # #
5
+ ################################################################################
6
+ # #
7
+ # Author: Jorge F.M. Rinaldi #
8
+ # Contact: jorge.madronal.rinaldi@gmail.com #
9
+ # #
10
+ ################################################################################
11
+ # #
12
+ # Date: 2012/12/22 #
13
+ # #
14
+ ################################################################################
15
+
16
+ # Attemps to require the gem denoted by +name+, otherwise it displays an
17
+ # error message and exits
18
+ def required_gem(name)
19
+ begin
20
+ require name
21
+ rescue LoadError # 'rescue' only rescues StandardError without args
22
+ abort("Gem '#{name}' required in order to work properly, " +
23
+ "please install the required gem and try again.\n" +
24
+ "\tThe installation is usually done as follows:\n" +
25
+ "\t\tgem install #{name}");
26
+ end
27
+ end
@@ -0,0 +1,87 @@
1
+ ################################################################################
2
+ # #
3
+ # File: poisson.rb #
4
+ # #
5
+ ################################################################################
6
+ # #
7
+ # Author: Jorge F.M. Rinaldi #
8
+ # Contact: jorge.madronal.rinaldi@gmail.com #
9
+ # #
10
+ ################################################################################
11
+ # #
12
+ # Date: 2012/12/22 #
13
+ # #
14
+ ################################################################################
15
+
16
+ require_relative 'common.rb'
17
+
18
+ require 'test/unit'
19
+
20
+ required_gem 'shoulda'
21
+ required_gem 'random_variable'
22
+
23
+ class RandomVariable::Tests::Poisson < Test::Unit::TestCase
24
+ include RandomVariable
25
+
26
+ should "fail instantiating with no parameter" do
27
+ assert_raise(ArgumentError) { Poisson.new }
28
+ end
29
+
30
+ should "fail instantiating with a NaN parameter" do
31
+ assert_raise(ArgumentError) { Poisson.new(0.0/0) }
32
+ assert_raise(ArgumentError) { Poisson.new(0/0.0) }
33
+ end
34
+
35
+ should "fail instantiating with a Infinty parameter" do
36
+ assert_raise(ArgumentError) { Poisson.new(0.0/1) }
37
+ assert_raise(ArgumentError) { Poisson.new(-0.0/1) }
38
+
39
+ huge_number = 2**1024
40
+ assert_raise(ArgumentError) { Poisson.new(huge_number) }
41
+ end
42
+
43
+ should "fail instantiating with a negative parameter" do
44
+ assert_raise(ArgumentError) { Poisson.new(-0.0001) }
45
+ assert_raise(ArgumentError) { Poisson.new(-1) }
46
+ assert_raise(ArgumentError) { Poisson.new(-113) }
47
+ assert_raise(ArgumentError) { Poisson.new(-10_000) }
48
+ end
49
+
50
+ should "fail instantiating with zero as the parameter" do
51
+ assert_raise(ArgumentError) { Poisson.new(0) }
52
+ assert_raise(ArgumentError) { Poisson.new(-0) }
53
+ assert_raise(ArgumentError) { Poisson.new(0.0) }
54
+ assert_raise(ArgumentError) { Poisson.new(-0.0) }
55
+ end
56
+
57
+ should "instantiate with a valid parameter" do
58
+ Poisson.new 0.001
59
+ Poisson.new 0.1
60
+ Poisson.new 1
61
+ Poisson.new 100
62
+ Poisson.new 10_000
63
+ end
64
+
65
+ should "provide greater or equal to zero outcomes" do
66
+ [0.001, 0.1, 1, 100, 10_000, 10_000_000].each do |param|
67
+ x = Poisson.new param
68
+ samples = x.outcomes 100_000
69
+ samples.each do |sample|
70
+ assert(sample >= 0)
71
+ end
72
+ end
73
+ end
74
+
75
+ should "reproduce the same outcomes for the same seed value" do
76
+ seed = RandomVariable::new_seed
77
+ x = Poisson.new 113
78
+ samples = x.outcomes 10
79
+ RandomVariable::seed = seed
80
+ new_samples = x.outcomes 10
81
+ samples.length.times do |i|
82
+ puts "#{samples[i]} ?= #{new_samples[i]}"
83
+ assert_equal(samples[i], new_samples[i])
84
+ end
85
+ end
86
+
87
+ end
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.2.1
4
+ version: 1.2.2
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-12-20 00:00:00.000000000 Z
12
+ date: 2012-12-23 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'random variables for a wide variety of probability distributions such
15
15
  as: Binomial, Beta, Chi-Squared, Normal, Pareto, Poisson, etc.'
@@ -26,6 +26,9 @@ files:
26
26
  - lib/distros.rb
27
27
  - LICENSE
28
28
  - COPYING
29
+ - lib/test.rb
30
+ - lib/tests/common.rb
31
+ - lib/tests/poisson.rb
29
32
  - lib/ext/random_variable.c
30
33
  - lib/ext/gen.c
31
34
  - lib/ext/gen.h