apriori 0.2.1
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/History.txt +16 -0
- data/License.txt +20 -0
- data/Manifest.txt +121 -0
- data/README.txt +149 -0
- data/Rakefile +15 -0
- data/TODO.txt +60 -0
- data/attic/c_ext_test1/MyTest/MyTest.c +23 -0
- data/attic/c_ext_test1/MyTest/extconf.rb +11 -0
- data/attic/c_ext_test1/mytest.rb +10 -0
- data/attic/test.c +12 -0
- data/config/hoe.rb +81 -0
- data/config/requirements.rb +29 -0
- data/examples/01_simple_example.rb +32 -0
- data/examples/02_small_file_example.rb +17 -0
- data/examples/03_large_file_example.rb +22 -0
- data/examples/test_data/market_basket_basic_test.dat +9 -0
- data/ext/Apriori.c +149 -0
- data/ext/Makefile +149 -0
- data/ext/apriori/doc/apriori.html +1301 -0
- data/ext/apriori/doc/arem.gp +68 -0
- data/ext/apriori/doc/c_rev.gp +89 -0
- data/ext/apriori/doc/chi2.tex +156 -0
- data/ext/apriori/doc/copying +504 -0
- data/ext/apriori/doc/line.gif +0 -0
- data/ext/apriori/doc/uparrow.gif +0 -0
- data/ext/apriori/ex/flg2set +15 -0
- data/ext/apriori/ex/hdr2set +13 -0
- data/ext/apriori/ex/readme +71 -0
- data/ext/apriori/ex/row2set +7 -0
- data/ext/apriori/ex/rulesort +24 -0
- data/ext/apriori/ex/tab2set +9 -0
- data/ext/apriori/ex/test.app +2 -0
- data/ext/apriori/ex/test.rul +9 -0
- data/ext/apriori/ex/test1.rul +43 -0
- data/ext/apriori/ex/test1.tab +10 -0
- data/ext/apriori/ex/test2.tab +10 -0
- data/ext/apriori/ex/test3.tab +30 -0
- data/ext/apriori/ex/test4.tab +11 -0
- data/ext/apriori/ex/test5.tab +39 -0
- data/ext/apriori/ex/tid2set +23 -0
- data/ext/apriori/ex/xhdr2set +33 -0
- data/ext/apriori/src/apriori.c +750 -0
- data/ext/apriori/src/apriori.dsp +120 -0
- data/ext/apriori/src/apriori.dsw +29 -0
- data/ext/apriori/src/apriori.mak +99 -0
- data/ext/apriori/src/istree.c +1411 -0
- data/ext/apriori/src/istree.h +160 -0
- data/ext/apriori/src/makefile +105 -0
- data/ext/apriori/src/tract.c +870 -0
- data/ext/apriori/src/tract.h +261 -0
- data/ext/apriori_wrapper.c +757 -0
- data/ext/apriori_wrapper.h +10 -0
- data/ext/extconf.rb +32 -0
- data/ext/math/doc/copying +504 -0
- data/ext/math/src/chi2.c +151 -0
- data/ext/math/src/chi2.h +27 -0
- data/ext/math/src/choose.c +71 -0
- data/ext/math/src/choose.h +16 -0
- data/ext/math/src/gamma.c +446 -0
- data/ext/math/src/gamma.h +39 -0
- data/ext/math/src/intexp.c +35 -0
- data/ext/math/src/intexp.h +15 -0
- data/ext/math/src/makefile +164 -0
- data/ext/math/src/math.mak +48 -0
- data/ext/math/src/normal.c +387 -0
- data/ext/math/src/normal.h +44 -0
- data/ext/math/src/radfn.c +113 -0
- data/ext/math/src/radfn.h +34 -0
- data/ext/math/src/zeta.c +49 -0
- data/ext/math/src/zeta.h +15 -0
- data/ext/pre-clean.rb +8 -0
- data/ext/pre-setup.rb +9 -0
- data/ext/util/doc/copying +504 -0
- data/ext/util/src/listops.c +76 -0
- data/ext/util/src/listops.h +26 -0
- data/ext/util/src/makefile +103 -0
- data/ext/util/src/memsys.c +84 -0
- data/ext/util/src/memsys.h +42 -0
- data/ext/util/src/nstats.c +288 -0
- data/ext/util/src/nstats.h +69 -0
- data/ext/util/src/params.c +86 -0
- data/ext/util/src/params.h +19 -0
- data/ext/util/src/parse.c +133 -0
- data/ext/util/src/parse.h +81 -0
- data/ext/util/src/scan.c +767 -0
- data/ext/util/src/scan.h +111 -0
- data/ext/util/src/symtab.c +443 -0
- data/ext/util/src/symtab.h +121 -0
- data/ext/util/src/tabscan.c +279 -0
- data/ext/util/src/tabscan.h +99 -0
- data/ext/util/src/util.mak +91 -0
- data/ext/util/src/vecops.c +317 -0
- data/ext/util/src/vecops.h +42 -0
- data/lib/apriori.rb +133 -0
- data/lib/apriori/adapter.rb +13 -0
- data/lib/apriori/association_rule.rb +89 -0
- data/lib/apriori/version.rb +9 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +82 -0
- data/setup.rb +1585 -0
- data/tasks/apriori.rake +20 -0
- data/tasks/attic.rake +28 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/install.rake +13 -0
- data/tasks/website.rake +17 -0
- data/test/apriori_test.rb +13 -0
- data/test/fixtures/market_basket_results_test.txt +5 -0
- data/test/fixtures/market_basket_string_test.txt +7 -0
- data/test/fixtures/results.txt +2 -0
- data/test/fixtures/sample.txt +7 -0
- data/test/test_helper.rb +5 -0
- data/test/unit/test_apriori.rb +68 -0
- data/test/unit/test_itemsets_and_parsing.rb +82 -0
- data/website/index.html +248 -0
- data/website/index.txt +152 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +142 -0
- data/website/template.html.erb +49 -0
- metadata +226 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/*----------------------------------------------------------------------
|
|
2
|
+
File : gamma.h
|
|
3
|
+
Contents: computation of the (incomplete) gamma function
|
|
4
|
+
Author : Christian Borgelt
|
|
5
|
+
History : 2002.07.04 file created
|
|
6
|
+
2002.08.02 function Gamma added
|
|
7
|
+
2003.05.19 incomplete Gamma function added
|
|
8
|
+
2008.03.14 more incomplete Gamma functions added
|
|
9
|
+
2008.03.17 gamma distribution functions added
|
|
10
|
+
----------------------------------------------------------------------*/
|
|
11
|
+
#ifndef __GAMMA__
|
|
12
|
+
#define __GAMMA__
|
|
13
|
+
|
|
14
|
+
/*----------------------------------------------------------------------
|
|
15
|
+
Functions
|
|
16
|
+
----------------------------------------------------------------------*/
|
|
17
|
+
extern double logGamma (double n);
|
|
18
|
+
extern double Gamma (double n);
|
|
19
|
+
extern double lowerGamma (double n, double x);
|
|
20
|
+
extern double upperGamma (double n, double x);
|
|
21
|
+
extern double GammaP (double n, double x);
|
|
22
|
+
extern double GammaQ (double n, double x);
|
|
23
|
+
|
|
24
|
+
extern double Gammapdf (double x, double k, double theta);
|
|
25
|
+
extern double Gammacdf (double x, double k, double theta);
|
|
26
|
+
extern double GammacdfP (double x, double k, double theta);
|
|
27
|
+
extern double GammacdfQ (double x, double k, double theta);
|
|
28
|
+
extern double Gammaqtl (double prob, double k, double theta);
|
|
29
|
+
extern double GammaqtlP (double prob, double k, double theta);
|
|
30
|
+
extern double GammaqtlQ (double prob, double k, double theta);
|
|
31
|
+
|
|
32
|
+
/*----------------------------------------------------------------------
|
|
33
|
+
Preprocessor Definitions
|
|
34
|
+
----------------------------------------------------------------------*/
|
|
35
|
+
#define Gammacdf(x,k,t) GammaP(k,(x)/(t))
|
|
36
|
+
#define GammacdfP(x,k,t) GammaP(k,(x)/(t))
|
|
37
|
+
#define GammacdfQ(x,k,t) GammaQ(k,(x)/(t))
|
|
38
|
+
|
|
39
|
+
#endif
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/*----------------------------------------------------------------------
|
|
2
|
+
File : intexp.c
|
|
3
|
+
Contents: raise x to the power of n, n integer
|
|
4
|
+
Author : Christian Borgelt
|
|
5
|
+
History : 17.05.2003 file created
|
|
6
|
+
----------------------------------------------------------------------*/
|
|
7
|
+
#include "intexp.h"
|
|
8
|
+
|
|
9
|
+
/*----------------------------------------------------------------------
|
|
10
|
+
Functions
|
|
11
|
+
----------------------------------------------------------------------*/
|
|
12
|
+
#if 0
|
|
13
|
+
|
|
14
|
+
double intexp (double x, int n)
|
|
15
|
+
{ /* --- raise x to the power of n */
|
|
16
|
+
if (n <= 0) return 0; /* check for immediate cases, otherw. */
|
|
17
|
+
if (n <= 1) return x; /* apply the recursive formula */
|
|
18
|
+
if (n & 1) return intexp(x*x, n >> 1) *x;
|
|
19
|
+
else return intexp(x*x, n >> 1);
|
|
20
|
+
} /* intexp() */
|
|
21
|
+
|
|
22
|
+
#else /*--------------------------------------------------------------*/
|
|
23
|
+
|
|
24
|
+
double intexp (double x, int n)
|
|
25
|
+
{ /* --- raise x to the power of n */
|
|
26
|
+
double r = (n & 1) ? x : 1; /* result */
|
|
27
|
+
|
|
28
|
+
for (n >>= 1; n > 0; n >>= 1) {
|
|
29
|
+
x *= x; /* traverse the powers of 2 and */
|
|
30
|
+
if (n & 1) r *= x; /* multiply them into the result */
|
|
31
|
+
} /* if the corr. exponent bit is set */
|
|
32
|
+
return r; /* return the result */
|
|
33
|
+
} /* intexp() */
|
|
34
|
+
|
|
35
|
+
#endif
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*----------------------------------------------------------------------
|
|
2
|
+
File : intexp.h
|
|
3
|
+
Contents: raise x to the power of n, n integer
|
|
4
|
+
Author : Christian Borgelt
|
|
5
|
+
History : 17.05.2003 file created
|
|
6
|
+
----------------------------------------------------------------------*/
|
|
7
|
+
#ifndef __INTEXP__
|
|
8
|
+
#define __INTEXP__
|
|
9
|
+
|
|
10
|
+
/*----------------------------------------------------------------------
|
|
11
|
+
Functions
|
|
12
|
+
----------------------------------------------------------------------*/
|
|
13
|
+
extern double intexp (double x, int n);
|
|
14
|
+
|
|
15
|
+
#endif
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#-----------------------------------------------------------------------
|
|
2
|
+
# File : makefile (directory: math)
|
|
3
|
+
# Contents: build math utility modules
|
|
4
|
+
# Author : Christian Borgelt
|
|
5
|
+
# History : 2002.07.04 file created from makefile in util directory
|
|
6
|
+
# 2003.05.19 intexp, choose, zeta, quantile, and normd added
|
|
7
|
+
# 2003.08.15 module radfn added
|
|
8
|
+
# 2008.03.14 main programs added, quantile.c split/removed
|
|
9
|
+
# 2008.03.17 gamma distribution functions added
|
|
10
|
+
#-----------------------------------------------------------------------
|
|
11
|
+
CC = gcc
|
|
12
|
+
CFBASE = -ansi -Wall -pedantic $(ADDFLAGS)
|
|
13
|
+
CFLAGS = $(CFBASE) -DNDEBUG -O3
|
|
14
|
+
# CFLAGS = $(CFBASE) -g
|
|
15
|
+
LDFLAGS =
|
|
16
|
+
LIBS = -lm
|
|
17
|
+
|
|
18
|
+
GAMMA = gammapdf gammacdf gammaqtl
|
|
19
|
+
NORMAL = normpdf normcdf normqtl
|
|
20
|
+
CHI2 = chi2pdf chi2cdf chi2qtl
|
|
21
|
+
PROGS = $(GAMMA) $(NORMAL) $(CHI2) gamma choose zeta
|
|
22
|
+
|
|
23
|
+
#-----------------------------------------------------------------------
|
|
24
|
+
# Build Programs
|
|
25
|
+
#-----------------------------------------------------------------------
|
|
26
|
+
all: $(PROGS)
|
|
27
|
+
|
|
28
|
+
gamma: gammain.o makefile
|
|
29
|
+
$(CC) $(LDFLAGS) $(LIBS) gammain.o -o $@
|
|
30
|
+
|
|
31
|
+
choose: chsmain.o makefile
|
|
32
|
+
$(CC) $(LDFLAGS) $(LIBS) chsmain.o -o $@
|
|
33
|
+
|
|
34
|
+
zeta: zetamain.o makefile
|
|
35
|
+
$(CC) $(LDFLAGS) $(LIBS) zetamain.o -o $@
|
|
36
|
+
|
|
37
|
+
gammapdf: gammapdf.o makefile
|
|
38
|
+
$(CC) $(LDFLAGS) $(LIBS) gammapdf.o -o $@
|
|
39
|
+
|
|
40
|
+
gammacdf: gammacdf.o makefile
|
|
41
|
+
$(CC) $(LDFLAGS) $(LIBS) gammacdf.o -o $@
|
|
42
|
+
|
|
43
|
+
gammaqtl: gammaqtl.o normal.o makefile
|
|
44
|
+
$(CC) $(LDFLAGS) $(LIBS) normal.o gammaqtl.o -o $@
|
|
45
|
+
|
|
46
|
+
normpdf: normpdf.o makefile
|
|
47
|
+
$(CC) $(LDFLAGS) $(LIBS) normpdf.o -o $@
|
|
48
|
+
|
|
49
|
+
normcdf: normcdf.o makefile
|
|
50
|
+
$(CC) $(LDFLAGS) $(LIBS) normcdf.o -o $@
|
|
51
|
+
|
|
52
|
+
normqtl: normqtl.o gamma.o makefile
|
|
53
|
+
$(CC) $(LDFLAGS) $(LIBS) gamma.o normqtl.o -o $@
|
|
54
|
+
|
|
55
|
+
chi2pdf: chi2pdf.o gamma.o makefile
|
|
56
|
+
$(CC) $(LDFLAGS) $(LIBS) gamma.o chi2pdf.o -o $@
|
|
57
|
+
|
|
58
|
+
chi2cdf: chi2cdf.o gamma.o makefile
|
|
59
|
+
$(CC) $(LDFLAGS) $(LIBS) gamma.o chi2cdf.o -o $@
|
|
60
|
+
|
|
61
|
+
chi2qtl: chi2qtl.o gammall.o normal.o makefile
|
|
62
|
+
$(CC) $(LDFLAGS) $(LIBS) gammall.o normal.o chi2qtl.o -o $@
|
|
63
|
+
|
|
64
|
+
#-----------------------------------------------------------------------
|
|
65
|
+
# Programs
|
|
66
|
+
#-----------------------------------------------------------------------
|
|
67
|
+
gammain.o: gamma.h
|
|
68
|
+
gammain.o: gamma.c makefile
|
|
69
|
+
$(CC) $(CFLAGS) -DGAMMA_MAIN -c gamma.c -o $@
|
|
70
|
+
|
|
71
|
+
chsmain.o: choose.h
|
|
72
|
+
chsmain.o: choose.c makefile
|
|
73
|
+
$(CC) $(CFLAGS) -DCHOOSE_MAIN -c choose.c -o $@
|
|
74
|
+
|
|
75
|
+
zetamain.o: zeta.h
|
|
76
|
+
zetamain.o: zeta.c makefile
|
|
77
|
+
$(CC) $(CFLAGS) -DZETA_MAIN -c zeta.c -o $@
|
|
78
|
+
|
|
79
|
+
gammapdf.o: gamma.h
|
|
80
|
+
gammapdf.o: gamma.c makefile
|
|
81
|
+
$(CC) $(CFLAGS) -DGAMMAPDF_MAIN -c gamma.c -o $@
|
|
82
|
+
|
|
83
|
+
gammacdf.o: gamma.h
|
|
84
|
+
gammacdf.o: gamma.c makefile
|
|
85
|
+
$(CC) $(CFLAGS) -DGAMMACDF_MAIN -c gamma.c -o $@
|
|
86
|
+
|
|
87
|
+
gammaqtl.o: gamma.h
|
|
88
|
+
gammaqtl.o: gamma.c makefile
|
|
89
|
+
$(CC) $(CFLAGS) -DGAMMAQTL_MAIN -c gamma.c -o $@
|
|
90
|
+
|
|
91
|
+
normpdf.o: normal.h
|
|
92
|
+
normpdf.o: normal.c makefile
|
|
93
|
+
$(CC) $(CFLAGS) -DNORMPDF_MAIN -c normal.c -o $@
|
|
94
|
+
|
|
95
|
+
normcdf.o: normal.h
|
|
96
|
+
normcdf.o: normal.c makefile
|
|
97
|
+
$(CC) $(CFLAGS) -DNORMCDF_MAIN -c normal.c -o $@
|
|
98
|
+
|
|
99
|
+
normqtl.o: normal.h
|
|
100
|
+
normqtl.o: normal.c makefile
|
|
101
|
+
$(CC) $(CFLAGS) -DNORMQTL_MAIN -c normal.c -o $@
|
|
102
|
+
|
|
103
|
+
chi2pdf.o: chi2.h
|
|
104
|
+
chi2pdf.o: chi2.c makefile
|
|
105
|
+
$(CC) $(CFLAGS) -DCHI2PDF_MAIN -c chi2.c -o $@
|
|
106
|
+
|
|
107
|
+
chi2cdf.o: chi2.h
|
|
108
|
+
chi2cdf.o: chi2.c makefile
|
|
109
|
+
$(CC) $(CFLAGS) -DCHI2CDF_MAIN -c chi2.c -o $@
|
|
110
|
+
|
|
111
|
+
chi2qtl.o: chi2.h
|
|
112
|
+
chi2qtl.o: chi2.c makefile
|
|
113
|
+
$(CC) $(CFLAGS) -DCHI2QTL_MAIN -c chi2.c -o $@
|
|
114
|
+
|
|
115
|
+
#-----------------------------------------------------------------------
|
|
116
|
+
# Mathematical Functions
|
|
117
|
+
#-----------------------------------------------------------------------
|
|
118
|
+
choose.o: choose.h
|
|
119
|
+
choose.o: choose.c makefile
|
|
120
|
+
$(CC) $(CFLAGS) -c choose.c -o $@
|
|
121
|
+
|
|
122
|
+
zeta.o: zeta.h
|
|
123
|
+
zeta.o: zeta.c makefile
|
|
124
|
+
$(CC) $(CFLAGS) -c zeta.c -o $@
|
|
125
|
+
|
|
126
|
+
intexp.o: intexp.h
|
|
127
|
+
intexp.o: intexp.c makefile
|
|
128
|
+
$(CC) $(CFLAGS) -c intexp.c -o $@
|
|
129
|
+
|
|
130
|
+
gamma.o: gamma.h
|
|
131
|
+
gamma.o: gamma.c makefile
|
|
132
|
+
$(CC) $(CFLAGS) -c gamma.c -o $@
|
|
133
|
+
|
|
134
|
+
gammall.o: gamma.h
|
|
135
|
+
gammall.o: gamma.c makefile
|
|
136
|
+
$(CC) $(CFLAGS) -DGAMMAQTL -c gamma.c -o $@
|
|
137
|
+
|
|
138
|
+
normal.o: normal.h
|
|
139
|
+
normal.o: normal.c makefile
|
|
140
|
+
$(CC) $(CFLAGS) -c normal.c -o $@
|
|
141
|
+
|
|
142
|
+
chi2.o: chi2.h
|
|
143
|
+
chi2.o: chi2.c makefile
|
|
144
|
+
$(CC) $(CFLAGS) -c chi2.c -o $@
|
|
145
|
+
|
|
146
|
+
chi2all.o: chi2.h gamma.h normal.h
|
|
147
|
+
chi2all.o: chi2.c makefile
|
|
148
|
+
$(CC) $(CFLAGS) -DCHI2QTL -c chi2.c -o $@
|
|
149
|
+
|
|
150
|
+
radfn.o: radfn.h gamma.h
|
|
151
|
+
radfn.o: radfn.c makefile
|
|
152
|
+
$(CC) $(CFLAGS) -c radfn.c -o $@
|
|
153
|
+
|
|
154
|
+
#-----------------------------------------------------------------------
|
|
155
|
+
# Install
|
|
156
|
+
#-----------------------------------------------------------------------
|
|
157
|
+
install:
|
|
158
|
+
cp $(PROGS) $(HOME)/bin
|
|
159
|
+
|
|
160
|
+
#-----------------------------------------------------------------------
|
|
161
|
+
# Clean up
|
|
162
|
+
#-----------------------------------------------------------------------
|
|
163
|
+
clean:
|
|
164
|
+
rm -f $(PROGS) *.o *~ *.flc core
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#-----------------------------------------------------------------------
|
|
2
|
+
# File : math.mak
|
|
3
|
+
# Contents: build math utility modules
|
|
4
|
+
# Author : Christian Borgelt
|
|
5
|
+
# History : 26.01.2003 file created
|
|
6
|
+
# 19.05.2003 intexp, choose, zeta, quantile, and normd added
|
|
7
|
+
# 15.08.2003 module radfn added
|
|
8
|
+
#-----------------------------------------------------------------------
|
|
9
|
+
CC = cl.exe
|
|
10
|
+
LD = link.exe
|
|
11
|
+
DEFS = /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS"
|
|
12
|
+
CFLAGS = /nologo /W3 /EHsc /O2 $(DEFS) /FD /c /D _CRT_SECURE_NO_DEPRECATE
|
|
13
|
+
|
|
14
|
+
#-----------------------------------------------------------------------
|
|
15
|
+
# Build Modules
|
|
16
|
+
#-----------------------------------------------------------------------
|
|
17
|
+
all: intexp.obj choose.obj gamma.obj zeta.obj quantile.obj \
|
|
18
|
+
normd.obj radfn.obj
|
|
19
|
+
|
|
20
|
+
#-----------------------------------------------------------------------
|
|
21
|
+
# Gamma Function
|
|
22
|
+
#-----------------------------------------------------------------------
|
|
23
|
+
intexp.obj: intexp.h intexp.c math.mak
|
|
24
|
+
$(CC) $(CFLAGS) intexp.c /Fo$@
|
|
25
|
+
|
|
26
|
+
choose.obj: choose.h choose.c math.mak
|
|
27
|
+
$(CC) $(CFLAGS) choose.c /Fo$@
|
|
28
|
+
|
|
29
|
+
gamma.obj: gamma.h gamma.c math.mak
|
|
30
|
+
$(CC) $(CFLAGS) gamma.c /Fo$@
|
|
31
|
+
|
|
32
|
+
zeta.obj: zeta.h zeta.c math.mak
|
|
33
|
+
$(CC) $(CFLAGS) zeta.c /Fo$@
|
|
34
|
+
|
|
35
|
+
quantile.obj: quantile.h quantile.c math.mak
|
|
36
|
+
$(CC) $(CFLAGS) quantile.c /Fo$@
|
|
37
|
+
|
|
38
|
+
normd.obj: normd.h normd.c math.mak
|
|
39
|
+
$(CC) $(CFLAGS) normd.c /Fo$@
|
|
40
|
+
|
|
41
|
+
radfn.obj: radfn.h radfn.c math.mak
|
|
42
|
+
$(CC) $(CFLAGS) radfn.c /Fo$@
|
|
43
|
+
|
|
44
|
+
#-----------------------------------------------------------------------
|
|
45
|
+
# Clean up
|
|
46
|
+
#-----------------------------------------------------------------------
|
|
47
|
+
clean:
|
|
48
|
+
-@erase /Q *~ *.obj *.idb *.pch
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
/*----------------------------------------------------------------------
|
|
2
|
+
File : normal.c
|
|
3
|
+
Contents: normal distribution functions
|
|
4
|
+
Author : Christian Borgelt
|
|
5
|
+
History : 2002.11.04 file created
|
|
6
|
+
2008.03.14 quantile function, main function added
|
|
7
|
+
2008.03.15 cumulative distribution function added
|
|
8
|
+
----------------------------------------------------------------------*/
|
|
9
|
+
#if defined(NORMPDF_MAIN) \
|
|
10
|
+
|| defined(NORMCDF_MAIN) \
|
|
11
|
+
|| defined(NORMQTL_MAIN)
|
|
12
|
+
#include <stdio.h>
|
|
13
|
+
#include <stdlib.h>
|
|
14
|
+
#endif
|
|
15
|
+
#include <float.h>
|
|
16
|
+
#include <assert.h>
|
|
17
|
+
#include <math.h>
|
|
18
|
+
#include "normal.h"
|
|
19
|
+
|
|
20
|
+
/*----------------------------------------------------------------------
|
|
21
|
+
Preprocessor Definitions
|
|
22
|
+
----------------------------------------------------------------------*/
|
|
23
|
+
#define SQRT_2 1.41421356237309504880168872421 /* \sqrt(2) */
|
|
24
|
+
#define _1_SQRT_2PI 0.39894228040143267793994605993 /* 1/\sqrt(2\pi) */
|
|
25
|
+
|
|
26
|
+
/*----------------------------------------------------------------------
|
|
27
|
+
Functions
|
|
28
|
+
----------------------------------------------------------------------*/
|
|
29
|
+
|
|
30
|
+
double unitpdf (double x)
|
|
31
|
+
{ /* --- probability density function */
|
|
32
|
+
return exp(-0.5*x*x) *_1_SQRT_2PI;
|
|
33
|
+
} /* unitpdf() */
|
|
34
|
+
|
|
35
|
+
/*--------------------------------------------------------------------*/
|
|
36
|
+
|
|
37
|
+
double unitcdfP (double x)
|
|
38
|
+
{ /* --- cumulative distribution fn. */
|
|
39
|
+
double y, z, u; /* square, absolute value of x */
|
|
40
|
+
|
|
41
|
+
if (x > 8.572) return 1.0; /* if outside proper interval, */
|
|
42
|
+
if (x < -37.519) return 0.0; /* return the limiting values */
|
|
43
|
+
z = fabs(x); /* exploit the symmetry */
|
|
44
|
+
if (z < 0.5*2.2204460492503131e-16)
|
|
45
|
+
return 0.5; /* treat 0 as a special case */
|
|
46
|
+
if (z < 0.66291) { /* if fairly close to zero */
|
|
47
|
+
y = x*x; /* compute the square of x */
|
|
48
|
+
z = (((( 0.065682337918207449113
|
|
49
|
+
*y + 2.2352520354606839287)
|
|
50
|
+
*y + 161.02823106855587881)
|
|
51
|
+
*y + 1067.6894854603709582)
|
|
52
|
+
*y + 18154.981253343561249)
|
|
53
|
+
/ ((((
|
|
54
|
+
y + 47.20258190468824187)
|
|
55
|
+
*y + 976.09855173777669322)
|
|
56
|
+
*y + 10260.932208618978205)
|
|
57
|
+
*y + 45507.789335026729956);
|
|
58
|
+
return 0.5 +x *z; /* compute with rational function */
|
|
59
|
+
}
|
|
60
|
+
if (z < 4*SQRT_2) { /* if medium value */
|
|
61
|
+
u = (((((((( 1.0765576773720192317e-8
|
|
62
|
+
*z + 0.39894151208813466764)
|
|
63
|
+
*z + 8.8831497943883759412)
|
|
64
|
+
*z + 93.506656132177855979)
|
|
65
|
+
*z + 597.27027639480026226)
|
|
66
|
+
*z + 2494.5375852903726711)
|
|
67
|
+
*z + 6848.1904505362823326)
|
|
68
|
+
*z + 11602.651437647350124)
|
|
69
|
+
*z + 9842.7148383839780218)
|
|
70
|
+
/ ((((((((
|
|
71
|
+
z + 22.266688044328115691)
|
|
72
|
+
*z + 235.38790178262499861)
|
|
73
|
+
*z + 1519.377599407554805)
|
|
74
|
+
*z + 6485.558298266760755)
|
|
75
|
+
*z + 18615.571640885098091)
|
|
76
|
+
*z + 34900.952721145977266)
|
|
77
|
+
*z + 38912.003286093271411)
|
|
78
|
+
*z + 19685.429676859990727);
|
|
79
|
+
z = u *exp(-0.5*x*x); } /* compute with rational function */
|
|
80
|
+
else { /* if tail value */
|
|
81
|
+
y = 1 /(x*x); /* compute the inverse square of x */
|
|
82
|
+
u = ((((( 0.02307344176494017303
|
|
83
|
+
*y + 0.21589853405795699)
|
|
84
|
+
*y + 0.1274011611602473639)
|
|
85
|
+
*y + 0.022235277870649807)
|
|
86
|
+
*y + 0.001421619193227893466)
|
|
87
|
+
*y + 2.9112874951168792e-5)
|
|
88
|
+
/ (((((
|
|
89
|
+
y + 1.28426009614491121)
|
|
90
|
+
*y + 0.468238212480865118)
|
|
91
|
+
*y + 0.0659881378689285515)
|
|
92
|
+
*y + 0.00378239633202758244)
|
|
93
|
+
*y + 7.29751555083966205e-5);
|
|
94
|
+
z = (((_1_SQRT_2PI) -y*u) /z) *exp(-0.5*x*x);
|
|
95
|
+
} /* compute with rational function */
|
|
96
|
+
return (x > 0) ? 1-z : z; /* exploit the symmetry */
|
|
97
|
+
} /* unitcdfP() */
|
|
98
|
+
|
|
99
|
+
/*----------------------------------------------------------------------
|
|
100
|
+
References: - W.J. Cody.
|
|
101
|
+
Rational Chebyshev Approximations for the Error Function.
|
|
102
|
+
Mathematics of Computation, 23(107):631-637, 1969
|
|
103
|
+
- W. Fraser and J.F Hart.
|
|
104
|
+
On the Computation of Rational Approximations
|
|
105
|
+
to Continuous Functions.
|
|
106
|
+
Communications of the ACM 5, 1962
|
|
107
|
+
- W.J. Kennedy Jr. and J.E. Gentle.
|
|
108
|
+
Statistical Computing.
|
|
109
|
+
Marcel Dekker, 1980
|
|
110
|
+
----------------------------------------------------------------------*/
|
|
111
|
+
#if 0
|
|
112
|
+
|
|
113
|
+
double unitqtlP (double prob)
|
|
114
|
+
{ /* --- quantile of normal distrib. */
|
|
115
|
+
double p, x; /* with mean 0 and variance 1 */
|
|
116
|
+
|
|
117
|
+
assert((prob >= 0) && (prob <= 1)); /* check the function argument */
|
|
118
|
+
if (prob >= 1.0) return DBL_MAX; /* check for limiting values */
|
|
119
|
+
if (prob <= 0.0) return -DBL_MAX; /* and return extrema */
|
|
120
|
+
if (prob == 0.5) return 0; /* treat prob = 0.5 as a special case */
|
|
121
|
+
p = (prob > 0.5) ? 1-prob : prob; /* transform to left tail if nec. */
|
|
122
|
+
if (p < 1e-20) return (prob < 0.5) ? -10 : 10;
|
|
123
|
+
x = sqrt(log(1/(p*p))); /* compute quotient of polynomials */
|
|
124
|
+
x += ((((-0.453642210148e-4 /* (rational function approximation) */
|
|
125
|
+
*x -0.0204231210245)
|
|
126
|
+
*x -0.342242088547)
|
|
127
|
+
*x -1.0)
|
|
128
|
+
*x -0.322232431088)
|
|
129
|
+
/ (((( 0.0038560700634
|
|
130
|
+
*x +0.103537752850)
|
|
131
|
+
*x +0.531103462366)
|
|
132
|
+
*x +0.588581570495)
|
|
133
|
+
*x +0.0993484626060);
|
|
134
|
+
return (prob < 0.5) ? -x : x; /* retransform to right tail if nec. */
|
|
135
|
+
} /* unitqtlP() */
|
|
136
|
+
|
|
137
|
+
#else /*--------------------------------------------------------------*/
|
|
138
|
+
|
|
139
|
+
double unitqtlP (double prob)
|
|
140
|
+
{ /* --- quantile of normal distrib. */
|
|
141
|
+
double p, x; /* with mean 0 and variance 1 */
|
|
142
|
+
|
|
143
|
+
assert((prob >= 0) && (prob <= 1)); /* check the function argument */
|
|
144
|
+
if (prob >= 1.0) return DBL_MAX; /* check for limiting values */
|
|
145
|
+
if (prob <= 0.0) return -DBL_MAX; /* and return extrema */
|
|
146
|
+
p = prob -0.5;
|
|
147
|
+
if (fabs(p) <= 0.425) { /* if not tail */
|
|
148
|
+
x = 0.180625 - p*p; /* get argument of rational function */
|
|
149
|
+
x = (((((((2509.0809287301226727
|
|
150
|
+
*x + 33430.575583588128105)
|
|
151
|
+
*x + 67265.770927008700853)
|
|
152
|
+
*x + 45921.953931549871457)
|
|
153
|
+
*x + 13731.693765509461125)
|
|
154
|
+
*x + 1971.5909503065514427)
|
|
155
|
+
*x + 133.14166789178437745)
|
|
156
|
+
*x + 3.387132872796366608)
|
|
157
|
+
/ (((((((5226.495278852854561
|
|
158
|
+
*x + 28729.085735721942674)
|
|
159
|
+
*x + 39307.89580009271061)
|
|
160
|
+
*x + 21213.794301586595867)
|
|
161
|
+
*x + 5394.1960214247511077)
|
|
162
|
+
*x + 687.1870074920579083)
|
|
163
|
+
*x + 42.313330701600911252)
|
|
164
|
+
*x + 1.0); /* evaluate the rational function */
|
|
165
|
+
return p *x; /* and return the computed value */
|
|
166
|
+
}
|
|
167
|
+
p = (prob > 0.5) ? 1-prob : prob;
|
|
168
|
+
x = sqrt(-log(p)); /* transform to left tail if nec. */
|
|
169
|
+
if (x <= 5) { /* if not extreme tail */
|
|
170
|
+
x -= 1.6; /* get argument of rational function */
|
|
171
|
+
x = ((((((( 7.7454501427834140764e-4
|
|
172
|
+
*x + 0.0227238449892691845833)
|
|
173
|
+
*x + 0.24178072517745061177)
|
|
174
|
+
*x + 1.27045825245236838258)
|
|
175
|
+
*x + 3.64784832476320460504)
|
|
176
|
+
*x + 5.7694972214606914055)
|
|
177
|
+
*x + 4.6303378461565452959)
|
|
178
|
+
*x + 1.42343711074968357734)
|
|
179
|
+
/ ((((((( 1.05075007164441684324e-9
|
|
180
|
+
*x + 5.475938084995344946e-4)
|
|
181
|
+
*x + 0.0151986665636164571966)
|
|
182
|
+
*x + 0.14810397642748007459)
|
|
183
|
+
*x + 0.68976733498510000455)
|
|
184
|
+
*x + 1.6763848301838038494)
|
|
185
|
+
*x + 2.05319162663775882187)
|
|
186
|
+
*x + 1.0); } /* evaluate the rational function */
|
|
187
|
+
else { /* if extreme tail */
|
|
188
|
+
x -= 5; /* get argument of rational function */
|
|
189
|
+
x = ((((((( 2.01033439929228813265e-7
|
|
190
|
+
*x + 2.71155556874348757815e-5)
|
|
191
|
+
*x + 0.0012426609473880784386)
|
|
192
|
+
*x + 0.026532189526576123093)
|
|
193
|
+
*x + 0.29656057182850489123)
|
|
194
|
+
*x + 1.7848265399172913358)
|
|
195
|
+
*x + 5.4637849111641143699)
|
|
196
|
+
*x + 6.6579046435011037772)
|
|
197
|
+
/ ((((((( 2.04426310338993978564e-15
|
|
198
|
+
*x + 1.4215117583164458887e-7)
|
|
199
|
+
*x + 1.8463183175100546818e-5)
|
|
200
|
+
*x + 7.868691311456132591e-4)
|
|
201
|
+
*x + 0.0148753612908506148525)
|
|
202
|
+
*x + 0.13692988092273580531)
|
|
203
|
+
*x + 0.59983220655588793769)
|
|
204
|
+
*x + 1.0); /* evaluate the rational function */
|
|
205
|
+
}
|
|
206
|
+
return (prob < 0.5) ? -x : x; /* retransform to right tail if nec. */
|
|
207
|
+
} /* unitqtlP() */
|
|
208
|
+
|
|
209
|
+
#endif
|
|
210
|
+
/*----------------------------------------------------------------------
|
|
211
|
+
References: - R.E. Odeh and J.O. Evans.
|
|
212
|
+
The percentage points of the normal distribution.
|
|
213
|
+
Applied Statistics 22:96--97, 1974
|
|
214
|
+
- J.D. Beasley and S.G. Springer.
|
|
215
|
+
Algorithm AS 111:
|
|
216
|
+
The percentage points of the normal distribution.
|
|
217
|
+
Applied Statistics 26:118--121, 1977
|
|
218
|
+
- M.J. Wichura
|
|
219
|
+
Algorithm AS 241:
|
|
220
|
+
The percentage points of the normal distribution.
|
|
221
|
+
Applied Statistics 37:477--484, 1988
|
|
222
|
+
----------------------------------------------------------------------*/
|
|
223
|
+
|
|
224
|
+
double unitrand (double randfn(void))
|
|
225
|
+
{ /* --- compute N(0,1) distrib. number */
|
|
226
|
+
static double b; /* buffer for random number */
|
|
227
|
+
double x, y, r; /* coordinates and radius */
|
|
228
|
+
|
|
229
|
+
if (b != 0.0) { /* if the buffer is full, */
|
|
230
|
+
x = b; b = 0; return x; } /* return the buffered number */
|
|
231
|
+
do { /* pick a random point */
|
|
232
|
+
x = 2.0*randfn()-1.0; /* in the unit square [-1,1]^2 */
|
|
233
|
+
y = 2.0*randfn()-1.0; /* and check whether it lies */
|
|
234
|
+
r = x*x +y*y; /* inside the unit circle */
|
|
235
|
+
} while ((r > 1) || (r == 0));
|
|
236
|
+
r = sqrt(-2*log(r)/r); /* factor for Box-Muller transform */
|
|
237
|
+
b = x *r; /* save one of the random numbers */
|
|
238
|
+
return y *r; /* and return the other */
|
|
239
|
+
} /* unitrand() */
|
|
240
|
+
|
|
241
|
+
/*----------------------------------------------------------------------
|
|
242
|
+
Source for the polar method to generate normally distributed numbers:
|
|
243
|
+
D.E. Knuth.
|
|
244
|
+
The Art of Computer Programming, Vol. 2: Seminumerical Algorithms
|
|
245
|
+
Addison-Wesley, Reading, MA, USA 1998
|
|
246
|
+
pp. 122-123
|
|
247
|
+
----------------------------------------------------------------------*/
|
|
248
|
+
|
|
249
|
+
double normpdf (double x, double mean, double var)
|
|
250
|
+
{ /* --- probability density function */
|
|
251
|
+
assert(var >= 0); /* check the function arguments */
|
|
252
|
+
if (var == 1) return unitpdf(x-mean);
|
|
253
|
+
return unitpdf((x-mean) /sqrt(var));
|
|
254
|
+
} /* normpdf() */
|
|
255
|
+
|
|
256
|
+
/*--------------------------------------------------------------------*/
|
|
257
|
+
|
|
258
|
+
double normcdfP (double x, double mean, double var)
|
|
259
|
+
{ /* --- cumulative distribution fn. */
|
|
260
|
+
assert(var >= 0); /* check the function arguments */
|
|
261
|
+
if (var == 1) return unitcdf(x-mean);
|
|
262
|
+
return unitcdf((x-mean) /sqrt(var));
|
|
263
|
+
} /* normcdfP() */
|
|
264
|
+
|
|
265
|
+
/*--------------------------------------------------------------------*/
|
|
266
|
+
|
|
267
|
+
double normcdfQ (double x, double mean, double var)
|
|
268
|
+
{ /* --- cumulative distribution fn. */
|
|
269
|
+
assert(var >= 0); /* check the function arguments */
|
|
270
|
+
if (var == 1) return unitcdfP(mean-x);
|
|
271
|
+
return unitcdfP((mean-x) /sqrt(var));
|
|
272
|
+
} /* normcdfQ() */
|
|
273
|
+
|
|
274
|
+
/*--------------------------------------------------------------------*/
|
|
275
|
+
|
|
276
|
+
double normqtlP (double prob, double mean, double var)
|
|
277
|
+
{ /* --- quantile of normal distrib. */
|
|
278
|
+
assert((var > 0) /* check the function arguments */
|
|
279
|
+
&& (prob >= 0) && (prob <= 1));
|
|
280
|
+
if (var == 1) return mean +unitqtl(prob);
|
|
281
|
+
return mean +unitqtlP(prob) *sqrt(var);
|
|
282
|
+
} /* normqtlP() */
|
|
283
|
+
|
|
284
|
+
/*--------------------------------------------------------------------*/
|
|
285
|
+
|
|
286
|
+
double normqtlQ (double prob, double mean, double var)
|
|
287
|
+
{ /* --- quantile of normal distrib. */
|
|
288
|
+
assert((var > 0) /* check the function arguments */
|
|
289
|
+
&& (prob >= 0) && (prob <= 1));
|
|
290
|
+
if (var == 1) return mean -unitqtlP(prob);
|
|
291
|
+
return mean -unitqtlP(prob) *sqrt(var);
|
|
292
|
+
} /* normqtlQ() */
|
|
293
|
+
|
|
294
|
+
/*--------------------------------------------------------------------*/
|
|
295
|
+
|
|
296
|
+
double normrand (double randfn(void), double mean, double var)
|
|
297
|
+
{ /* --- cumulative distribution fn. */
|
|
298
|
+
assert(var >= 0); /* check the function arguments */
|
|
299
|
+
if (var == 1) return mean +unitrand(randfn);
|
|
300
|
+
return mean +unitrand(randfn) *sqrt(var);
|
|
301
|
+
} /* normrand() */
|
|
302
|
+
|
|
303
|
+
/*----------------------------------------------------------------------
|
|
304
|
+
Main Functions
|
|
305
|
+
----------------------------------------------------------------------*/
|
|
306
|
+
#ifdef NORMPDF_MAIN
|
|
307
|
+
|
|
308
|
+
int main (int argc, char *argv[])
|
|
309
|
+
{ /* --- main function */
|
|
310
|
+
double mean = 0; /* mean value */
|
|
311
|
+
double var = 1; /* variance */
|
|
312
|
+
double x; /* argument value */
|
|
313
|
+
|
|
314
|
+
if ((argc < 2) || (argc > 4)){/* if wrong number of arguments */
|
|
315
|
+
printf("usage: %s arg [mean variance]\n", argv[0]);
|
|
316
|
+
printf("compute probability density function "
|
|
317
|
+
"of the normal distribution\n");
|
|
318
|
+
return 0; /* print a usage message */
|
|
319
|
+
} /* and abort the program */
|
|
320
|
+
x = atof(argv[1]); /* get the argument value */
|
|
321
|
+
if (argc > 2) mean = atof(argv[2]);
|
|
322
|
+
if (argc > 3) var = atof(argv[3]);
|
|
323
|
+
if (var < 0) { /* get the parameters */
|
|
324
|
+
printf("%s: invalid variance\n", argv[0]); return -1; }
|
|
325
|
+
printf("normal: f(%.16g; %.16g, %.16g) = %.16g\n",
|
|
326
|
+
x, mean, var, normpdf(x, mean, var));
|
|
327
|
+
return 0; /* compute and print density */
|
|
328
|
+
} /* main() */
|
|
329
|
+
|
|
330
|
+
#endif
|
|
331
|
+
/*--------------------------------------------------------------------*/
|
|
332
|
+
#ifdef NORMCDF_MAIN
|
|
333
|
+
|
|
334
|
+
int main (int argc, char *argv[])
|
|
335
|
+
{ /* --- main function */
|
|
336
|
+
double mean = 0; /* mean value */
|
|
337
|
+
double var = 1; /* variance */
|
|
338
|
+
double x; /* argument value */
|
|
339
|
+
|
|
340
|
+
if ((argc < 2) || (argc > 4)){/* if wrong number of arguments */
|
|
341
|
+
printf("usage: %s arg [mean variance]\n", argv[0]);
|
|
342
|
+
printf("compute cumulative distribution function "
|
|
343
|
+
"of the normal distribution\n");
|
|
344
|
+
return 0; /* print a usage message */
|
|
345
|
+
} /* and abort the program */
|
|
346
|
+
x = atof(argv[1]); /* get the argument value */
|
|
347
|
+
if (argc > 2) mean = atof(argv[2]);
|
|
348
|
+
if (argc > 3) var = atof(argv[3]);
|
|
349
|
+
if (var < 0) { /* get the parameters */
|
|
350
|
+
printf("%s: invalid variance\n", argv[0]); return -1; }
|
|
351
|
+
printf("normal: F(% .16g; %.16g, %.16g) = %.16g\n",
|
|
352
|
+
x, mean, var, normcdfP(x, mean, var));
|
|
353
|
+
printf(" 1 - F(% .16g; %.16g, %.16g) = %.16g\n",
|
|
354
|
+
x, mean, var, normcdfQ(x, mean, var));
|
|
355
|
+
return 0; /* compute and print probability */
|
|
356
|
+
} /* main() */
|
|
357
|
+
|
|
358
|
+
#endif
|
|
359
|
+
/*--------------------------------------------------------------------*/
|
|
360
|
+
#ifdef NORMQTL_MAIN
|
|
361
|
+
|
|
362
|
+
int main (int argc, char *argv[])
|
|
363
|
+
{ /* --- main function */
|
|
364
|
+
double mean = 0; /* mean value */
|
|
365
|
+
double var = 1; /* variance */
|
|
366
|
+
double prob; /* probability */
|
|
367
|
+
|
|
368
|
+
if ((argc < 2) || (argc > 4)){/* if wrong number of arguments */
|
|
369
|
+
printf("usage: %s prob [mean variance]\n", argv[0]);
|
|
370
|
+
printf("compute quantile of the normal distribution\n");
|
|
371
|
+
return 0; /* print a usage message */
|
|
372
|
+
} /* and abort the program */
|
|
373
|
+
prob = atof(argv[1]); /* get the probability */
|
|
374
|
+
if ((prob < 0) || (prob > 1)) {
|
|
375
|
+
printf("%s: invalid probability\n", argv[0]); return -1; }
|
|
376
|
+
if (argc > 2) mean = atof(argv[2]);
|
|
377
|
+
if (argc > 3) var = atof(argv[3]);
|
|
378
|
+
if (var < 0) { /* get the parameters */
|
|
379
|
+
printf("%s: invalid variance\n", argv[0]); return -1; }
|
|
380
|
+
printf("normal: F(% .16g; %.16g, %.16g) = %.16g\n",
|
|
381
|
+
normqtlP(prob, mean, var), mean, var, prob);
|
|
382
|
+
printf(" 1 - F(% .16g; %.16g, %.16g) = %.16g\n",
|
|
383
|
+
normqtlQ(prob, mean, var), mean, var, prob);
|
|
384
|
+
return 0; /* compute and print quantile */
|
|
385
|
+
} /* main() */
|
|
386
|
+
|
|
387
|
+
#endif
|