random_variable 1.1.0 → 1.2.0
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.
- data/lib/distros.rb +32 -2
- data/lib/ext/randlib.c +5 -0
- data/lib/ext/random_variable.c +157 -7
- data/lib/ext/xrandlib.c +61 -15
- data/lib/ext/xrandlib.h +8 -3
- data/lib/random_variable.rb +23 -18
- data/lib/sampleable.rb +32 -0
- data/lib/samples.rb +61 -0
- metadata +7 -4
    
        data/lib/distros.rb
    CHANGED
    
    | @@ -38,6 +38,14 @@ module RandomVariable | |
| 38 38 | 
             
            		end
         | 
| 39 39 | 
             
            	end
         | 
| 40 40 |  | 
| 41 | 
            +
            	class ChiSquared < Generic
         | 
| 42 | 
            +
            		# create a <i>Chi-Squared Random Variable</i> with +k+ degrees
         | 
| 43 | 
            +
            		# of freedom
         | 
| 44 | 
            +
            		def self.new(k)
         | 
| 45 | 
            +
            			intern_new(k)
         | 
| 46 | 
            +
            		end
         | 
| 47 | 
            +
            	end
         | 
| 48 | 
            +
             | 
| 41 49 | 
             
            	class ContinuousUniform < Generic
         | 
| 42 50 | 
             
            		# create a new <i>Continuous Uniform Random Variable</i> with 
         | 
| 43 51 | 
             
            		# parameters +a+ and +b+
         | 
| @@ -71,13 +79,21 @@ module RandomVariable | |
| 71 79 | 
             
            	end
         | 
| 72 80 |  | 
| 73 81 | 
             
            	class Normal < Generic
         | 
| 74 | 
            -
            		# create a new <i>Normal Random Variable</i>  | 
| 75 | 
            -
            		# +mu+ and +sigma+
         | 
| 82 | 
            +
            		# create a new <i>Normal (aka Gaussian) Random Variable</i> 
         | 
| 83 | 
            +
            		# with parameters +mu+ and +sigma+
         | 
| 76 84 | 
             
            		def self.new(mu = 0.0, sigma = 1.0)
         | 
| 77 85 | 
             
            			intern_new(mu, sigma)
         | 
| 78 86 | 
             
            		end
         | 
| 79 87 | 
             
            	end
         | 
| 80 88 |  | 
| 89 | 
            +
            	class Pareto < Generic
         | 
| 90 | 
            +
            		# create a new <i>Pareto Random Variable</i> where +a+ is the
         | 
| 91 | 
            +
            		# shape and +m+ is the location
         | 
| 92 | 
            +
            		def self.new(a, m = 1.0)
         | 
| 93 | 
            +
            			intern_new(a, m)
         | 
| 94 | 
            +
            		end
         | 
| 95 | 
            +
            	end
         | 
| 96 | 
            +
             | 
| 81 97 | 
             
            	class Poisson < Generic
         | 
| 82 98 | 
             
            		# create a new <i>Poisson Random Variable</i> with a mean of
         | 
| 83 99 | 
             
            		# +mean+
         | 
| @@ -86,6 +102,13 @@ module RandomVariable | |
| 86 102 | 
             
            		end
         | 
| 87 103 | 
             
            	end
         | 
| 88 104 |  | 
| 105 | 
            +
            	class Rademacher < Generic
         | 
| 106 | 
            +
            		# create a new <i>Rademacher Random Variable</i>
         | 
| 107 | 
            +
            		def self.new
         | 
| 108 | 
            +
            			intern_new
         | 
| 109 | 
            +
            		end
         | 
| 110 | 
            +
            	end
         | 
| 111 | 
            +
             | 
| 89 112 | 
             
            	class Rayleigh < Generic
         | 
| 90 113 | 
             
            		# create a new <i>Rayleigh Random Variable</i> with parameter
         | 
| 91 114 | 
             
            		# +sigma+
         | 
| @@ -93,4 +116,11 @@ module RandomVariable | |
| 93 116 | 
             
            			intern_new(sigma)
         | 
| 94 117 | 
             
            		end
         | 
| 95 118 | 
             
            	end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            	class Rectangular < Generic
         | 
| 121 | 
            +
            		# create a <i>Rectangular Random Variable</i>
         | 
| 122 | 
            +
            		def self.new
         | 
| 123 | 
            +
            			intern_new
         | 
| 124 | 
            +
            		end
         | 
| 125 | 
            +
            	end
         | 
| 96 126 | 
             
            end
         | 
    
        data/lib/ext/randlib.c
    CHANGED
    
    | @@ -1060,6 +1060,11 @@ S170: | |
| 1060 1060 | 
             
            }
         | 
| 1061 1061 |  | 
| 1062 1062 | 
             
            long ignnbn(long n,double p)
         | 
| 1063 | 
            +
            /* 
         | 
| 1064 | 
            +
            	return the number of failures
         | 
| 1065 | 
            +
            	n -> number of successful events
         | 
| 1066 | 
            +
            	p -> probability of event
         | 
| 1067 | 
            +
             */
         | 
| 1063 1068 | 
             
            /*
         | 
| 1064 1069 | 
             
            **********************************************************************
         | 
| 1065 1070 |  | 
    
        data/lib/ext/random_variable.c
    CHANGED
    
    | @@ -68,13 +68,18 @@ typedef enum { | |
| 68 68 | 
             
            	rv_type_bernoulli,
         | 
| 69 69 | 
             
            	rv_type_beta,
         | 
| 70 70 | 
             
            	rv_type_binomial,
         | 
| 71 | 
            +
            	rv_type_chi_squared,
         | 
| 71 72 | 
             
            	rv_type_continuous_uniform,
         | 
| 72 73 | 
             
            	rv_type_discrete_uniform,
         | 
| 73 74 | 
             
            	rv_type_exponential,
         | 
| 74 75 | 
             
            	rv_type_f,
         | 
| 76 | 
            +
            	rv_type_negative_binomial,
         | 
| 75 77 | 
             
            	rv_type_normal,
         | 
| 78 | 
            +
            	rv_type_pareto,
         | 
| 76 79 | 
             
            	rv_type_poisson,
         | 
| 80 | 
            +
            	rv_type_rademacher,
         | 
| 77 81 | 
             
            	rv_type_rayleigh,
         | 
| 82 | 
            +
            	rv_type_rectangular,
         | 
| 78 83 |  | 
| 79 84 | 
             
            	/* end of random variable types */	
         | 
| 80 85 |  | 
| @@ -92,13 +97,18 @@ typedef struct { | |
| 92 97 | 
             
            		struct { double p; } bernoulli;
         | 
| 93 98 | 
             
            		struct { double alpha, beta; } beta;
         | 
| 94 99 | 
             
            		struct { long n; double p; } binomial;
         | 
| 100 | 
            +
            		struct { long k; } chi_squared;
         | 
| 95 101 | 
             
            		struct { double a,b; } continuous_uniform;
         | 
| 96 102 | 
             
            		struct { long a,b; } discrete_uniform;
         | 
| 97 103 | 
             
            		struct { double mean; } exponential;
         | 
| 98 104 | 
             
            		struct { double d1, d2; } f;
         | 
| 105 | 
            +
            		struct { long r; double p; } negative_binomial;
         | 
| 99 106 | 
             
            		struct { double mu, sigma; } normal;
         | 
| 107 | 
            +
            		struct { double a, m; } pareto;
         | 
| 100 108 | 
             
            		struct { double mean; } poisson;
         | 
| 109 | 
            +
            		struct { /* no params */ } rademacher;
         | 
| 101 110 | 
             
            		struct { double sigma; } rayleigh;
         | 
| 111 | 
            +
            		struct { /* no params */ } rectangular;
         | 
| 102 112 | 
             
            	} RANDVAR_DATA;	/* union */
         | 
| 103 113 | 
             
            } randvar_t;
         | 
| 104 114 | 
             
            #define RANDVAR_ALLOC()		ALLOC(randvar_t)
         | 
| @@ -118,6 +128,13 @@ typedef struct { | |
| 118 128 | 
             
            		rv->RANDVAR_DATA . name . param = param;		\
         | 
| 119 129 | 
             
            	}
         | 
| 120 130 |  | 
| 131 | 
            +
            #define CREATE_RANDVAR_OUTCOME_FUNC0(name, func, type)			\
         | 
| 132 | 
            +
            	static inline type 						\
         | 
| 133 | 
            +
            	randvar_##name ##_ ##outcome(randvar_t *rv)			\
         | 
| 134 | 
            +
            	{								\
         | 
| 135 | 
            +
            		return func();						\
         | 
| 136 | 
            +
            	}
         | 
| 137 | 
            +
             | 
| 121 138 | 
             
            #define CREATE_RANDVAR_OUTCOME_FUNC1(name, func, type, param)		\
         | 
| 122 139 | 
             
            	static inline type 						\
         | 
| 123 140 | 
             
            	randvar_##name ##_ ##outcome(randvar_t *rv)			\
         | 
| @@ -160,6 +177,11 @@ CREATE_RANDVAR_ACCESSOR(binomial, n, long) | |
| 160 177 | 
             
            CREATE_RANDVAR_ACCESSOR(binomial, p, double)
         | 
| 161 178 | 
             
            CREATE_RANDVAR_OUTCOME_FUNC2(binomial, ignbin, long, n, p)
         | 
| 162 179 | 
             
            CREATE_RANDVAR_RB_OUTCOME(binomial, LONG2NUM)
         | 
| 180 | 
            +
            /* chi-squared */
         | 
| 181 | 
            +
            RV_NR_PARAMS(chi_squared, 1)
         | 
| 182 | 
            +
            CREATE_RANDVAR_ACCESSOR(chi_squared, k, long)
         | 
| 183 | 
            +
            CREATE_RANDVAR_OUTCOME_FUNC1(chi_squared, gen_chi_squared, double, k)
         | 
| 184 | 
            +
            CREATE_RANDVAR_RB_OUTCOME(chi_squared, DBL2NUM)
         | 
| 163 185 | 
             
            /* continuous uniform */
         | 
| 164 186 | 
             
            RV_NR_PARAMS(continuous_uniform, 2)
         | 
| 165 187 | 
             
            CREATE_RANDVAR_ACCESSOR(continuous_uniform, a, double)
         | 
| @@ -170,7 +192,7 @@ CREATE_RANDVAR_RB_OUTCOME(continuous_uniform, DBL2NUM) | |
| 170 192 | 
             
            RV_NR_PARAMS(discrete_uniform, 2)
         | 
| 171 193 | 
             
            CREATE_RANDVAR_ACCESSOR(discrete_uniform, a, long)
         | 
| 172 194 | 
             
            CREATE_RANDVAR_ACCESSOR(discrete_uniform, b, long)
         | 
| 173 | 
            -
            CREATE_RANDVAR_OUTCOME_FUNC2(discrete_uniform,  | 
| 195 | 
            +
            CREATE_RANDVAR_OUTCOME_FUNC2(discrete_uniform, gen_discrete_uniform, long, a, b)
         | 
| 174 196 | 
             
            CREATE_RANDVAR_RB_OUTCOME(discrete_uniform, LONG2NUM)
         | 
| 175 197 | 
             
            /* exponential */
         | 
| 176 198 | 
             
            RV_NR_PARAMS(exponential, 1)
         | 
| @@ -183,22 +205,42 @@ CREATE_RANDVAR_ACCESSOR(f, d1, double) | |
| 183 205 | 
             
            CREATE_RANDVAR_ACCESSOR(f, d2, double)
         | 
| 184 206 | 
             
            CREATE_RANDVAR_OUTCOME_FUNC2(f, genf, double, d1, d2)
         | 
| 185 207 | 
             
            CREATE_RANDVAR_RB_OUTCOME(f, DBL2NUM)
         | 
| 208 | 
            +
            /* negative binomial */
         | 
| 209 | 
            +
            RV_NR_PARAMS(negative_binomial, 2)
         | 
| 210 | 
            +
            CREATE_RANDVAR_ACCESSOR(negative_binomial, r, long)
         | 
| 211 | 
            +
            CREATE_RANDVAR_ACCESSOR(negative_binomial, p, double)
         | 
| 212 | 
            +
            CREATE_RANDVAR_OUTCOME_FUNC2(negative_binomial, ignnbn, long, r, p)
         | 
| 213 | 
            +
            CREATE_RANDVAR_RB_OUTCOME(negative_binomial, LONG2NUM)
         | 
| 186 214 | 
             
            /* normal */
         | 
| 187 215 | 
             
            RV_NR_PARAMS(normal, 2)
         | 
| 188 216 | 
             
            CREATE_RANDVAR_ACCESSOR(normal, mu, double)
         | 
| 189 217 | 
             
            CREATE_RANDVAR_ACCESSOR(normal, sigma, double)
         | 
| 190 218 | 
             
            CREATE_RANDVAR_OUTCOME_FUNC2(normal, gennor, double, mu, sigma)
         | 
| 191 219 | 
             
            CREATE_RANDVAR_RB_OUTCOME(normal, DBL2NUM)
         | 
| 220 | 
            +
            /* pareto */
         | 
| 221 | 
            +
            RV_NR_PARAMS(pareto, 2)
         | 
| 222 | 
            +
            CREATE_RANDVAR_ACCESSOR(pareto, a, double)
         | 
| 223 | 
            +
            CREATE_RANDVAR_ACCESSOR(pareto, m, double)
         | 
| 224 | 
            +
            CREATE_RANDVAR_OUTCOME_FUNC2(pareto, gen_pareto, double, a, m)
         | 
| 225 | 
            +
            CREATE_RANDVAR_RB_OUTCOME(pareto, DBL2NUM)
         | 
| 192 226 | 
             
            /* poisson */
         | 
| 193 227 | 
             
            RV_NR_PARAMS(poisson, 1)
         | 
| 194 228 | 
             
            CREATE_RANDVAR_ACCESSOR(poisson, mean, double)
         | 
| 195 229 | 
             
            CREATE_RANDVAR_OUTCOME_FUNC1(poisson, ignpoi, long, mean)
         | 
| 196 230 | 
             
            CREATE_RANDVAR_RB_OUTCOME(poisson, LONG2NUM)
         | 
| 231 | 
            +
            /* rademacher */
         | 
| 232 | 
            +
            RV_NR_PARAMS(rademacher, 0)
         | 
| 233 | 
            +
            CREATE_RANDVAR_OUTCOME_FUNC0(rademacher, gen_rademacher, int)
         | 
| 234 | 
            +
            CREATE_RANDVAR_RB_OUTCOME(rademacher, INT2FIX)
         | 
| 197 235 | 
             
            /* rayleigh */
         | 
| 198 236 | 
             
            RV_NR_PARAMS(rayleigh, 1)
         | 
| 199 237 | 
             
            CREATE_RANDVAR_ACCESSOR(rayleigh, sigma, double)
         | 
| 200 238 | 
             
            CREATE_RANDVAR_OUTCOME_FUNC1(rayleigh, gen_rayleigh, double, sigma)
         | 
| 201 239 | 
             
            CREATE_RANDVAR_RB_OUTCOME(rayleigh, DBL2NUM)
         | 
| 240 | 
            +
            /* rectangular */
         | 
| 241 | 
            +
            RV_NR_PARAMS(rectangular, 0)
         | 
| 242 | 
            +
            CREATE_RANDVAR_OUTCOME_FUNC0(rectangular, gen_rectangular, double)
         | 
| 243 | 
            +
            CREATE_RANDVAR_RB_OUTCOME(rectangular, DBL2NUM)
         | 
| 202 244 |  | 
| 203 245 | 
             
            /******************************************************************************/
         | 
| 204 246 | 
             
            /* class and module objects */
         | 
| @@ -267,6 +309,15 @@ static type_t type(VALUE rb_obj) | |
| 267 309 | 
             
            						#x " parameter "	\
         | 
| 268 310 | 
             
            						"is not a "		\
         | 
| 269 311 | 
             
            						"probability");		\
         | 
| 312 | 
            +
            			} while (0)
         | 
| 313 | 
            +
            	
         | 
| 314 | 
            +
            #define CHECK_PROBABILITY_EXCL(x) 					\
         | 
| 315 | 
            +
            			do {						\
         | 
| 316 | 
            +
            				if (x >= 1.0 || x <= 0.0)		\
         | 
| 317 | 
            +
            					rb_raise(rb_eArgError,		\
         | 
| 318 | 
            +
            						#x " parameter "	\
         | 
| 319 | 
            +
            						"must be "		\
         | 
| 320 | 
            +
            						"0 < " #x " < 1");	\
         | 
| 270 321 | 
             
            			} while (0)	
         | 
| 271 322 |  | 
| 272 323 | 
             
            #define VAR_DECLARATIONS	va_list ap;				\
         | 
| @@ -275,6 +326,15 @@ static type_t type(VALUE rb_obj) | |
| 275 326 | 
             
            				VALUE klass = 0;
         | 
| 276 327 | 
             
            #define SET_KLASS(name)							\
         | 
| 277 328 | 
             
            		(klass = rb_cRandomVariables[rv_type_ ##name])
         | 
| 329 | 
            +
             | 
| 330 | 
            +
            #define ASSERT_KLASS_IS_SET						\
         | 
| 331 | 
            +
            		do {							\
         | 
| 332 | 
            +
            			if (0 == klass) 				\
         | 
| 333 | 
            +
            				rb_bug("forgot to set klass variable "	\
         | 
| 334 | 
            +
            					"in %s()", __func__);		\
         | 
| 335 | 
            +
            		} while (0)						
         | 
| 336 | 
            +
             | 
| 337 | 
            +
             | 
| 278 338 | 
             
            #define GET_NEXT_ARG(ap)	va_arg((ap), VALUE)
         | 
| 279 339 | 
             
            #define CREATE_WRAPPING(rv)	Data_Wrap_Struct(klass, NULL, xfree, (rv))
         | 
| 280 340 |  | 
| @@ -294,6 +354,7 @@ static type_t type(VALUE rb_obj) | |
| 294 354 | 
             
            			{		
         | 
| 295 355 |  | 
| 296 356 | 
             
            #define CASE_END							\
         | 
| 357 | 
            +
            			ASSERT_KLASS_IS_SET;				\
         | 
| 297 358 | 
             
            			break;						\
         | 
| 298 359 | 
             
            			}	
         | 
| 299 360 | 
             
            /******************************************************************************/
         | 
| @@ -375,6 +436,25 @@ VALUE rb_create_instance(VALUE rb_obj, ...) | |
| 375 436 | 
             
            			SET_PARAM(binomial, p);
         | 
| 376 437 | 
             
            		CASE_END
         | 
| 377 438 |  | 
| 439 | 
            +
            		CASE(chi_squared)
         | 
| 440 | 
            +
            			VALUE rb_k;
         | 
| 441 | 
            +
            			long k;
         | 
| 442 | 
            +
             | 
| 443 | 
            +
            			SET_KLASS(chi_squared);
         | 
| 444 | 
            +
             | 
| 445 | 
            +
            			rb_k = GET_NEXT_ARG(ap);
         | 
| 446 | 
            +
            			CHECK_RB_INTEGER(rb_k, "k");
         | 
| 447 | 
            +
             | 
| 448 | 
            +
            			k = NUM2LONG(rb_k);
         | 
| 449 | 
            +
            			
         | 
| 450 | 
            +
            			/* k > 0 */
         | 
| 451 | 
            +
            			CHECK_POSITIVE(k);
         | 
| 452 | 
            +
             | 
| 453 | 
            +
            			/* k parameter correct */
         | 
| 454 | 
            +
            			RANDVAR_INIT(chi_squared);
         | 
| 455 | 
            +
            			SET_PARAM(chi_squared, k);	
         | 
| 456 | 
            +
            		CASE_END
         | 
| 457 | 
            +
             | 
| 378 458 | 
             
            		CASE(continuous_uniform)
         | 
| 379 459 | 
             
            			VALUE rb_a, rb_b;
         | 
| 380 460 | 
             
            			double a,b;
         | 
| @@ -460,6 +540,34 @@ VALUE rb_create_instance(VALUE rb_obj, ...) | |
| 460 540 | 
             
            			SET_PARAM(f, d2);
         | 
| 461 541 | 
             
            		CASE_END
         | 
| 462 542 |  | 
| 543 | 
            +
            		CASE(negative_binomial)
         | 
| 544 | 
            +
            			VALUE rb_r, rb_p;
         | 
| 545 | 
            +
            			long r;
         | 
| 546 | 
            +
            			double p;
         | 
| 547 | 
            +
             | 
| 548 | 
            +
            			SET_KLASS(negative_binomial);
         | 
| 549 | 
            +
             | 
| 550 | 
            +
            			rb_r = GET_NEXT_ARG(ap);
         | 
| 551 | 
            +
            			rb_p = GET_NEXT_ARG(ap);
         | 
| 552 | 
            +
             | 
| 553 | 
            +
            			CHECK_RB_INTEGER(rb_r, "r");
         | 
| 554 | 
            +
            			
         | 
| 555 | 
            +
            			r = NUM2LONG(rb_r);
         | 
| 556 | 
            +
            			p = NUM2DBL(rb_p);
         | 
| 557 | 
            +
             | 
| 558 | 
            +
            			/* r > 0 */
         | 
| 559 | 
            +
            			CHECK_POSITIVE(r);
         | 
| 560 | 
            +
            			/* 0 < p < 0 */
         | 
| 561 | 
            +
            			CHECK_PROBABILITY_EXCL(p);
         | 
| 562 | 
            +
             | 
| 563 | 
            +
            			/* r and p parameters correct */
         | 
| 564 | 
            +
            			RANDVAR_INIT(negative_binomial);
         | 
| 565 | 
            +
            			SET_PARAM(negative_binomial, r);
         | 
| 566 | 
            +
            			SET_PARAM(negative_binomial, p);
         | 
| 567 | 
            +
             | 
| 568 | 
            +
            			
         | 
| 569 | 
            +
            		CASE_END		
         | 
| 570 | 
            +
             | 
| 463 571 | 
             
            		CASE(normal)
         | 
| 464 572 | 
             
            			VALUE rb_mu, rb_sigma;
         | 
| 465 573 | 
             
            			double mu, sigma;
         | 
| @@ -478,6 +586,30 @@ VALUE rb_create_instance(VALUE rb_obj, ...) | |
| 478 586 | 
             
            			RANDVAR_INIT(normal);
         | 
| 479 587 | 
             
            			SET_PARAM(normal, mu);
         | 
| 480 588 | 
             
            			SET_PARAM(normal, sigma);
         | 
| 589 | 
            +
            		CASE_END
         | 
| 590 | 
            +
             | 
| 591 | 
            +
            		CASE(pareto)
         | 
| 592 | 
            +
            			VALUE rb_a, rb_m;
         | 
| 593 | 
            +
            			double a, m;
         | 
| 594 | 
            +
            			
         | 
| 595 | 
            +
            			SET_KLASS(pareto);
         | 
| 596 | 
            +
             | 
| 597 | 
            +
            			rb_a = GET_NEXT_ARG(ap);
         | 
| 598 | 
            +
            			rb_m = GET_NEXT_ARG(ap);
         | 
| 599 | 
            +
             | 
| 600 | 
            +
            			a = NUM2DBL(rb_a);
         | 
| 601 | 
            +
            			m = NUM2DBL(rb_m);
         | 
| 602 | 
            +
             | 
| 603 | 
            +
            			/* a > 0 */
         | 
| 604 | 
            +
            			CHECK_POSITIVE(a);
         | 
| 605 | 
            +
             | 
| 606 | 
            +
            			/* m > 0 */
         | 
| 607 | 
            +
            			CHECK_POSITIVE(m);
         | 
| 608 | 
            +
             | 
| 609 | 
            +
            			/* a and m parameters correct */
         | 
| 610 | 
            +
            			RANDVAR_INIT(pareto);
         | 
| 611 | 
            +
            			SET_PARAM(pareto, a);
         | 
| 612 | 
            +
            			SET_PARAM(pareto, m);
         | 
| 481 613 | 
             
            		CASE_END		
         | 
| 482 614 |  | 
| 483 615 | 
             
            		CASE(poisson)
         | 
| @@ -489,11 +621,17 @@ VALUE rb_create_instance(VALUE rb_obj, ...) | |
| 489 621 | 
             
            			rb_mean = GET_NEXT_ARG(ap);
         | 
| 490 622 | 
             
            			mean = NUM2DBL(rb_mean); 
         | 
| 491 623 | 
             
            			/* mean > 0 */
         | 
| 492 | 
            -
            			CHECK_POSITIVE(mean) | 
| 624 | 
            +
            			CHECK_POSITIVE(mean);
         | 
| 493 625 |  | 
| 494 626 | 
             
            			/* mean parameter correct */
         | 
| 495 627 | 
             
            			RANDVAR_INIT(poisson);
         | 
| 496 | 
            -
            			SET_PARAM(poisson, mean) | 
| 628 | 
            +
            			SET_PARAM(poisson, mean);
         | 
| 629 | 
            +
            		CASE_END
         | 
| 630 | 
            +
             | 
| 631 | 
            +
            		CASE(rademacher)
         | 
| 632 | 
            +
            			SET_KLASS(rademacher);
         | 
| 633 | 
            +
             | 
| 634 | 
            +
            			RANDVAR_INIT(rademacher);
         | 
| 497 635 | 
             
            		CASE_END
         | 
| 498 636 |  | 
| 499 637 | 
             
            		CASE(rayleigh)
         | 
| @@ -512,6 +650,12 @@ VALUE rb_create_instance(VALUE rb_obj, ...) | |
| 512 650 | 
             
            			SET_PARAM(rayleigh, sigma);				
         | 
| 513 651 | 
             
            		CASE_END
         | 
| 514 652 |  | 
| 653 | 
            +
            		CASE(rectangular)
         | 
| 654 | 
            +
            			SET_KLASS(rectangular);
         | 
| 655 | 
            +
             | 
| 656 | 
            +
            			RANDVAR_INIT(rectangular);
         | 
| 657 | 
            +
            		CASE_END
         | 
| 658 | 
            +
             | 
| 515 659 | 
             
            		default:
         | 
| 516 660 | 
             
            			rb_rv = Qnil;
         | 
| 517 661 |  | 
| @@ -607,11 +751,12 @@ static VALUE rb_seed_set(VALUE self, VALUE rb_seed) | |
| 607 751 | 
             
            			(VALUE (*) (ANYARGS)) rb_create_instance,	\
         | 
| 608 752 | 
             
            			rv_ ##name ##_nr_params);			\
         | 
| 609 753 | 
             
            									\
         | 
| 610 | 
            -
            		 | 
| 611 | 
            -
             | 
| 754 | 
            +
            		rb_define_private_method(*rb_objp, 			\
         | 
| 755 | 
            +
            			"intern_outcome", rb_outcome, 0);		\
         | 
| 756 | 
            +
            									\
         | 
| 757 | 
            +
            		rb_define_private_method(*rb_objp,			\
         | 
| 758 | 
            +
            			"intern_outcomes", rb_outcomes, 1);		\
         | 
| 612 759 | 
             
            									\
         | 
| 613 | 
            -
            		rb_define_method(*rb_objp, "outcomes", rb_outcomes, 1);	\
         | 
| 614 | 
            -
            		rb_define_alias(*rb_objp, "samples", "outcomes");	\
         | 
| 615 760 | 
             
            		outcome_func[rv_type_ ##name] = 			\
         | 
| 616 761 | 
             
            				randvar_ ##name ##_rb_outcome;		\
         | 
| 617 762 | 
             
            	} while (0)
         | 
| @@ -637,13 +782,18 @@ void Init_random_variable(void) | |
| 637 782 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("Bernoulli", bernoulli);
         | 
| 638 783 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("Beta", beta);
         | 
| 639 784 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("Binomial", binomial);
         | 
| 785 | 
            +
            	CREATE_RANDOM_VARIABLE_CLASS("ChiSquared", chi_squared);
         | 
| 640 786 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("ContinuousUniform", continuous_uniform);
         | 
| 641 787 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("DiscreteUniform", discrete_uniform);
         | 
| 642 788 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("Exponential", exponential);
         | 
| 643 789 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("F", f);
         | 
| 790 | 
            +
            	CREATE_RANDOM_VARIABLE_CLASS("NegativeBinomial", negative_binomial);
         | 
| 644 791 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("Normal", normal);
         | 
| 792 | 
            +
            	CREATE_RANDOM_VARIABLE_CLASS("Pareto", pareto);
         | 
| 645 793 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("Poisson", poisson);
         | 
| 794 | 
            +
            	CREATE_RANDOM_VARIABLE_CLASS("Rademacher", rademacher);
         | 
| 646 795 | 
             
            	CREATE_RANDOM_VARIABLE_CLASS("Rayleigh", rayleigh);
         | 
| 796 | 
            +
            	CREATE_RANDOM_VARIABLE_CLASS("Rectangular", rectangular);
         | 
| 647 797 |  | 
| 648 798 | 
             
            	/* initialize the random number generator */
         | 
| 649 799 | 
             
            	rv_init_gen();
         | 
    
        data/lib/ext/xrandlib.c
    CHANGED
    
    | @@ -40,6 +40,19 @@ | |
| 40 40 | 
             
            #include "xrandlib.h"
         | 
| 41 41 | 
             
            #include "randlib.h"
         | 
| 42 42 |  | 
| 43 | 
            +
            /* Arcsine */
         | 
| 44 | 
            +
            double gen_arcsine(void)
         | 
| 45 | 
            +
            {
         | 
| 46 | 
            +
            	return pow(sin(M_2_PI * ranf() ), 2);
         | 
| 47 | 
            +
            }
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            /* Bates */
         | 
| 50 | 
            +
            double gen_bates(long n)
         | 
| 51 | 
            +
            {
         | 
| 52 | 
            +
            	return genirwinhall(n) / n;
         | 
| 53 | 
            +
            }
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            /* Bernoulli */
         | 
| 43 56 | 
             
            int gen_bernoulli(double p)
         | 
| 44 57 | 
             
            {
         | 
| 45 58 | 
             
            	if (ranf() > p)
         | 
| @@ -47,22 +60,35 @@ int gen_bernoulli(double p) | |
| 47 60 | 
             
            	return 1;
         | 
| 48 61 | 
             
            }
         | 
| 49 62 |  | 
| 50 | 
            -
            /*  | 
| 51 | 
            -
            double  | 
| 52 | 
            -
            {
         | 
| 53 | 
            -
            	return sigma * sqrt(-2 * log(1.0 - ranf()));
         | 
| 54 | 
            -
            }
         | 
| 55 | 
            -
             | 
| 56 | 
            -
            /* Arcsine */
         | 
| 57 | 
            -
            double gen_arcsine(void)
         | 
| 63 | 
            +
            /* Chi-Squared */
         | 
| 64 | 
            +
            double gen_chi_squared(long k)
         | 
| 58 65 | 
             
            {
         | 
| 59 | 
            -
            	return  | 
| 66 | 
            +
            	return genchi((double) k);
         | 
| 60 67 | 
             
            }
         | 
| 61 68 |  | 
| 62 | 
            -
            /*  | 
| 63 | 
            -
             | 
| 69 | 
            +
            /* Discrete Uniform */
         | 
| 70 | 
            +
            long gen_discrete_uniform(long a, long b)
         | 
| 64 71 | 
             
            {
         | 
| 65 | 
            -
            	 | 
| 72 | 
            +
            	/* assumptions:
         | 
| 73 | 
            +
            		1) a != b
         | 
| 74 | 
            +
            		2) a < b
         | 
| 75 | 
            +
            	*/
         | 
| 76 | 
            +
            	double step;
         | 
| 77 | 
            +
            	long step_nr;
         | 
| 78 | 
            +
            	double y, y0;
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            	step = 1.0 / (b - a + 1);
         | 
| 81 | 
            +
            	y = step;
         | 
| 82 | 
            +
            	y0 = ranf();
         | 
| 83 | 
            +
            	step_nr = 0;
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            	do {
         | 
| 86 | 
            +
            		if (y0 <= y)
         | 
| 87 | 
            +
            			break;
         | 
| 88 | 
            +
            		y += step;
         | 
| 89 | 
            +
            		++step_nr;	
         | 
| 90 | 
            +
            	} while (1);
         | 
| 91 | 
            +
            	return a + step_nr;	
         | 
| 66 92 | 
             
            }
         | 
| 67 93 |  | 
| 68 94 | 
             
            /* Irwin-Hall */
         | 
| @@ -75,10 +101,30 @@ double gen_irwin_hall(long n) | |
| 75 101 | 
             
            	return sum;	
         | 
| 76 102 | 
             
            }
         | 
| 77 103 |  | 
| 78 | 
            -
            /*  | 
| 79 | 
            -
             | 
| 104 | 
            +
            /* Rademacher */
         | 
| 105 | 
            +
            int gen_rademacher(void)
         | 
| 80 106 | 
             
            {
         | 
| 81 | 
            -
            	 | 
| 107 | 
            +
            	if (ranf() <= 0.5)
         | 
| 108 | 
            +
            		return -1;
         | 
| 109 | 
            +
            	return 1;	
         | 
| 110 | 
            +
            }
         | 
| 111 | 
            +
             | 
| 112 | 
            +
            /* Rayleigh */
         | 
| 113 | 
            +
            double gen_rayleigh(double sigma)
         | 
| 114 | 
            +
            {
         | 
| 115 | 
            +
            	return sigma * sqrt(-2 * log(1.0 - ranf()));
         | 
| 116 | 
            +
            }
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            /* Pareto */
         | 
| 119 | 
            +
            double gen_pareto(double a, double m)
         | 
| 120 | 
            +
            {
         | 
| 121 | 
            +
            	return m * pow(1 - ranf(), 1.0 / a);
         | 
| 122 | 
            +
            }
         | 
| 123 | 
            +
             | 
| 124 | 
            +
            /* Rectangular */
         | 
| 125 | 
            +
            double gen_rectangular(void)
         | 
| 126 | 
            +
            {
         | 
| 127 | 
            +
            	return (ranf() - 0.5);	
         | 
| 82 128 | 
             
            }
         | 
| 83 129 |  | 
| 84 130 | 
             
            /* Triangular */
         | 
    
        data/lib/ext/xrandlib.h
    CHANGED
    
    | @@ -17,8 +17,13 @@ | |
| 17 17 | 
             
            #ifndef _XRANDLIB_H_
         | 
| 18 18 | 
             
            #define _XRANDLIB_H_
         | 
| 19 19 |  | 
| 20 | 
            -
            extern int | 
| 21 | 
            -
            extern double | 
| 22 | 
            -
            extern  | 
| 20 | 
            +
            extern int 	gen_bernoulli(double);
         | 
| 21 | 
            +
            extern double 	gen_chi_squared(long);
         | 
| 22 | 
            +
            extern long	gen_discrete_uniform(long a, long b);
         | 
| 23 | 
            +
            extern double 	gen_exponential(double);
         | 
| 24 | 
            +
            extern double	gen_pareto(double, double);
         | 
| 25 | 
            +
            extern int 	gen_rademacher(void);
         | 
| 26 | 
            +
            extern double 	gen_rayleigh(double);
         | 
| 27 | 
            +
            extern double	gen_rectangular(void);
         | 
| 23 28 |  | 
| 24 29 | 
             
            #endif /* _XRANDLIB_H_ */
         | 
    
        data/lib/random_variable.rb
    CHANGED
    
    | @@ -32,6 +32,7 @@ | |
| 32 32 | 
             
            =end
         | 
| 33 33 |  | 
| 34 34 | 
             
            require_relative 'ext/random_variable'
         | 
| 35 | 
            +
            require_relative 'sampleable'
         | 
| 35 36 |  | 
| 36 37 | 
             
            module RandomVariable 
         | 
| 37 38 | 
             
            	# obtain the current seed in use
         | 
| @@ -63,14 +64,34 @@ module RandomVariable | |
| 63 64 | 
             
            		distros
         | 
| 64 65 | 
             
            	end
         | 
| 65 66 |  | 
| 66 | 
            -
            	class Generic | 
| 67 | 
            +
            	class Generic
         | 
| 68 | 
            +
            		include Sampleable
         | 
| 69 | 
            +
             | 
| 67 70 | 
             
            		klass = self
         | 
| 68 71 |  | 
| 69 72 | 
             
            		def initialize(&blk)
         | 
| 70 73 | 
             
            			@blk = blk
         | 
| 74 | 
            +
            			
         | 
| 75 | 
            +
            			class << self
         | 
| 76 | 
            +
            				def outcome
         | 
| 77 | 
            +
            					@blk.call
         | 
| 78 | 
            +
            				end
         | 
| 79 | 
            +
            				alias :sample :outcome
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            				def outcomes(nr_samples)
         | 
| 82 | 
            +
            					ary = []
         | 
| 83 | 
            +
            					nr_samples.times do
         | 
| 84 | 
            +
            						ary << @blk.call
         | 
| 85 | 
            +
            					end
         | 
| 86 | 
            +
            					class << ary
         | 
| 87 | 
            +
            						include RandomVariable::Samples
         | 
| 88 | 
            +
            					end
         | 
| 89 | 
            +
            					ary
         | 
| 90 | 
            +
            				end
         | 
| 91 | 
            +
            				alias :samples :outcomes
         | 
| 92 | 
            +
            			end
         | 
| 71 93 | 
             
            		end
         | 
| 72 94 |  | 
| 73 | 
            -
             | 
| 74 95 | 
             
            		operators = %w(+ - * / % **)
         | 
| 75 96 |  | 
| 76 97 | 
             
            		operators.each do |op|
         | 
| @@ -85,22 +106,6 @@ module RandomVariable | |
| 85 106 | 
             
            			end
         | 
| 86 107 | 
             
            		end
         | 
| 87 108 |  | 
| 88 | 
            -
            		# obtain a single outcome from the random variable
         | 
| 89 | 
            -
            		def outcome
         | 
| 90 | 
            -
            			@blk.call
         | 
| 91 | 
            -
            		end
         | 
| 92 | 
            -
            		alias :sample :outcome
         | 
| 93 | 
            -
             | 
| 94 | 
            -
            		# obtain +number+ outcomes from the random variable
         | 
| 95 | 
            -
            		def outcomes(number)
         | 
| 96 | 
            -
            			ary = []
         | 
| 97 | 
            -
            			number.times do
         | 
| 98 | 
            -
            				ary << @blk.call
         | 
| 99 | 
            -
            			end
         | 
| 100 | 
            -
            			ary	
         | 
| 101 | 
            -
            		end
         | 
| 102 | 
            -
            		alias :samples :outcomes
         | 
| 103 | 
            -
            	
         | 
| 104 109 | 
             
            	end
         | 
| 105 110 | 
             
            end
         | 
| 106 111 |  | 
    
        data/lib/sampleable.rb
    ADDED
    
    | @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            ################################################################################
         | 
| 2 | 
            +
            #                                                                              #
         | 
| 3 | 
            +
            # File:     sampleable.rb                                                      #
         | 
| 4 | 
            +
            #                                                                              #
         | 
| 5 | 
            +
            ################################################################################
         | 
| 6 | 
            +
            #                                                                              #
         | 
| 7 | 
            +
            # Author:   Jorge F.M. Rinaldi                                                 #
         | 
| 8 | 
            +
            # Contact:  jorge.madronal.rinaldi@gmail.com                                   #
         | 
| 9 | 
            +
            #                                                                              #
         | 
| 10 | 
            +
            ################################################################################
         | 
| 11 | 
            +
            #                                                                              #
         | 
| 12 | 
            +
            # Date:     2012/12/02                                                         #
         | 
| 13 | 
            +
            #                                                                              #
         | 
| 14 | 
            +
            ################################################################################
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            require_relative 'samples'
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            module RandomVariable::Sampleable
         | 
| 19 | 
            +
            	def outcome
         | 
| 20 | 
            +
            		intern_outcome
         | 
| 21 | 
            +
            	end
         | 
| 22 | 
            +
            	alias :sample :outcome
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            	def outcomes(nr_samples)
         | 
| 25 | 
            +
            		samples_ary = intern_outcomes(nr_samples)
         | 
| 26 | 
            +
            		class << samples_ary
         | 
| 27 | 
            +
            			include RandomVariable::Samples
         | 
| 28 | 
            +
            		end
         | 
| 29 | 
            +
            		samples_ary
         | 
| 30 | 
            +
            	end
         | 
| 31 | 
            +
            	alias :samples :outcomes
         | 
| 32 | 
            +
            end
         | 
    
        data/lib/samples.rb
    ADDED
    
    | @@ -0,0 +1,61 @@ | |
| 1 | 
            +
            ################################################################################
         | 
| 2 | 
            +
            #                                                                              #
         | 
| 3 | 
            +
            # File:     samples.rb                                                         #
         | 
| 4 | 
            +
            #                                                                              #
         | 
| 5 | 
            +
            ################################################################################
         | 
| 6 | 
            +
            #                                                                              #
         | 
| 7 | 
            +
            # Author:   Jorge F.M. Rinaldi                                                 #
         | 
| 8 | 
            +
            # Contact:  jorge.madronal.rinaldi@gmail.com                                   #
         | 
| 9 | 
            +
            #                                                                              #
         | 
| 10 | 
            +
            ################################################################################
         | 
| 11 | 
            +
            #                                                                              #
         | 
| 12 | 
            +
            # Date:     2012/12/02                                                         #
         | 
| 13 | 
            +
            #                                                                              #
         | 
| 14 | 
            +
            ################################################################################
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            module RandomVariable::Samples
         | 
| 17 | 
            +
            	def iterate_samples
         | 
| 18 | 
            +
            		self.each_with_index do |sample, i|
         | 
| 19 | 
            +
            			if block_given? then
         | 
| 20 | 
            +
            				yield(sample, i)
         | 
| 21 | 
            +
            			end	
         | 
| 22 | 
            +
            		end
         | 
| 23 | 
            +
            	end
         | 
| 24 | 
            +
            	
         | 
| 25 | 
            +
            	def max
         | 
| 26 | 
            +
            		cur_max = self[0]
         | 
| 27 | 
            +
            		self.iterate_samples do |sample|
         | 
| 28 | 
            +
            			cur_max = sample if sample > cur_max
         | 
| 29 | 
            +
            		end
         | 
| 30 | 
            +
            		cur_max
         | 
| 31 | 
            +
            	end
         | 
| 32 | 
            +
            	
         | 
| 33 | 
            +
            	def min
         | 
| 34 | 
            +
            		cur_min = self[0]
         | 
| 35 | 
            +
            		self.iterate_samples do |sample|
         | 
| 36 | 
            +
            			cur_min = sample if sample < cur_min
         | 
| 37 | 
            +
            		end
         | 
| 38 | 
            +
            		cur_min
         | 
| 39 | 
            +
            	end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            	def mean
         | 
| 42 | 
            +
            		return nil if 0 == self.size
         | 
| 43 | 
            +
            		acc = 0.0
         | 
| 44 | 
            +
            		self.iterate_samples do |sample|
         | 
| 45 | 
            +
            			acc += sample
         | 
| 46 | 
            +
            		end
         | 
| 47 | 
            +
            		acc / self.size
         | 
| 48 | 
            +
            	end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            	def median
         | 
| 51 | 
            +
            		return nil if 0 == self.size
         | 
| 52 | 
            +
            		return self[0] if 1 == self.size
         | 
| 53 | 
            +
            		ary = self.sort
         | 
| 54 | 
            +
            		i = ary.len / 2
         | 
| 55 | 
            +
            		if ary.len.even? then
         | 
| 56 | 
            +
            			return (ary[i] + ary[i-1]) / 2.0
         | 
| 57 | 
            +
            		else
         | 
| 58 | 
            +
            			return ary[i]
         | 
| 59 | 
            +
            		end
         | 
| 60 | 
            +
            	end
         | 
| 61 | 
            +
            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. | 
| 4 | 
            +
              version: 1.2.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,9 +9,10 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012-12- | 
| 12 | 
            +
            date: 2012-12-15 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies: []
         | 
| 14 | 
            -
            description:  | 
| 14 | 
            +
            description: Probability distributions such as the Binomial, Beta, Chi-Squared, Normal,
         | 
| 15 | 
            +
              Pareto, Poisson, etc.
         | 
| 15 16 | 
             
            email: jorge.madronal.rinaldi@gmail.com
         | 
| 16 17 | 
             
            executables: []
         | 
| 17 18 | 
             
            extensions:
         | 
| @@ -20,6 +21,8 @@ extra_rdoc_files: [] | |
| 20 21 | 
             
            files:
         | 
| 21 22 | 
             
            - lib/random_variable.rb
         | 
| 22 23 | 
             
            - lib/ext/extconf.rb
         | 
| 24 | 
            +
            - lib/samples.rb
         | 
| 25 | 
            +
            - lib/sampleable.rb
         | 
| 23 26 | 
             
            - lib/distros.rb
         | 
| 24 27 | 
             
            - LICENSE
         | 
| 25 28 | 
             
            - COPYING
         | 
| @@ -56,5 +59,5 @@ rubyforge_project: | |
| 56 59 | 
             
            rubygems_version: 1.8.24
         | 
| 57 60 | 
             
            signing_key: 
         | 
| 58 61 | 
             
            specification_version: 3
         | 
| 59 | 
            -
            summary: Random Variables in Ruby
         | 
| 62 | 
            +
            summary: Random Variables in Ruby for a wide variety of probability distributions
         | 
| 60 63 | 
             
            test_files: []
         |