async function color_nodes() {
let job_id = job_list.length;
job_list.forEach((_, i) => (job_list[i] = false));
job_list.push(true);
d3.select(comment).text("");
d3.select(greedy_animation)
.selectAll("g.node")
.select("ellipse")
.attr("fill", "white");
let colored_nodes = d3.range(G.nodes.length).map((n) => ({
idx: n,
neighbors: neighbors(G, n)
}));
let current_color = 1;
let cnt = 0;
for (
let i = 0;
i < colored_nodes.length && cnt < colored_nodes.length && job_list[job_id];
i++
) {
d3.select(comment).text(`Setting color ${current_color}.`);
await Promises.delay(200);
let node1 = colored_nodes[i];
if (test(node1, current_color)) {
node1.color = current_color;
cnt++;
d3.select(greedy_animation)
.select(`g#node${node1.idx + 1}`)
.select("ellipse")
.attr("fill", d3.schemeCategory10[current_color]);
for (let j = i + 1; j < colored_nodes.length && job_list[job_id]; j++) {
await Promises.delay(100);
let node2 = colored_nodes[j];
if (test(node2, current_color)) {
node2.color = current_color;
cnt++;
d3.select(greedy_animation)
.select(`g#node${node2.idx + 1}`)
.select("ellipse")
.attr("fill", d3.schemeCategory10[current_color]);
}
}
current_color++;
}
}
d3.select(comment).text(`Graph successfully ${current_color - 1}-colored!`);
function test(node, c) {
return (
!node.color &&
node.neighbors.every(function (k) {
let neighbor = colored_nodes.filter((node) => node.idx == k)[0];
return !neighbor.color || neighbor.color != c;
})
);
}
}