libgraph v1.2.10
libgraph
javascript
libs for graphs.
npm i libgraph
libgraph/Graph
-- data-structure
Graph
class is defined in ./Graph.coffee
.
By graph
we mean a directed graph with multi-edges and loops.
A graph
consists of:
edges
: a list (vector) of "edges";vertices
: a map from vertex name to its payload;src
: a map from the vertex name to the list of indexed (position in the list ofedges
) of outgoing edges of the vertex;dst
: a map from the vertex name to the list of indexed (position in the list ofedges
) of incoming edges to the vertex;
For example:
Graph {
edges: [
{ src: 'a', dst: 'b', weigth: 12 },
{ src: 'b', dst: 'b' } ],
vertices: {
a: { label: 'a' },
b: { _rem: 'discovered' } },
src: { a: [ 0 ], b: [ 1 ] },
dst: { b: [ 0, 1 ] } }
The above graph can be constructed by:
var Graph = require("libgraph/Graph");
var my_graph = new Graph([{src: 'a', dst: 'b'}, {src: 'b', dst: 'b'}], {a: {label: "a"}});
The data structure allows us to store any meta-data in a vertex and an
edge. Properties src
and dst
are used for navigation within the
graph from a vertex to its neighbors.
libgraph/generators
-- helper functions to build graphs
Some helper functions for building graphs are provided there.
For example:
var Graph = require("libgraph/Graph"),
gener = require("libgraph/generators");
var cycle = new Graph(gener.cycle(5)),
grid = new Graph(gener.grid(2,2));
cycle
will be:
Graph {
edges:
[ { src: 'v0', dst: 'v1' },
{ src: 'v1', dst: 'v2' },
{ src: 'v2', dst: 'v3' },
{ src: 'v3', dst: 'v4' },
{ src: 'v4', dst: 'v0' } ],
vertices:
{ v0: { _rem: 'discovered' },
v1: { _rem: 'discovered' },
v2: { _rem: 'discovered' },
v3: { _rem: 'discovered' },
v4: { _rem: 'discovered' } },
src: { v0: [ 0 ], v1: [ 1 ], v2: [ 2 ], v3: [ 3 ], v4: [ 4 ] },
dst: { v1: [ 0 ], v2: [ 1 ], v3: [ 2 ], v4: [ 3 ], v0: [ 4 ] } }
and grid
will be:
Graph {
edges:
[ { src: 'v0x0', dst: 'v0x1' },
{ src: 'v0x0', dst: 'v1x0' },
{ src: 'v0x1', dst: 'v1x1' },
{ src: 'v1x0', dst: 'v1x1' } ],
vertices:
{ v0x0: { _rem: 'discovered' },
v0x1: { _rem: 'discovered' },
v1x0: { _rem: 'discovered' },
v1x1: { _rem: 'discovered' } },
src: { v0x0: [ 0, 1 ], v0x1: [ 2 ], v1x0: [ 3 ] },
dst: { v0x1: [ 0 ], v1x0: [ 1 ], v1x1: [ 2, 3 ] } }
libgraph/dfs
-- depth-first search
The depth-first search is implemented in ./dfs
.
For example:
var Graph = require("libgraph/Graph"),
gener = require("libgraph/generators"),
dfs = require("libgraph/dfs");
var grid = new Graph(gener.grid(3,3));
console.log(dfs(grid,'v1x1'));
// { visit:
// { v1x1: { discoveryTime: 1, treeEdge: undefined, closeTime: 8 },
// v1x2: { discoveryTime: 2, treeEdge: 7, closeTime: 5 },
// v2x2: { discoveryTime: 3, treeEdge: 9, closeTime: 4 },
// v2x1: { discoveryTime: 6, treeEdge: 8, closeTime: 7 } },
// treeEdges: [ 7, 9, 8 ],
// crossEdges: [ 11 ],
// backEdges: [] }
libgraph/topo-order
-- orders vertices topologicaly
Outputs a topologicaly ordered list of vertices of an acyclic graph.
Example:
var Graph = require("libgraph/Graph"),
gener = require("libgraph/generators"),
topo = require("libgraph/topo-order");
var grid = new Graph(gener.grid());
console.log(grid);
/* output: Graph {
edges:
[ { src: 'v0x0', dst: 'v0x1' },
{ src: 'v0x0', dst: 'v1x0' },
{ src: 'v0x1', dst: 'v1x1' },
{ src: 'v1x0', dst: 'v1x1' } ],
vertices:
{ v0x0: { _rem: 'discovered' },
v0x1: { _rem: 'discovered' },
v1x0: { _rem: 'discovered' },
v1x1: { _rem: 'discovered' } },
src: { v0x0: [ 0, 1 ], v0x1: [ 2 ], v1x0: [ 3 ] },
dst: { v0x1: [ 0 ], v1x0: [ 1 ], v1x1: [ 2, 3 ] } }
*/
console.log(topo(grid));
/* output: [ 'v0x0', 'v1x0', 'v0x1', 'v1x1' ] */
libgraph/dijkstra
-- Dijkstra shortest-path algorithm
Example:
var Graph = require("libgraph/Graph"),
gener = require("libgraph/generators"),
dijkstra = require("libgraph/dijkstra");
var cube = new Graph(gener.bin_cube(3));
console.log(cube.edges);
/* output:
[ { src: '000', dst: '100' },
{ src: '001', dst: '101' },
{ src: '010', dst: '110' },
{ src: '011', dst: '111' },
{ src: '000', dst: '010' },
{ src: '001', dst: '011' },
{ src: '100', dst: '110' },
{ src: '101', dst: '111' },
{ src: '100', dst: '101' },
{ src: '110', dst: '111' },
{ src: '000', dst: '001' },
{ src: '010', dst: '011' } ] */
var shortestPathsInHops = dijkstra(cube);
var shortestPathsDataStructure = shortestPathsInHops.from('011');
console.log(JSON.stringify(shortestPathsDataStructure));
/* output:
{"src":"011","data":{"111":{"last":[3],"distance":1},"011":{"last":[],"distance":0}}} */
var shortestPathEdges = shortestPathsInHops.from('000').edgesTo('011');
console.log(JSON.stringify(shortestPathEdges));
/* output: [11,5,4,10] */
var shortestPathDAG = new Graph(shortestPathEdges.map(function(e){return cube.edges[e];}));
console.log(shortestPathDAG.edges);
/* output:
[ { src: '010', dst: '011' },
{ src: '001', dst: '011' },
{ src: '000', dst: '010' },
{ src: '000', dst: '001' } ] */
libgraph/bellman-ford
-- Bellman-Ford shortest-paths algorithm
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago