apriori 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|