normal_distribution 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 662e907768609223b84adda82f20f9dbba538b2b
4
+ data.tar.gz: d8b1598c480018ae67999e987be9d18d65340e00
5
+ SHA512:
6
+ metadata.gz: c99cc756d443cc770d661f9c841be2c33c5526625ac53c26c959bcb725b6908ddfc8ef522221810db9dda39641cf4653ff49ce9de0c9d59e0e66e2468de6b6d6
7
+ data.tar.gz: 258308f35c9436adda2e0023c2f0dcb540014b2e0ffd4f482e8f4e12adfc5a5855f9bb0b3d6216865757bcea36c060435593fa6b068ef44323a5f780fd63ffb9
@@ -0,0 +1,91 @@
1
+ #include "erf_inv.h"
2
+
3
+ long double t_erf_inv(long double x) {
4
+ if (x < -1 || x > 1) {
5
+ return NAN;
6
+ } else if (x == 1.0) {
7
+ return INFINITY;
8
+ } else if (x == -1.0) {
9
+ return -INFINITY;
10
+ }
11
+
12
+ const long double LN2 = 6.931471805599453094172321214581e-1L;
13
+
14
+ const long double A0 = 1.1975323115670912564578e0L;
15
+ const long double A1 = 4.7072688112383978012285e1L;
16
+ const long double A2 = 6.9706266534389598238465e2L;
17
+ const long double A3 = 4.8548868893843886794648e3L;
18
+ const long double A4 = 1.6235862515167575384252e4L;
19
+ const long double A5 = 2.3782041382114385731252e4L;
20
+ const long double A6 = 1.1819493347062294404278e4L;
21
+ const long double A7 = 8.8709406962545514830200e2L;
22
+
23
+ const long double B0 = 1.0000000000000000000e0L;
24
+ const long double B1 = 4.2313330701600911252e1L;
25
+ const long double B2 = 6.8718700749205790830e2L;
26
+ const long double B3 = 5.3941960214247511077e3L;
27
+ const long double B4 = 2.1213794301586595867e4L;
28
+ const long double B5 = 3.9307895800092710610e4L;
29
+ const long double B6 = 2.8729085735721942674e4L;
30
+ const long double B7 = 5.2264952788528545610e3L;
31
+
32
+ const long double C0 = 1.42343711074968357734e0L;
33
+ const long double C1 = 4.63033784615654529590e0L;
34
+ const long double C2 = 5.76949722146069140550e0L;
35
+ const long double C3 = 3.64784832476320460504e0L;
36
+ const long double C4 = 1.27045825245236838258e0L;
37
+ const long double C5 = 2.41780725177450611770e-1L;
38
+ const long double C6 = 2.27238449892691845833e-2L;
39
+ const long double C7 = 7.74545014278341407640e-4L;
40
+
41
+ const long double D0 = 1.4142135623730950488016887e0L;
42
+ const long double D1 = 2.9036514445419946173133295e0L;
43
+ const long double D2 = 2.3707661626024532365971225e0L;
44
+ const long double D3 = 9.7547832001787427186894837e-1L;
45
+ const long double D4 = 2.0945065210512749128288442e-1L;
46
+ const long double D5 = 2.1494160384252876777097297e-2L;
47
+ const long double D6 = 7.7441459065157709165577218e-4L;
48
+ const long double D7 = 1.4859850019840355905497876e-9L;
49
+
50
+ const long double E0 = 6.65790464350110377720e0L;
51
+ const long double E1 = 5.46378491116411436990e0L;
52
+ const long double E2 = 1.78482653991729133580e0L;
53
+ const long double E3 = 2.96560571828504891230e-1L;
54
+ const long double E4 = 2.65321895265761230930e-2L;
55
+ const long double E5 = 1.24266094738807843860e-3L;
56
+ const long double E6 = 2.71155556874348757815e-5L;
57
+ const long double E7 = 2.01033439929228813265e-7L;
58
+
59
+ const long double F0 = 1.414213562373095048801689e0L;
60
+ const long double F1 = 8.482908416595164588112026e-1L;
61
+ const long double F2 = 1.936480946950659106176712e-1L;
62
+ const long double F3 = 2.103693768272068968719679e-2L;
63
+ const long double F4 = 1.112800997078859844711555e-3L;
64
+ const long double F5 = 2.611088405080593625138020e-5L;
65
+ const long double F6 = 2.010321207683943062279931e-7L;
66
+ const long double F7 = 2.891024605872965461538222e-15L;
67
+
68
+ long double abs_x = fabsl(x);
69
+
70
+ if (abs_x <= 0.85L) {
71
+ long double r = 0.180625L - 0.25L * x * x;
72
+ long double num = (((((((A7 * r + A6) * r + A5) * r + A4) * r + A3) * r + A2) * r + A1) * r + A0);
73
+ long double den = (((((((B7 * r + B6) * r + B5) * r + B4) * r + B3) * r + B2) * r + B1) * r + B0);
74
+ return x * num / den;
75
+ }
76
+
77
+ long double r = sqrtl(LN2 - logl(1.0L - abs_x));
78
+
79
+ long double num, den;
80
+ if (r <= 5.0L) {
81
+ r = r - 1.6L;
82
+ num = (((((((C7 * r + C6) * r + C5) * r + C4) * r + C3) * r + C2) * r + C1) * r + C0);
83
+ den = (((((((D7 * r + D6) * r + D5) * r + D4) * r + D3) * r + D2) * r + D1) * r + D0);
84
+ } else {
85
+ r = r - 5.0L;
86
+ num = (((((((E7 * r + E6) * r + E5) * r + E4) * r + E3) * r + E2) * r + E1) * r + E0);
87
+ den = (((((((F7 * r + F6) * r + F5) * r + F4) * r + F3) * r + F2) * r + F1) * r + F0);
88
+ }
89
+
90
+ return copysignl(num / den, x);
91
+ }
@@ -0,0 +1,12 @@
1
+ ///
2
+ /// https://github.com/lakshayg/erfinv
3
+ ///
4
+
5
+ #ifndef NORMAL_DISTRIBUTION_ERF_INV_H
6
+ #define NORMAL_DISTRIBUTION_ERF_INV_H
7
+
8
+ #include <math.h>
9
+
10
+ long double t_erf_inv(long double x);
11
+
12
+ #endif //NORMAL_DISTRIBUTION_ERF_INV_H
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mkmf"
4
+
5
+ create_makefile("normal_distribution/normal_distribution")
@@ -0,0 +1,108 @@
1
+ #include "normal_distribution.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
+ 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
+ void Init_normal_distribution( void ) {
101
+ VALUE module = rb_define_module( "NormalDistribution" );
102
+ VALUE model = rb_define_class_under( module, "Model", rb_cObject );
103
+
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 );
108
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef NORMAL_DISTRIBUTION_H
2
+ #define NORMAL_DISTRIBUTION_H 1
3
+
4
+ #include <stdio.h>
5
+ #include <stdlib.h>
6
+ #include <math.h>
7
+ #include "ruby.h"
8
+ #include "erf_inv.h"
9
+
10
+ #endif /* NORMAL_DISTRIBUTION_H */
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "normal_distribution/version"
4
+ require "normal_distribution/normal_distribution"
5
+
6
+ module NormalDistribution
7
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NormalDistribution
4
+ class Model
5
+ # :nodoc:
6
+ # attr_reader :mean
7
+
8
+ # :nodoc:
9
+ # attr_reader :standard_deviation
10
+
11
+ # Initializes normal distribution from given data
12
+ # Params:
13
+ # +values+:: Non-empty array of numbers representing data for normal distribution construction
14
+ # def initialize(values); end
15
+
16
+ # Creates confidence interval for given percentage
17
+ # Params:
18
+ # +percentage+:: Number in interval <0, 100>
19
+ # def confidence_interval(percentage); end
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NormalDistribution
4
+ VERSION = "0.1.0"
5
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: normal_distribution
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dominik Čermák
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-benchmark
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email:
85
+ - domcermak64@gmail.com
86
+ executables: []
87
+ extensions:
88
+ - ext/normal_distribution/extconf.rb
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ext/normal_distribution/erf_inv.c
92
+ - ext/normal_distribution/erf_inv.h
93
+ - ext/normal_distribution/extconf.rb
94
+ - ext/normal_distribution/normal_distribution.c
95
+ - ext/normal_distribution/normal_distribution.h
96
+ - lib/normal_distribution.rb
97
+ - lib/normal_distribution/model.rb
98
+ - lib/normal_distribution/version.rb
99
+ homepage:
100
+ licenses:
101
+ - MIT
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ - ext
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ requirements: []
119
+ rubyforge_project:
120
+ rubygems_version: 2.6.14
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: This gem provides library to detect anomalies in numerical data via normal
124
+ distribution
125
+ test_files: []