graphology-metrics
Version:
Miscellaneous graph metrics for graphology.
119 lines (102 loc) • 3.24 kB
JavaScript
/**
* Graphology Density
* ===================
*
* Functions used to compute the density of the given graph.
*/
var isGraph = require('graphology-utils/is-graph');
var simpleSize = require('./simple-size.js');
/**
* Returns the undirected density.
*
* @param {number} order - Number of nodes in the graph.
* @param {number} size - Number of edges in the graph.
* @return {number}
*/
function undirectedDensity(order, size) {
return (2 * size) / (order * (order - 1));
}
/**
* Returns the directed density.
*
* @param {number} order - Number of nodes in the graph.
* @param {number} size - Number of edges in the graph.
* @return {number}
*/
function directedDensity(order, size) {
return size / (order * (order - 1));
}
/**
* Returns the mixed density.
*
* @param {number} order - Number of nodes in the graph.
* @param {number} size - Number of edges in the graph.
* @return {number}
*/
function mixedDensity(order, size) {
var d = order * (order - 1);
return size / (d + d / 2);
}
/**
* Returns the density for the given parameters.
*
* Arity 3:
* @param {boolean} type - Type of density.
* @param {boolean} multi - Compute multi density?
* @param {Graph} graph - Target graph.
*
* Arity 4:
* @param {boolean} type - Type of density.
* @param {boolean} multi - Compute multi density?
* @param {number} order - Number of nodes in the graph.
* @param {number} size - Number of edges in the graph.
*
* @return {number}
*/
function abstractDensity(type, multi, graph) {
var order, size;
// Retrieving order & size
if (arguments.length > 3) {
order = graph;
size = arguments[3];
if (typeof order !== 'number' || order < 0)
throw new Error(
'graphology-metrics/density: given order is not a valid number.'
);
if (typeof size !== 'number' || size < 0)
throw new Error(
'graphology-metrics/density: given size is not a valid number.'
);
} else {
if (!isGraph(graph))
throw new Error(
'graphology-metrics/density: given graph is not a valid graphology instance.'
);
order = graph.order;
size = graph.size;
if (graph.multi && multi === false) size = simpleSize(graph);
}
// When the graph has only one node, its density is 0
if (order < 2) return 0;
// Guessing type & multi
if (type === null) type = graph.type;
if (multi === null) multi = graph.multi;
// Getting the correct function
var fn;
if (type === 'undirected') fn = undirectedDensity;
else if (type === 'directed') fn = directedDensity;
else fn = mixedDensity;
// Applying the function
return fn(order, size);
}
/**
* Exporting.
*/
exports.abstractDensity = abstractDensity;
exports.density = abstractDensity.bind(null, null, null);
exports.directedDensity = abstractDensity.bind(null, 'directed', false);
exports.undirectedDensity = abstractDensity.bind(null, 'undirected', false);
exports.mixedDensity = abstractDensity.bind(null, 'mixed', false);
exports.multiDirectedDensity = abstractDensity.bind(null, 'directed', true);
exports.multiUndirectedDensity = abstractDensity.bind(null, 'undirected', true);
exports.multiMixedDensity = abstractDensity.bind(null, 'mixed', true);