graphology-operators
Version:
Miscellaneous operators for graphology.
82 lines (65 loc) • 1.67 kB
JavaScript
/**
* Graphology Disjoint Union Operator
* ===================================
*/
var isGraph = require('graphology-utils/is-graph');
var copyNode = require('graphology-utils/add-node').copyNode;
var copyEdge = require('graphology-utils/add-edge').copyEdge;
/**
* Function returning the disjoint union of two given graphs by giving new keys
* to nodes & edges.
*
* @param {Graph} G - The first graph.
* @param {Graph} H - The second graph.
* @return {Graph}
*/
module.exports = function disjointUnion(G, H) {
if (!isGraph(G) || !isGraph(H))
throw new Error('graphology-operators/disjoint-union: invalid graph.');
if (G.multi !== H.multi)
throw new Error(
'graphology-operators/disjoint-union: both graph should be simple or multi.'
);
var R = G.nullCopy();
// TODO: in the spirit of this operator we should probably prefix something
R.mergeAttributes(G.getAttributes());
var labelsG = {};
var labelsH = {};
var i = 0;
// Adding nodes
G.forEachNode(function (key, attr) {
labelsG[key] = i;
copyNode(R, i, attr);
i++;
});
H.forEachNode(function (key, attr) {
labelsH[key] = i;
copyNode(R, i, attr);
i++;
});
// Adding edges
i = 0;
G.forEachEdge(function (key, attr, source, target, _s, _t, undirected) {
copyEdge(
R,
undirected,
i++,
labelsG[source],
labelsG[target],
target,
attr
);
});
H.forEachEdge(function (key, attr, source, target, _s, _t, undirected) {
copyEdge(
R,
undirected,
i++,
labelsH[source],
labelsH[target],
target,
attr
);
});
return R;
};