Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
graphology-metrics
Advanced tools
Miscellaneous metrics to be used with graphology
.
npm install graphology-metrics
Graph metrics
Node metrics
Edge metrics
Centrality
Layout quality metrics
Computes the density of the given graph. Note that multi variants can exceed 0
, as it is also the case when considering self loops.
import {density} from 'graphology-metrics/graph/density';
// Passing a graph instance
const d = density(graph);
// Passing the graph's order & size
const d = density(order, size);
// Or to force the kind of density being computed
import {
mixedDensity,
directedDensity,
undirectedDensity,
multiMixedDensity,
multiDirectedDensity,
multiUndirectedDensity
} from 'graphology-metric/graph/density';
const d = undirectedDensity(mixedGraph);
// If you need to chose the kind of density dynamically
import {abstractDensity} from 'graphology-metric/graph/density';
abstractDensity('directed', true, 10, 24);
Arguments
Either:
Or:
Abstract version arguments
Either:
directed
, undirected
or mixed
).Or:
directed
, undirected
or mixed
).Computes the diameter, i.e the maximum eccentricity of any node of the given graph.
import diameter from 'graphology-metrics/graph/diameter';
const graph = new Graph();
graph.addNode('1');
graph.addNode('2');
graph.addNode('3');
graph.addUndirectedEdge(1, 2);
graph.addUndirectedEdge(2, 3);
diameter(graph);
>>> 2
Arguments
Computes the extent - min, max - of a node or edge's attribute.
import {nodeExtent, edgeExtent} from 'graphology-metrics/graph';
// Alternatively, to load only the relevant code:
import {nodeExtent, edgeExtent} from 'graphology-metrics/graph/extent';
// Retrieving a single node attribute's extent
nodeExtent(graph, 'size');
>>> [1, 34]
// Retrieving multiple node attributes' extents
nodeExtent(graph, ['x', 'y']);
>>> {x: [-4, 3], y: [-34, 56]}
// The same for edges
edgeExtent(graph, 'weight');
>>> [0, 5.7]
Arguments
Computes the modularity, given the graph and a node partition. It works on both directed & undirected networks and will return the relevant modularity.
import modularity from 'graphology-metrics/graph/modularity';
// Simplest way
const Q = modularity(graph);
// Custom node partition
const Q = modularity(graph, {
getNodeCommunity(node, attr) {
return attr.customPartition;
}
});
Arguments
community
]: name of the node community attribute or getter function.weight
]: name of the edges' weight attribute or getter function.γ
).Computes the simple size of a given graph, i.e. its number of edges if we consider the graph simple, even if it has multiple edges between pairs of nodes.
import {simpleSize} from 'graphology-metrics';
// Alternatively, to load only the relevant code:
import simpleSize from 'graphology-metrics/graph/simple-size';
const graph = new MultiGraph();
graph.mergeEdge(1, 2);
graph.mergeEdge(1, 2);
graph.mergeEdge(4, 3);
graph.mergeUndirectedEdge(5, 6);
simpleSize(graph);
>>> 3
Computes the weighted size, i.e. the sum of the graph's edges' weight, of the given graph.
import weightedSize from 'graphology-metrics/graph/weighted-size';
const graph = new Graph();
graph.mergeEdge(1, 2, {weight: 3});
graph.mergeEdge(1, 2, {weight: 1});
// Simplest way
weightedSize(graph);
>>> 4
// With custom weight attribute
weightedSize(graph, 'myWeightAttribute');
>>> 4
// With custom getter
weightedSize(graph, (_, attr) => attr.importance);
Arguments
weight
]: name of the weight attribute or getter function.Computes the weighted degree of nodes. The weighted degree of a node is the sum of its edges' weights.
import {
weightedDegree,
weightedInDegree,
weightedOutDegree,
weightedInboundDegree,
weightedOutboundDegree,
weightedUndirectedDegree,
weightedDirectedDegree
} from 'graphology-metrics/node/weighted-degree';
// To compute weighted degree of a node
weightedDegree(graph, 'A');
// To use a custom weight
weightedDegree(graph, 'A', function (_, attr) {
return attr.importance;
});
Arguments
Computes the eccentricity which is the maximum of the shortest paths between the given node and any other node.
import eccentricity from 'graphology-metrics/node/eccentricity';
graph.addNode('1');
graph.addNode('2');
graph.addNode('3');
graph.addNode('4');
graph.addUndirectedEdge(1, 2);
graph.addUndirectedEdge(2, 3);
graph.addUndirectedEdge(3, 1);
graph.addUndirectedEdge(3, 4);
eccentricity(graph, 3) >> 1;
Arguments
Function computing a score for each edge which is necessary to apply a "disparity filter" as described in the following paper:
Serrano, M. Ángeles, Marián Boguná, and Alessandro Vespignani. "Extracting the multiscale backbone of complex weighted networks." Proceedings of the national academy of sciences 106.16 (2009): 6483-6488.
Note that this metric requires a weighted graph or will return a useless result.
Beware, the results must be interpreted thusly: a lower score means a more relevant edge, as is intuited in the paper's formulae. This means you can prune edges that have a score greater than a given threshold, as a statistical test. Some other implementations might differ in that they offer the opposite intuition (i.e. greater score = more relevant edge).
import disparity from 'graphology-metrics/edge/disparity';
// To compute strength for every edge:
const disparities = disparity(graph);
// To directly map the result onto edge attributes (`disparity`):
disparity.assign(graph);
// Using custom weights
disparity.assign(graph, {getEdgeWeight: (_, attr) => attr.importance});
Arguments
disparity
]: Name of the disparity attribute to assign.weight
]: Name of the edge weight attribute or getter function.Function returning the simmelian strength, i.e. the number of triangles an edge is part of, of all the edges in the given graph.
import simmelianStrength from 'graphology-metrics/edge/simmelian-strength';
// To compute strength for every edge:
const strengths = simmelianStrength(graph);
// To directly map the result onto edge attributes (`simmelianStrength`):
simmelianStrength.assign(graph);
Computes the betweenness centrality for every node.
import betweennessCentrality from 'graphology-metrics/centrality/betweenness';
// To compute centrality for every node:
const centralities = betweennessCentrality(graph);
// To directly map the result onto nodes' attributes (`betweennessCentrality`):
betweennessCentrality.assign(graph);
// To directly map the result onto a custom attribute:
betweennessCentrality.assign(graph, {nodeCentralityAttribute: 'myCentrality'});
// To ignore weights
const centralities = betweennessCentrality(graph, {getEdgeWeight: null});
// To use a getter function for weights
const centralities = betweennessCentrality(graph, {
getEdgeWeight: (_, attr) => attr.importance
});
Arguments
betweennessCentrality
]: Name of the centrality attribute to assign.weight
]: Name of the edge weight attribute or getter function.true
]: should the result be normalized?Computes the betweenness centrality for every edge.
import edgeBetweennessCentrality from 'graphology-metrics/centrality/edge-betweenness';
// To compute centrality for every edge:
const centralities = edgeBetweennessCentrality(graph);
// To directly map the result onto edges' attributes (`edgeBetweennessCentrality`):
edgeBetweennessCentrality.assign(graph);
// To directly map the result onto a custom attribute:
edgeBetweennessCentrality.assign(graph, {
edgeCentralityAttribute: 'myCentrality'
});
// To ignore weights
const centralities = edgeBetweennessCentrality(graph, {getEdgeWeight: null});
// To use a getter function for weights
const centralities = edgeBetweennessCentrality(graph, {
getEdgeWeight: (_, attr) => attr.importance
});
Arguments
betweennessCentrality
]: Name of the centrality attribute to assign.weight
]: Name of the edge weight attribute or getter function.true
]: should the result be normalized?Computes the closeness centrality of a graph's nodes.
import closenessCentrality from 'graphology-metrics/centrality/closeness';
// To compute the eigenvector centrality and return the score per node:
const scores = closenessCentrality(graph);
// To directly map the result to nodes' attributes:
closenessCentrality.assign(graph);
// Note that you can also pass options to customize the algorithm:
const p = closenessCentrality(graph, {wassermanFaust: true});
Arguments
closenessCentrality
]: name of the node attribute that will be assigned the closeness centrality.false
]: whether to use Wasserman & Faust's normalization scheme.Computes the degree centrality for every node.
import {
degreeCentrality,
inDegreeCentrality,
outDegreeCentrality
} from 'graphology-metrics/centrality/degree';
// To compute degree centrality for every node:
const centralities = degreeCentrality(graph);
// To directly map the result onto nodes' attributes (`degreeCentrality`):
degreeCentrality.assign(graph);
// To directly map the result onto a custom attribute:
degreeCentrality.assign(graph, {nodeCentralityAttribute: 'myCentrality'});
Arguments
degreeCentrality
]: name of the centrality attribute to assign.Computes the eigenvector centrality of a graph's nodes.
import eigenvectorCentrality from 'graphology-metrics/centrality/eigenvector';
// To compute the eigenvector centrality and return the score per node:
const scores = eigenvectorCentrality(graph);
// To directly map the result to nodes' attributes:
eigenvectorCentrality.assign(graph);
// Note that you can also pass options to customize the algorithm:
const p = eigenvectorCentrality(graph, {tolerance: 1e-3});
// To ignore your graph's weights
eigenvectorCentrality.assign(graph, {getEdgeWeight: null});
Arguments
eigenvectorCentrality
]: name of the node attribute that will be assigned the eigenvector centrality.weight
]: name of the edges' weight attribute or getter function.100
]: maximum number of iterations to perform.1.e-6
]: convergence error tolerance.Computes the hub/authority metrics for each node using the HITS algorithm.
import hits from 'graphology-metrics/centrality/hits';
// To compute and return the result as 'hubs' & 'authorities':
const {hubs, authorities} = hits(graph);
// To directly map the result to nodes' attributes:
hits.assign(graph);
// Note that you can also pass options to customize the algorithm:
const {hubs, authorities} = hits(graph, {normalize: false});
Arguments
weight
]: name of the edges' weight attribute or getter function.hub
]: name of the node attribute holding hub information.authority
]: name of the node attribute holding authority information.100
]: maximum number of iterations to perform.true
]: should the result be normalized by the sum of values.1.e-8
]: convergence error tolerance.Computes the pagerank metrics for each node.
import pagerank from 'graphology-metrics/centrality/pagerank';
// To compute pagerank and return the score per node:
const scores = pagerank(graph);
// To directly map the result to nodes' attributes:
pagerank.assign(graph);
// Note that you can also pass options to customize the algorithm:
const p = pagerank(graph, {alpha: 0.9});
// To ignore your graph's weights
pagerank.assign(graph, {getEdgeWeight: null});
Arguments
pagerank
]: name of the node attribute that will be assigned the pagerank score.weight
]: name of the edges' weight attribute or getter function.0.85
]: damping parameter of the algorithm.100
]: maximum number of iterations to perform.1.e-6
]: convergence error tolerance.Computes the edge uniformity layout quality metric from the given graph having x
and y
positions attached to its nodes. Edge uniformity is the normalized standard deviation of edge length of the graph. Lower values should be synonym of better layout according to this particular metric.
Runs in O(E)
.
import edgeUniformity from 'graphology-metrics/layout-quality/edge-uniformity';
edgeUniformity(graph);
>>> ~1.132
Computes the "neighborhood preservation" layout quality metric from the given graph having x
and y
positions attached to its nodes. Neighborhood preservation is the average proportion of node neighborhood being the same both in the graph's topology and its 2d layout space. The metric is therefore comprised between 0
and 1
, 1
being the best, meaning that every node keeps its neighborhood perfectly intact within the layout space.
Runs in approximately O(N * log(N))
.
import neighborhoodPreservation from 'graphology-metrics/layout-quality/neighborhood-preservation';
neighborhoodPreservation(graph);
// >>> 0.456
Computes the "stress" layout quality metric from the given graph having x
and y
positions attached to its nodes. Stress is the sum of normalized delta between node topology distances and their layout space distances. Lower values should be synonym of better layout according to this particular metric.
Note that this metric does not work very well when the graph has multiple connected components.
Note also that this metric traverses any given graph as an undirected one.
Runs in O(N^2)
.
import stress from 'graphology-metrics/layout-quality/stress';
stress(graph);
// >>> ~24510.2914
FAQs
Miscellaneous graph metrics for graphology.
The npm package graphology-metrics receives a total of 22,774 weekly downloads. As such, graphology-metrics popularity was classified as popular.
We found that graphology-metrics demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.