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 | } |