graph = {
const graph = new Graph();
const [nodeCount, iterations] = [
controls.children[0].value,
controls.children[1].value
];
for (let i = 2; i < nodeCount; i++) {
graph.addNode(i, {
nodeType: isPrime(i) ? "prime" : "composite",
label: i
});
}
for (let i = 0; i < nodeCount; i++) {
_.map(_.countBy(primeFactors(i)), (freq, factor) =>
graph.addEdge(factor, i, { weight: freq })
);
}
const degrees = graph.nodes().map((node) => graph.degree(node));
const minDegree = Math.min(...degrees);
const maxDegree = Math.max(...degrees);
const minSize = 2,
maxSize = 15;
graph.forEachNode((node, attributes) => {
const degree = graph.degree(node);
graph.setNodeAttribute(
node,
"size",
minSize +
((degree - minDegree) / (maxDegree - minDegree)) * (maxSize - minSize)
);
graph.setNodeAttribute(
node,
"color",
attributes.nodeType === "prime" ? "#33a02c" : "#e31a1c"
);
});
cropToLargestConnectedComponent(graph);
container.innerHTML = "";
circularLayout.assign(graph);
const settings = forceAtlas2.inferSettings(graph);
forceAtlas2.assign(graph, { settings, iterations });
return graph;
}