generated from puzzlef/pagerank-openmp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
process.js
115 lines (88 loc) · 2.27 KB
/
process.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const fs = require('fs');
const os = require('os');
const path = require('path');
const RGRAPH = /^Loading graph .*\/(.+?)\.mtx \.\.\./m;
const RORDER = /^order: (\d+) size: (\d+) \{\}$/m;
const RRESLT = /^\[(.+?) ms; (.+?) iters\.\] \[(.+?) err\.\] (\w+)(?: \[degree=(\d+); limit=(\d+)\])?/m;
// *-FILE
// ------
function readFile(pth) {
var d = fs.readFileSync(pth, 'utf8');
return d.replace(/\r?\n/g, '\n');
}
function writeFile(pth, d) {
d = d.replace(/\r?\n/g, os.EOL);
fs.writeFileSync(pth, d);
}
// *-CSV
// -----
function writeCsv(pth, rows) {
var cols = Object.keys(rows[0]);
var a = cols.join()+'\n';
for (var r of rows)
a += [...Object.values(r)].map(v => `"${v}"`).join()+'\n';
writeFile(pth, a);
}
// *-LOG
// -----
function readLogLine(ln, data, state) {
if (RGRAPH.test(ln)) {
var [, graph] = RGRAPH.exec(ln);
if (!data.has(graph)) data.set(graph, []);
state = {graph};
}
else if (RORDER.test(ln)) {
var [, order, size] = RORDER.exec(ln);
state.order = parseFloat(order);
state.size = parseFloat(size);
}
else if (RRESLT.test(ln)) {
var [, time, iterations, error, technique, degree, limit] = RRESLT.exec(ln);
data.get(state.graph).push(Object.assign({}, state, {
time: parseFloat(time),
iterations: parseFloat(iterations),
error: parseFloat(error),
technique,
switch_degree: parseFloat(degree||'0'),
switch_limit: parseFloat(limit||'0')
}));
}
return state;
}
function readLog(pth) {
var text = readFile(pth);
var lines = text.split('\n');
var data = new Map();
var state = null;
for (var ln of lines)
state = readLogLine(ln, data, state);
return data;
}
// PROCESS-*
// ---------
function processCsv(data) {
var a = [];
for (var rows of data.values())
a.push(...rows);
return a;
}
// MAIN
// ----
function main(cmd, log, out) {
var data = readLog(log);
if (path.extname(out)==='') cmd += '-dir';
switch (cmd) {
case 'csv':
var rows = processCsv(data);
writeCsv(out, rows);
break;
case 'csv-dir':
for (var [graph, rows] of data)
writeCsv(path.join(out, graph+'.csv'), rows);
break;
default:
console.error(`error: "${cmd}"?`);
break;
}
}
main(...process.argv.slice(2));