root/library/tests/test_util.cpp @ 449

Revision 449, 2.8 kB (checked in by vbarta, 15 years ago)

control iteration with integers, not doubles (overrides memory when it rounds off)

Line 
1#define BDMLIB // not an ideal way to prevent double registration of UI factories...
2#include "test_util.h"
3#include "stat/exp_family.h"
4#include <fstream>
5#include <stdexcept>
6#include <string>
7#include <dirent.h>
8#include <errno.h>
9#include <fcntl.h>
10#include <string.h>
11#include <sys/stat.h>
12#include <sys/types.h>
13#include <unistd.h>
14
15namespace bdm {
16
17using itpp::vec;
18using itpp::mat;
19
20std::string load_test_file(const char *fname)
21{
22    char buffer[8192];
23    memset(buffer, 0, sizeof(buffer));
24    std::ifstream src(fname, std::ios_base::binary);
25    src.read(buffer, sizeof(buffer) - 1);
26    return std::string(buffer);
27}
28
29bool remove_all(const char *path) {
30    DIR *dir;
31    dirent *de;
32
33    bool rv = true;
34    if ((dir = opendir(path)) != 0) {
35        try {
36            std::string top(path);
37            top += "/";
38
39            while ((de = readdir(dir)) != 0) {
40                if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) {
41                    std::string subpath(top);
42                    subpath += de->d_name;
43                    remove_all(subpath.c_str());
44                }
45            }
46        } catch (...) {
47            closedir(dir);
48            throw;
49        }
50
51        closedir(dir);
52
53        if (rmdir(path)) {
54            std::string msg = "can't remove dir ";
55            msg += path;
56            throw std::runtime_error(msg);
57        }
58    } else { 
59        if (errno == ENOTDIR) {
60            if (unlink(path)) {
61                std::string msg = "can't remove file ";
62                msg += path;
63                throw std::runtime_error(msg);
64            }
65        } else {
66            if (errno != ENOENT) {
67                std::string msg = "can't remove ";
68                msg += path;
69                throw std::runtime_error(msg);
70            } else {
71                // it wasn't there in the first place
72                rv = false;
73            }
74        }
75    }
76
77    return rv;
78}
79
80double normcoef(const epdf *ep, const vec &xb, const vec &yb,
81                int xn, int yn) {
82    mat Pdf(xn + 1, yn + 1);
83    vec rgr(2);
84
85    double xstep = (xb(1) - xb(0)) / xn;
86    double ystep = (yb(1) - yb(0)) / yn;
87
88    double x = xb(0);
89    for (int i = 0; i <= xn; x += xstep, i++) {
90        rgr(0) = x;
91        double y = yb(0);
92        for (int j = 0; j <= yn; y += ystep, j++) {
93            rgr(1) = y;
94            Pdf(i, j) = exp(ep->evallog(rgr));
95        }
96    }
97
98    return sumsum(Pdf) * xstep * ystep;
99}
100
101vec num_mean2(const epdf *ep, const vec &xb, const vec &yb,
102              int xn, int yn) {
103    mat Pdf(xn + 1, yn + 1);
104    vec rgr(2);
105
106    double xstep = (xb(1) - xb(0)) / xn;
107    double ystep = (yb(1) - yb(0)) / yn;
108
109    vec Mu(xn + 1);
110    vec Si(yn + 1);
111
112    double x = xb(0);
113    for (int i = 0; i <= xn; x += xstep, i++) {
114        Mu(i) = x;
115        rgr(0) = x;
116        double y = yb(0);
117        for (int j = 0; j <= yn; y += ystep, j++) {
118            Si(j) = y;
119            rgr(1) = y;
120            Pdf(i, j) = exp(ep->evallog(rgr));
121        }
122    }
123
124    vec fm = sum(Pdf, 2);
125    double sfm = sum(fm);
126    vec fs = sum(Pdf, 1);
127    double sfs = sum(fs);
128    double vi0 = Mu * fm / sfm;
129    double vi1 = Si * fs / sfs;
130    return vec_2(vi0, vi1);
131}
132
133}
Note: See TracBrowser for help on using the browser.