-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgraph.validate.js
108 lines (96 loc) · 2.28 KB
/
graph.validate.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
localStreet = [
[1,3],
[3,5],
[5,3],
[1,4]
];
localStreet = [
[1,10],
[3,5],
[5,3],
[5,12],
[5,18],
[7,15],
[8,16],
[9,10],
[9,17],
[10,11],
[11,5],
[12,13],
[13,6],
[14,20],
[15,16],
[15,20],
[16,17],
[16,19],
[17,11],
[18,17],
[18,19],
[19,12],
[20,13],
]
transitStreet = [
[[1,1]],
[[6,14], [14,7], [7,8], [8,9]],
[[3,3]]
];
function getUniqueElementsTransit(transitStreets) {
let uniqueElements = new Set();
for (let street of transitStreets) {
for (let pair of street) {
uniqueElements.add(pair[0]);
uniqueElements.add(pair[1]);
}
}
return uniqueElements;
}
// Prepare
function flattenPairs(pairs) {
let flatList = [];
for (let pair of pairs) {
flatList.push(pair[0]);
flatList.push(pair[1]);
}
return flatList;
}
function countElements(lowStreetFlat) {
let counts = {};
for (let node of lowStreetFlat) {
if (!counts[node]) {
counts[node] = 0;
}
counts[node] += 1;
}
return counts;
}
function validateLowStreetNodes(pairs) {
let res = countElements(flattenPairs(localStreet));
let highStreetNodes = getUniqueElementsTransit(transitStreet);
for (let key of highStreetNodes) {
if (res[key]) {
delete res[key];
}
}
for (let [k,v] of Object.entries(res)) {
if (v < 3) {
console.log(`error with node ${k}: ${v}`);
}
}
for (let [k,v] of Object.entries(res)) {
if (v < 3) {
throw new Error(`error with node ${k}: ${v}`);
}
}
}
let graph = buildGraphfromPairs(localStreet);
console.log(graph);
let labels = new Set([6,14,7,8,9,2,1]);
let result = depthFirstSearch(graph, 3, labels);
console.log(result);
console.log(getUniqueElementsTransit(transitStreet));
console.log(`High street: ${getUniqueElementsTransit(transitStreet).size} nodes, ${transitStreet.length} links`);
console.log(`Low street: ${getUniqueElements(localStreet).size} nodes, ${localStreet.length} links`);
let ratRuns = getRatRuns(graph, transitStreet);
console.log(`Found ${ratRuns.length} rat runs from ${transitStreet}:`);
ratRuns.forEach(r => console.log('- ', r));
console.log();