normal_distribution 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bcab113574f1fccfbfdb5652468461ffc009a5f6
4
- data.tar.gz: 877e57cd9026fcad6049d06b3a5824ccadd6314b
3
+ metadata.gz: e57048774793d77b8c736134cfe7a6f966c25e31
4
+ data.tar.gz: 69366dc447c98ecf257c02e5e4ee93dc9fa67540
5
5
  SHA512:
6
- metadata.gz: a702d3cf3623a7b75e64804ce481abacec2d7d202a5b9fcd8a445cddb4a23227d18dc98ba338683954d80158fe69a2f1b13447b891e88dc410ca73483aa85a61
7
- data.tar.gz: e8f18576f23f92172678618ed42a1b782816dd13587fedea8a2f32cc428c8350b427e95421ae24062fb65c3baa9d771ea73dd6700dd83ba28adaef28de5d2864
6
+ metadata.gz: 2731bf134df4c0c4e86ebfd8ece0d5877005523a133aac6e21c6ca94fb071d8be8b4a7443b5c2c84974fcc195cfdb656228892adc4dd8213f7fcbed1bc5acb45
7
+ data.tar.gz: 33acb859a3e228c8c041e40e4244a7ee052e9d81e836197f43c35af72560a05d759205c8b7195ba1ecb6352b64b083b7923b6c711565e3d93824c89f6bed8410
@@ -0,0 +1,41 @@
1
+ #include "confidence_interval.h"
2
+
3
+ static VALUE t_init( VALUE self, VALUE lower_bound, VALUE upper_bound ) {
4
+ double lower = NUM2DBL( lower_bound );
5
+ double upper = NUM2DBL( upper_bound );
6
+
7
+ if ( lower > upper ) {
8
+ rb_raise( rb_eArgError, "lower bound must not be greater then upper bound" );
9
+ }
10
+
11
+ rb_iv_set( self, "@lower_bound", lower_bound );
12
+ rb_iv_set( self, "@upper_bound", upper_bound );
13
+
14
+ return self;
15
+ }
16
+
17
+ static VALUE t_attr_get_upper_bound( VALUE self ) {
18
+ return rb_iv_get( self, "@upper_bound" );
19
+ }
20
+
21
+ static VALUE t_attr_get_lower_bound( VALUE self ) {
22
+ return rb_iv_get( self, "@lower_bound" );
23
+ }
24
+
25
+ static VALUE t_include( VALUE self, VALUE value ) {
26
+ double lower = NUM2DBL( rb_iv_get( self, "@lower_bound" ) );
27
+ double upper = NUM2DBL( rb_iv_get( self, "@upper_bound" ) );
28
+ double v = NUM2DBL( value );
29
+
30
+ return v < lower || v > upper ? Qfalse : Qtrue;
31
+ }
32
+
33
+ void Init_confidence_interval( void ) {
34
+ VALUE rb_mNormalDistribution = rb_path2class( "NormalDistribution" );
35
+ VALUE rb_cConfidenceInterval = rb_define_class_under( rb_mNormalDistribution, "ConfidenceInterval", rb_cObject );
36
+
37
+ rb_define_method( rb_cConfidenceInterval, "initialize", t_init, 2 );
38
+ rb_define_method( rb_cConfidenceInterval, "lower_bound", t_attr_get_lower_bound, 0 );
39
+ rb_define_method( rb_cConfidenceInterval, "upper_bound", t_attr_get_upper_bound, 0 );
40
+ rb_define_method( rb_cConfidenceInterval, "include?", t_include, 1 );
41
+ }
@@ -0,0 +1,8 @@
1
+ #ifndef NORMAL_DISTRIBUTION_CONFIDENCE_INTERVAL_H
2
+ #define NORMAL_DISTRIBUTION_CONFIDENCE_INTERVAL_H
3
+
4
+ #include "ruby.h"
5
+
6
+ void Init_confidence_interval( void );
7
+
8
+ #endif //NORMAL_DISTRIBUTION_CONFIDENCE_INTERVAL_H
@@ -7,6 +7,6 @@
7
7
 
8
8
  #include <math.h>
9
9
 
10
- long double t_erf_inv(long double x);
10
+ long double t_erf_inv( long double x );
11
11
 
12
12
  #endif //NORMAL_DISTRIBUTION_ERF_INV_H
@@ -0,0 +1,111 @@
1
+ #include "model.h"
2
+
3
+ static double t_parse_percentage( VALUE percentage ) {
4
+ double perc = NUM2DBL( percentage );
5
+
6
+ if ( perc > 100 || perc < 0 ) {
7
+ rb_raise( rb_eArgError, "percentage must be between 0 and 100" );
8
+ }
9
+
10
+ return perc;
11
+ }
12
+
13
+ static double t_mean( double * data, long size ) {
14
+ double sum = .0;
15
+
16
+ for ( long i = 0 ; i < size ; ++ i ) {
17
+ sum += data[i];
18
+ }
19
+
20
+ return sum / size;
21
+ }
22
+
23
+ static double t_z_score( double percentage ) {
24
+ return sqrt( 2 ) * t_erf_inv( percentage / 100 );
25
+ }
26
+
27
+ static double t_variance( double * data, long size, double mean ) {
28
+ double * squared_diff = ALLOC_N( double, size );
29
+
30
+ for ( long i = 0 ; i < size ; ++ i ) {
31
+ squared_diff[i] = pow( mean - data[i], 2 );
32
+ }
33
+
34
+ double variance = t_mean( squared_diff, size );
35
+ free( squared_diff );
36
+
37
+ return variance;
38
+ }
39
+
40
+ static double t_stddev( double * data, long size, double mean ) {
41
+ return sqrt( t_variance( data, size, mean ) );
42
+ }
43
+
44
+ static double * t_parse_dbl_ary( VALUE ary, long * size ) {
45
+ Check_Type( ary, T_ARRAY );
46
+ long len = RARRAY_LEN( ary );
47
+
48
+ if ( len == 0 ) {
49
+ rb_raise( rb_eArgError, "data must not be empty" );
50
+ }
51
+
52
+ VALUE * values = RARRAY_PTR( ary );
53
+ double * d_data = ALLOC_N( double, len );
54
+
55
+ for ( int i = 0 ; i < len ; ++ i ) {
56
+ d_data[i] = NUM2DBL( values[i] );
57
+ }
58
+
59
+ *size = len;
60
+
61
+ return d_data;
62
+ }
63
+
64
+ static VALUE t_init( VALUE self, VALUE values ) {
65
+ long size;
66
+ double * data = t_parse_dbl_ary( values, &size );
67
+ double mean = t_mean( data, size );
68
+ double stddev = t_stddev( data, size, mean );
69
+
70
+ rb_iv_set( self, "@mean", rb_float_new( mean ) );
71
+ rb_iv_set( self, "@standard_deviation", rb_float_new( stddev ) );
72
+ xfree( data );
73
+
74
+ return self;
75
+ }
76
+
77
+ static VALUE t_confidence_interval( VALUE self, VALUE percentage ) {
78
+ double perc = t_parse_percentage( percentage );
79
+ double z = t_z_score( perc );
80
+ double stddev = NUM2DBL( rb_iv_get( self, "@standard_deviation" ) );
81
+ double mean = NUM2DBL( rb_iv_get( self, "@mean" ) );
82
+ double lower_bound = - z * stddev + mean;
83
+ double upper_bound = z * stddev + mean;
84
+
85
+ VALUE rb_cConfidenceInterval = rb_path2class( "NormalDistribution::ConfidenceInterval" );
86
+ VALUE interval = rb_funcall(
87
+ rb_cConfidenceInterval, rb_intern( "new" ), 2,
88
+ rb_float_new( lower_bound ),
89
+ rb_float_new( upper_bound )
90
+ );
91
+
92
+ return interval;
93
+ }
94
+
95
+ static VALUE t_attr_mean( VALUE self ) {
96
+ return rb_iv_get( self, "@mean" );
97
+ }
98
+
99
+ static VALUE t_attr_stddev( VALUE self ) {
100
+ return rb_iv_get( self, "@standard_deviation" );
101
+ }
102
+
103
+ void Init_model( void ) {
104
+ VALUE rb_mNormalDistribution = rb_path2class( "NormalDistribution" );
105
+ VALUE rb_cModel = rb_define_class_under( rb_mNormalDistribution, "Model", rb_cObject );
106
+
107
+ rb_define_method( rb_cModel, "initialize", t_init, 1 );
108
+ rb_define_method( rb_cModel, "confidence_interval", t_confidence_interval, 1 );
109
+ rb_define_method( rb_cModel, "mean", t_attr_mean, 0 );
110
+ rb_define_method( rb_cModel, "standard_deviation", t_attr_stddev, 0 );
111
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef NORMAL_DISTRIBUTION_MODEL_H
2
+ #define NORMAL_DISTRIBUTION_MODEL_H
3
+
4
+ #include "ruby.h"
5
+ #include "erf_inv.h"
6
+ #include "confidence_interval.h"
7
+
8
+ void Init_model( void );
9
+
10
+ #endif //NORMAL_DISTRIBUTION_MODEL_H
@@ -1,108 +1,8 @@
1
1
  #include "normal_distribution.h"
2
2
 
3
- static double t_parse_percentage(VALUE percentage) {
4
- double perc = NUM2DBL( percentage );
5
-
6
- if (perc > 100 || perc < 0) {
7
- rb_raise(rb_eArgError, "percentage must be between 0 and 100");
8
- }
9
-
10
- return perc;
11
- }
12
-
13
- static double t_mean( double * data, long size ) {
14
- double sum = .0;
15
-
16
- for ( long i = 0 ; i < size ; ++ i ) {
17
- sum += data[i];
18
- }
19
-
20
- return sum / size;
21
- }
22
-
23
- static double t_z_score( double percentage ) {
24
- return sqrt( 2 ) * t_erf_inv( percentage / 100 );
25
- }
26
-
27
- static double t_variance( double * data, long size, double mean ) {
28
- double * squared_diff = ALLOC_N( double, size );
29
-
30
- for ( long i = 0 ; i < size ; ++ i ) {
31
- squared_diff[i] = pow( mean - data[i], 2 );
32
- }
33
-
34
- double variance = t_mean( squared_diff, size );
35
- free( squared_diff );
36
-
37
- return variance;
38
- }
39
-
40
- static double t_stddev( double * data, long size, double mean ) {
41
- return sqrt( t_variance( data, size, mean ) );
42
- }
43
-
44
- static double * t_parse_dbl_ary( VALUE ary, long * size ) {
45
- Check_Type(ary, T_ARRAY);
46
- long len = RARRAY_LEN( ary );
47
-
48
- if (len == 0) {
49
- rb_raise(rb_eArgError, "data must not be empty");
50
- }
51
-
52
- VALUE * values = RARRAY_PTR( ary );
53
- double * d_data = ALLOC_N( double, len );
54
-
55
- for ( int i = 0 ; i < len ; ++ i ) {
56
- d_data[i] = NUM2DBL( values[i] );
57
- }
58
-
59
- *size = len;
60
-
61
- return d_data;
62
- }
63
-
64
- static VALUE t_init( VALUE self, VALUE values ) {
65
- long size;
66
- double * data = t_parse_dbl_ary( values, &size );
67
- double mean = t_mean( data, size );
68
- double stddev = t_stddev( data, size, mean );
69
-
70
- rb_iv_set( self, "@mean", rb_float_new( mean ) );
71
- rb_iv_set( self, "@standard_deviation", rb_float_new( stddev ) );
72
- free( data );
73
-
74
- return self;
75
- }
76
-
77
- static VALUE t_confidence_interval( VALUE self, VALUE percentage ) {
78
- double perc = t_parse_percentage( percentage );
79
- double z = t_z_score( perc );
80
- double stddev = NUM2DBL( rb_iv_get( self, "@standard_deviation" ) );
81
- double mean = NUM2DBL( rb_iv_get( self, "@mean" ) );
82
- double lower_bound = - z * stddev + mean;
83
- double upper_bound = z * stddev + mean;
84
-
85
- VALUE pair = rb_ary_new();
86
- rb_ary_push( pair, rb_float_new( lower_bound ) );
87
- rb_ary_push( pair, rb_float_new( upper_bound ) );
88
-
89
- return pair;
90
- }
91
-
92
- static VALUE t_attr_mean( VALUE self ) {
93
- return rb_iv_get( self, "@mean" );
94
- }
95
-
96
- static VALUE t_attr_stddev( VALUE self ) {
97
- return rb_iv_get( self, "@standard_deviation" );
98
- }
99
-
100
3
  void Init_normal_distribution( void ) {
101
- VALUE module = rb_define_module( "NormalDistribution" );
102
- VALUE model = rb_define_class_under( module, "Model", rb_cObject );
4
+ rb_define_module( "NormalDistribution" );
103
5
 
104
- rb_define_method( model, "initialize", t_init, 1 );
105
- rb_define_method( model, "confidence_interval", t_confidence_interval, 1 );
106
- rb_define_method( model, "mean", t_attr_mean, 0 );
107
- rb_define_method( model, "standard_deviation", t_attr_stddev, 0 );
6
+ Init_confidence_interval();
7
+ Init_model();
108
8
  }
@@ -1,10 +1,7 @@
1
1
  #ifndef NORMAL_DISTRIBUTION_H
2
- #define NORMAL_DISTRIBUTION_H 1
2
+ #define NORMAL_DISTRIBUTION_H
3
3
 
4
- #include <stdio.h>
5
- #include <stdlib.h>
6
- #include <math.h>
7
- #include "ruby.h"
8
- #include "erf_inv.h"
4
+ #include "model.h"
5
+ #include "confidence_interval.h"
9
6
 
10
- #endif /* NORMAL_DISTRIBUTION_H */
7
+ #endif //NORMAL_DISTRIBUTION_H
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NormalDistribution
4
+ # Confidence interval of normal distribution
5
+ #
6
+ # @since 0.2.0
7
+ class ConfidenceInterval
8
+ # @!parse [ruby]
9
+ #
10
+ # # @return [Float] lower bound of confidence interval
11
+ # attr_reader :lower_bound
12
+ #
13
+ # # @return [Float] upper bound of confidence interval
14
+ # attr_reader :upper_bound
15
+ #
16
+ # # Initializes confidence interval
17
+ # #
18
+ # # @param lower_bound [Numeric] lower bound of confidence interval
19
+ # # @param upper_bound [Numeric] upper bound of confidence interval
20
+ # def initialize(lower_bound, upper_bound)
21
+ # # This is stub used for indexing
22
+ # end
23
+ #
24
+ # # Decides, whether value is from the interval
25
+ # #
26
+ # # @param value [Numeric] value to be compared with interval bounds
27
+ # # @return [Boolean] true if value is from the interval. Otherwise returns false.
28
+ # def include?(value)
29
+ # # This is stub used for indexing
30
+ # end
31
+ end
32
+ end
@@ -20,10 +20,12 @@ module NormalDistribution
20
20
  # # This is stub used for indexing
21
21
  # end
22
22
  #
23
- # # Calculates confidence interval for given percentage
23
+ # # Calculates confidence interval for given probability in percentage
24
24
  # #
25
- # # @param percentage [Numeric] a number in interval <0, 100> representing probability
26
- # # @return [Array<Float>] an array containing 2 values, lower bound and upper_bound of confidence interval
25
+ # # @param percentage [Numeric] a number in interval <0, 100> representing probability in percentage
26
+ # # @return [ConfidenceInterval] an instance of ConfidenceInterval class
27
+ # #
28
+ # # @since 0.2.0
27
29
  # def confidence_interval(percentage)
28
30
  # # This is stub used for indexing
29
31
  # end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module NormalDistribution
4
4
  # Current version of NormalDistribution gem
5
- VERSION = "0.1.2"
5
+ VERSION = "0.2.0"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: normal_distribution
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Čermák
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-16 00:00:00.000000000 Z
11
+ date: 2020-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -104,12 +104,17 @@ extensions:
104
104
  - ext/normal_distribution/extconf.rb
105
105
  extra_rdoc_files: []
106
106
  files:
107
+ - ext/normal_distribution/confidence_interval.c
108
+ - ext/normal_distribution/confidence_interval.h
107
109
  - ext/normal_distribution/erf_inv.c
108
110
  - ext/normal_distribution/erf_inv.h
109
111
  - ext/normal_distribution/extconf.rb
112
+ - ext/normal_distribution/model.c
113
+ - ext/normal_distribution/model.h
110
114
  - ext/normal_distribution/normal_distribution.c
111
115
  - ext/normal_distribution/normal_distribution.h
112
116
  - lib/normal_distribution.rb
117
+ - lib/normal_distribution/confidence_interval.rb
113
118
  - lib/normal_distribution/model.rb
114
119
  - lib/normal_distribution/version.rb
115
120
  homepage: https://github.com/domcermak/normal_distribution