Skip to content

Commit 3d401dd

Browse files
committed
add an approximation for set cover analysis
1 parent 94c9f9e commit 3d401dd

File tree

2 files changed

+94
-4
lines changed

2 files changed

+94
-4
lines changed

node/lib/set-cover.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,92 @@ var setCover = function (nets) {
6666
return pages;
6767
};
6868

69+
var setCoverStatic = function (nets) {
70+
var res = [];
71+
var nPages = [];
72+
var js = [];
73+
var nettoUrl = {};
74+
var origNets = nets.slice();
75+
76+
class JSNet {
77+
constructor(net) {
78+
if (net.length == 0) {
79+
this.jss = [];
80+
this.url = "";
81+
return;
82+
}
83+
var mainUrl = net[0].response.url;
84+
this.jss = net
85+
.filter((n) => n.type.indexOf("script") != -1)
86+
.filter((n) => n.initiator.url == mainUrl)
87+
.map((n) => n.url.split("?")[0]);
88+
this.url = net.length > 0 ? net[0].documentURL : "";
89+
this.orignet = net;
90+
}
91+
}
92+
93+
nets = nets.map((n) => new JSNet(n));
94+
var unionstatic = [];
95+
for (var net of nets) {
96+
if (net.jss && net.jss.length == 0) continue;
97+
unionstatic = unionstatic.concat(net.jss);
98+
}
99+
unionstatic = [...new Set(unionstatic)];
100+
101+
var largestUncovered = function (nets, union) {
102+
var largest = nets[0],
103+
largestLen = 0,
104+
largestUrl = "",
105+
largestNet = nets[0];
106+
for (var net of nets) {
107+
var uncovered = net.jss.filter((n) => union.includes(n));
108+
if (uncovered.length > largestLen) {
109+
largest = uncovered;
110+
largestLen = uncovered.length;
111+
largestUrl = net.url;
112+
largestNet = net;
113+
}
114+
}
115+
// program.verbose && console.log(`Picking next: ${largestUrl}`);
116+
return [largest, largestUrl, largestNet];
117+
};
118+
119+
var unioncp = unionstatic.slice();
120+
while (js.length < unioncp.length) {
121+
var [net, u, jsnet] = largestUncovered(nets, unionstatic);
122+
// program.verbose && console.log(`largest uncovered: ${net.length}`);
123+
for (var n of net) {
124+
if (js.indexOf(n) == -1) js.push(n);
125+
}
126+
nPages.push(jsnet);
127+
res.push(u);
128+
unionstatic = unionstatic.filter((n) => !net.includes(n));
129+
// program.verbose &&
130+
// console.log(`js: ${js.length}, union: ${unionstatic.length}`);
131+
// remove net from nets
132+
var netindex = nets.indexOf(jsnet);
133+
netindex != -1 && nets.splice(netindex, 1);
134+
}
135+
136+
// get all JS files from origNet and check against origUnion
137+
var jssetcover = [];
138+
for (var p of nPages) {
139+
var net = p.orignet;
140+
var jss = net
141+
.filter((n) => n.type.indexOf("script") != -1)
142+
.map((n) => n.url.split("?")[0]);
143+
for (var js of jss) {
144+
if (!jssetcover.includes(js)) jssetcover.push(js);
145+
}
146+
}
147+
// var rempages = _pagesleft(origNets, jssetcover);
148+
// console.log(
149+
// `npages: ${nPages.length} jssetcover: ${jssetcover.length} union: ${union.length} rempages: ${rempages}`
150+
// );
151+
return res;
152+
};
153+
69154
module.exports = {
70155
setCover,
156+
setCoverStatic,
71157
};

node/util/setcover-sched.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const SC = require("../lib/set-cover.js");
1414
program
1515
.option("-b, --basedir <dir>", "dir containing network.json files")
1616
.option("-p, --pages <pages>", " file containing list of pages")
17+
.option("-o, --output <output>", "output directory")
1718
.parse(process.argv);
1819

1920
const DYNDOMAINS = [
@@ -67,19 +68,22 @@ var _allPages = function (nets) {
6768
};
6869

6970
var addRemainingPages = function (all, sc) {
70-
var res = sc.slice(0);
71-
res = res.concat(all.filter((p) => !sc.includes(p)));
71+
var res = all.filter((p) => !sc.includes(p));
7272
return res;
7373
};
7474

7575
var schedPages = function () {
7676
var nets = traversePages();
7777
var allpages = _allPages(nets);
78-
var scpages = SC.setCover(nets);
78+
// var scpages = SC.setCover(nets);
79+
var scpages = SC.setCoverStatic(nets);
7980
var res = addRemainingPages(allpages, scpages);
80-
for (var p of res) {
81+
for (var p of scpages) {
8182
console.log(p);
8283
}
84+
for (var p of res) {
85+
console.error(p);
86+
}
8387
};
8488

8589
schedPages();

0 commit comments

Comments
 (0)