Statistics
| Branch: | Revision:

root / test / pagerank_test.cpp @ 21:c131219e7a08

History | View | Annotate | Download (3.6 kB)

1 10:71c85ef1419b louridas
#include <string>
2 10:71c85ef1419b louridas
#include <iostream>
3 10:71c85ef1419b louridas
#include <fstream>
4 10:71c85ef1419b louridas
#include <vector>
5 10:71c85ef1419b louridas
#include <cmath>
6 11:694b17feb881 louridas
#include <cstdlib>
7 21:c131219e7a08 louridas
#include <cstring>
8 10:71c85ef1419b louridas
9 10:71c85ef1419b louridas
#include <errno.h>
10 10:71c85ef1419b louridas
#include <dirent.h>
11 10:71c85ef1419b louridas
12 10:71c85ef1419b louridas
#include "table.h"
13 10:71c85ef1419b louridas
14 10:71c85ef1419b louridas
using namespace std;
15 10:71c85ef1419b louridas
16 18:d97c66c4b2bc louridas
const double EPSILON = 0.0001;
17 15:dcac20cfefaf louridas
18 10:71c85ef1419b louridas
void error(const char *p,const char *p2) {
19 10:71c85ef1419b louridas
    cerr << p <<  ' ' << p2 <<  '\n';
20 10:71c85ef1419b louridas
    exit(1);
21 10:71c85ef1419b louridas
}
22 10:71c85ef1419b louridas
23 21:c131219e7a08 louridas
void error(const string p,const string p2) {
24 10:71c85ef1419b louridas
    cerr << p <<  ' ' << p2 <<  '\n';
25 10:71c85ef1419b louridas
    exit(1);
26 10:71c85ef1419b louridas
}
27 10:71c85ef1419b louridas
28 10:71c85ef1419b louridas
int main(int argc, char *argv[]) {
29 10:71c85ef1419b louridas
30 10:71c85ef1419b louridas
    Table t;
31 21:c131219e7a08 louridas
    bool numeric = false;
32 10:71c85ef1419b louridas
33 21:c131219e7a08 louridas
    if (argc != 2 && argc != 3) {
34 21:c131219e7a08 louridas
        cerr << "Usage: pagerank_test [-n] <test_suite>" << endl;
35 10:71c85ef1419b louridas
        exit(1);
36 10:71c85ef1419b louridas
    }
37 10:71c85ef1419b louridas
38 21:c131219e7a08 louridas
    if (argc == 3) {
39 21:c131219e7a08 louridas
        if (!strcmp(argv[1], "-n")) {
40 21:c131219e7a08 louridas
            numeric = true;
41 21:c131219e7a08 louridas
        } else {
42 21:c131219e7a08 louridas
            cerr << "Usage: pagerank_test [-n] <test_suite>" << endl;
43 21:c131219e7a08 louridas
            exit(1);
44 21:c131219e7a08 louridas
        }
45 21:c131219e7a08 louridas
    }
46 21:c131219e7a08 louridas
47 21:c131219e7a08 louridas
    string tests_filename = argv[argc - 1];
48 10:71c85ef1419b louridas
49 10:71c85ef1419b louridas
    ifstream tests_file(tests_filename.c_str());
50 10:71c85ef1419b louridas
51 10:71c85ef1419b louridas
    if (!tests_file.is_open()) {
52 10:71c85ef1419b louridas
        error("Cannot open file", tests_filename);
53 10:71c85ef1419b louridas
    }
54 10:71c85ef1419b louridas
55 10:71c85ef1419b louridas
    while (!tests_file.eof()) {
56 10:71c85ef1419b louridas
        string test_line;
57 10:71c85ef1419b louridas
        getline(tests_file, test_line);
58 10:71c85ef1419b louridas
        if (test_line.empty()) {
59 10:71c85ef1419b louridas
            continue;
60 10:71c85ef1419b louridas
        }
61 18:d97c66c4b2bc louridas
        cout << "testing " << test_line << "... ";
62 10:71c85ef1419b louridas
        /* Get graph file and pagerank file names */
63 10:71c85ef1419b louridas
        string graph_filename = test_line + ".txt";
64 10:71c85ef1419b louridas
        string pagerank_filename = test_line + "-pr.txt";
65 10:71c85ef1419b louridas
        /* Open pagerank file */
66 10:71c85ef1419b louridas
        ifstream pagerank_file(pagerank_filename.c_str());
67 10:71c85ef1419b louridas
        if (!pagerank_file.is_open()) {
68 10:71c85ef1419b louridas
            cerr << endl;
69 10:71c85ef1419b louridas
            error("Cannot open pagerank file", pagerank_filename);
70 10:71c85ef1419b louridas
        }
71 10:71c85ef1419b louridas
72 10:71c85ef1419b louridas
        /* Read graph file */
73 21:c131219e7a08 louridas
        t.set_numeric(numeric);
74 10:71c85ef1419b louridas
        t.set_delim(" ");
75 14:a00868c06f27 louridas
        t.set_trace(false);
76 10:71c85ef1419b louridas
        t.read_file(graph_filename);
77 10:71c85ef1419b louridas
        /* Calculate pagerank */
78 10:71c85ef1419b louridas
        t.pagerank();
79 14:a00868c06f27 louridas
80 10:71c85ef1419b louridas
        /* Read pagerank test results file */
81 10:71c85ef1419b louridas
        vector<double> pagerank_test_values;
82 10:71c85ef1419b louridas
        while (!pagerank_file.eof()) {
83 10:71c85ef1419b louridas
            string pagerank_line;
84 10:71c85ef1419b louridas
            getline(pagerank_file, pagerank_line);
85 19:4b59d7be3e59 louridas
            if (pagerank_line.find("s = ") != string::npos) {
86 10:71c85ef1419b louridas
                break;
87 10:71c85ef1419b louridas
            }
88 10:71c85ef1419b louridas
            string::size_type sep = pagerank_line.find(" = ");
89 19:4b59d7be3e59 louridas
            if (sep == string::npos) {
90 19:4b59d7be3e59 louridas
                    break;
91 19:4b59d7be3e59 louridas
            }
92 15:dcac20cfefaf louridas
            string index_str = pagerank_line.substr(0, sep);
93 15:dcac20cfefaf louridas
            size_t index = strtol(index_str.c_str(), NULL, 10);
94 10:71c85ef1419b louridas
            string value_str = pagerank_line.substr(sep + 3);
95 10:71c85ef1419b louridas
            double value;
96 10:71c85ef1419b louridas
            value = strtod(value_str.c_str(), NULL);
97 15:dcac20cfefaf louridas
            if (index >= pagerank_test_values.size()) {
98 15:dcac20cfefaf louridas
                pagerank_test_values.resize(index + 1);
99 15:dcac20cfefaf louridas
            }
100 15:dcac20cfefaf louridas
            pagerank_test_values[index] = value;
101 10:71c85ef1419b louridas
        }
102 10:71c85ef1419b louridas
        pagerank_file.close();
103 10:71c85ef1419b louridas
104 10:71c85ef1419b louridas
        /* Compare test results with calculated results */
105 10:71c85ef1419b louridas
        vector<double> pagerank_results = t.get_pagerank();
106 10:71c85ef1419b louridas
107 10:71c85ef1419b louridas
        bool test_ok = true;
108 10:71c85ef1419b louridas
        for (unsigned int i = 0; i < pagerank_results.size(); i++) {
109 18:d97c66c4b2bc louridas
            double result = pagerank_results[i];
110 18:d97c66c4b2bc louridas
            string name = t.get_node_name(i);
111 18:d97c66c4b2bc louridas
            size_t test_index = strtol(name.c_str(), NULL, 10);
112 18:d97c66c4b2bc louridas
            double test_result = pagerank_test_values[test_index];
113 18:d97c66c4b2bc louridas
            double diff = abs(result - test_result);
114 15:dcac20cfefaf louridas
            if (diff > EPSILON) {
115 18:d97c66c4b2bc louridas
                cout << " error in calculation for " << name << ": "
116 18:d97c66c4b2bc louridas
                     << "result=" << result << " "
117 18:d97c66c4b2bc louridas
                     << "expected=" << test_result << " "
118 18:d97c66c4b2bc louridas
                     << "diff=" << diff << " ";
119 10:71c85ef1419b louridas
                test_ok = false;
120 10:71c85ef1419b louridas
                break;
121 10:71c85ef1419b louridas
            }
122 10:71c85ef1419b louridas
        }
123 10:71c85ef1419b louridas
        if (test_ok) {
124 18:d97c66c4b2bc louridas
            cout << "OK" << endl;
125 10:71c85ef1419b louridas
        } else {
126 18:d97c66c4b2bc louridas
            cout << "Failed" << endl;
127 10:71c85ef1419b louridas
        }
128 10:71c85ef1419b louridas
    }
129 10:71c85ef1419b louridas
130 10:71c85ef1419b louridas
}