@graphty/algorithms 2.0.2 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -43
- package/dist/algorithms.js +85 -47
- package/dist/algorithms.js.map +1 -1
- package/dist/algorithms.standalone.js +86 -48
- package/dist/algorithms.standalone.js.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +9 -3
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js +29 -31
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.d.ts +6 -3
- package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.js +14 -5
- package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +7 -3
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/core/graph.d.ts.map +1 -1
- package/dist/src/core/graph.js +7 -3
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/errors.d.ts +22 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +24 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexed/dijkstra.d.ts +2 -0
- package/dist/src/indexed/dijkstra.d.ts.map +1 -1
- package/dist/src/indexed/dijkstra.js +32 -13
- package/dist/src/indexed/dijkstra.js.map +1 -1
- package/dist/src/link-prediction/adamic-adar.js +1 -1
- package/dist/src/link-prediction/adamic-adar.js.map +1 -1
- package/dist/src/link-prediction/common-neighbors.js +1 -1
- package/dist/src/link-prediction/common-neighbors.js.map +1 -1
- package/dist/src/types/index.d.ts +4 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/algorithms/centrality/delta-pagerank-simple.ts +44 -33
- package/src/algorithms/centrality/eigenvector.ts +14 -5
- package/src/algorithms/centrality/pagerank.ts +9 -3
- package/src/core/graph.ts +8 -3
- package/src/errors.ts +29 -0
- package/src/index.ts +1 -1
- package/src/indexed/dijkstra.ts +33 -13
- package/src/link-prediction/adamic-adar.ts +1 -1
- package/src/link-prediction/common-neighbors.ts +1 -1
- package/src/types/index.ts +4 -0
|
@@ -37,6 +37,7 @@ export interface SsspOptions {
|
|
|
37
37
|
* @param source - The search's source node index
|
|
38
38
|
* @param target - The node to walk back from
|
|
39
39
|
* @returns Node indices from source to target inclusive, or an empty array when unreached
|
|
40
|
+
* @throws PathWalkError when `predArc` has a gap or a cycle between `target` and `source`
|
|
40
41
|
* @public
|
|
41
42
|
*/
|
|
42
43
|
export declare function walkPredArcs(g: AdjacencyView, predArc: U32, source: number, target: number): U32;
|
|
@@ -47,6 +48,7 @@ export declare function walkPredArcs(g: AdjacencyView, predArc: U32, source: num
|
|
|
47
48
|
* @param source - The search's source node index
|
|
48
49
|
* @param target - The node to walk back from
|
|
49
50
|
* @returns Logical edge indices from source to target, or an empty array when unreached
|
|
51
|
+
* @throws PathWalkError when `predArc` has a gap or a cycle between `target` and `source`
|
|
50
52
|
* @public
|
|
51
53
|
*/
|
|
52
54
|
export declare function walkPredEdges(g: AdjacencyView, predArc: U32, source: number, target: number): U32;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dijkstra.d.ts","sourceRoot":"","sources":["../../../src/indexed/dijkstra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"dijkstra.d.ts","sourceRoot":"","sources":["../../../src/indexed/dijkstra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAMxG;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACvB,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;CAClC;AAED,+CAA+C;AAC/C,MAAM,WAAW,WAAW;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,iGAAiG;IACjG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AA6BD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAahG;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAWjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,UAAU,CA8BhG"}
|
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
import { INVALID_INDEX } from "@graphty/graph-format";
|
|
2
|
+
import { PathWalkError } from "../errors.js";
|
|
2
3
|
import { arcSourceIn } from "./structures/arc-source.js";
|
|
3
4
|
import { IndexedMinHeap } from "./structures/min-heap.js";
|
|
5
|
+
/**
|
|
6
|
+
* The arcs from `target` back to `source`, target end first. `predArc` may come from an
|
|
7
|
+
* accelerator, so it is not trusted: a missing or out-of-range arc, or more than nodeCount - 1
|
|
8
|
+
* steps, throws rather than walking off the array or looping.
|
|
9
|
+
* @param g - The adjacency the search ran on
|
|
10
|
+
* @param predArc - The search's predecessor-arc array
|
|
11
|
+
* @param source - The search's source node index
|
|
12
|
+
* @param target - The node to walk back from (reached, and not the source)
|
|
13
|
+
* @returns Arc indices, target end first
|
|
14
|
+
*/
|
|
15
|
+
function walkBack(g, predArc, source, target) {
|
|
16
|
+
const arcs = [];
|
|
17
|
+
let node = target;
|
|
18
|
+
while (node !== source) {
|
|
19
|
+
if (arcs.length >= g.nodeCount - 1) {
|
|
20
|
+
throw new PathWalkError(source, target, "cycle");
|
|
21
|
+
}
|
|
22
|
+
const arc = predArc[node];
|
|
23
|
+
if (!(arc < g.arcCount)) {
|
|
24
|
+
throw new PathWalkError(source, target, "gap"); // INVALID_INDEX is past arcCount too
|
|
25
|
+
}
|
|
26
|
+
arcs.push(arc);
|
|
27
|
+
node = arcSourceIn(g.rowPtr, arc);
|
|
28
|
+
}
|
|
29
|
+
return arcs;
|
|
30
|
+
}
|
|
4
31
|
/**
|
|
5
32
|
* Walk the predecessor arcs back from `target` and return the node path, source first.
|
|
6
33
|
* @param g - The adjacency the search ran on
|
|
@@ -8,6 +35,7 @@ import { IndexedMinHeap } from "./structures/min-heap.js";
|
|
|
8
35
|
* @param source - The search's source node index
|
|
9
36
|
* @param target - The node to walk back from
|
|
10
37
|
* @returns Node indices from source to target inclusive, or an empty array when unreached
|
|
38
|
+
* @throws PathWalkError when `predArc` has a gap or a cycle between `target` and `source`
|
|
11
39
|
* @public
|
|
12
40
|
*/
|
|
13
41
|
export function walkPredArcs(g, predArc, source, target) {
|
|
@@ -17,12 +45,7 @@ export function walkPredArcs(g, predArc, source, target) {
|
|
|
17
45
|
if (predArc[target] === INVALID_INDEX) {
|
|
18
46
|
return new Uint32Array(0);
|
|
19
47
|
}
|
|
20
|
-
const reversed = [target];
|
|
21
|
-
let node = target;
|
|
22
|
-
while (node !== source) {
|
|
23
|
-
node = arcSourceIn(g.rowPtr, predArc[node]);
|
|
24
|
-
reversed.push(node);
|
|
25
|
-
}
|
|
48
|
+
const reversed = [target, ...walkBack(g, predArc, source, target).map((arc) => arcSourceIn(g.rowPtr, arc))];
|
|
26
49
|
const out = new Uint32Array(reversed.length);
|
|
27
50
|
for (let i = 0; i < reversed.length; i++) {
|
|
28
51
|
out[i] = reversed[reversed.length - 1 - i];
|
|
@@ -36,19 +59,15 @@ export function walkPredArcs(g, predArc, source, target) {
|
|
|
36
59
|
* @param source - The search's source node index
|
|
37
60
|
* @param target - The node to walk back from
|
|
38
61
|
* @returns Logical edge indices from source to target, or an empty array when unreached
|
|
62
|
+
* @throws PathWalkError when `predArc` has a gap or a cycle between `target` and `source`
|
|
39
63
|
* @public
|
|
40
64
|
*/
|
|
41
65
|
export function walkPredEdges(g, predArc, source, target) {
|
|
42
66
|
if (target === source || predArc[target] === INVALID_INDEX) {
|
|
43
67
|
return new Uint32Array(0);
|
|
44
68
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
while (node !== source) {
|
|
48
|
-
const arc = predArc[node];
|
|
49
|
-
reversed.push(g.arcToEdge[arc]); // the EXACT parallel edge, not a (u, v) lookup
|
|
50
|
-
node = arcSourceIn(g.rowPtr, arc);
|
|
51
|
-
}
|
|
69
|
+
// the EXACT parallel edge, not a (u, v) lookup
|
|
70
|
+
const reversed = walkBack(g, predArc, source, target).map((arc) => g.arcToEdge[arc]);
|
|
52
71
|
const out = new Uint32Array(reversed.length);
|
|
53
72
|
for (let i = 0; i < reversed.length; i++) {
|
|
54
73
|
out[i] = reversed[reversed.length - 1 - i];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dijkstra.js","sourceRoot":"","sources":["../../../src/indexed/dijkstra.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,aAAa,EAAgC,MAAM,uBAAuB,CAAC;AAExG,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAmC1D
|
|
1
|
+
{"version":3,"file":"dijkstra.js","sourceRoot":"","sources":["../../../src/indexed/dijkstra.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,7 +60,7 @@ export function adamicAdarPrediction(graph, options = {}) {
|
|
|
60
60
|
for (let j = i + 1; j < nodes.length; j++) {
|
|
61
61
|
const source = nodes[i];
|
|
62
62
|
const target = nodes[j];
|
|
63
|
-
if (
|
|
63
|
+
if (source === undefined || target === undefined) {
|
|
64
64
|
continue;
|
|
65
65
|
}
|
|
66
66
|
// Skip existing edges unless requested
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adamic-adar.js","sourceRoot":"","sources":["../../../src/link-prediction/adamic-adar.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGvF;;;;;;;;;;;;GAYG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC3B,KAAY,EACZ,MAAc,EACd,MAAc,EACd,UAAiC,EAAE;IAEnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,CAAC;IACb,CAAC;IAED,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAErC,+CAA+C;IAC/C,oFAAoF;IACpF,MAAM,kBAAkB,GAAG,QAAQ;QAC/B,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;QAC7C,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAEvD,8BAA8B;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,QAAQ;YACnB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,qCAAqC;YACjE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,yCAAyC;QAEvE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,iEAAiE;YACjE,KAAK,IAAI,CAAC,CAAC,CAAC,iCAAiC;QACjD,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAY,EAAE,UAAiC,EAAE;IAClF,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,eAAe,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEpE,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAExB,IAAI,
|
|
1
|
+
{"version":3,"file":"adamic-adar.js","sourceRoot":"","sources":["../../../src/link-prediction/adamic-adar.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,7 @@ export function commonNeighborsPrediction(graph, options = {}) {
|
|
|
33
33
|
for (let j = i + 1; j < nodes.length; j++) {
|
|
34
34
|
const source = nodes[i];
|
|
35
35
|
const target = nodes[j];
|
|
36
|
-
if (
|
|
36
|
+
if (source === undefined || target === undefined) {
|
|
37
37
|
continue;
|
|
38
38
|
}
|
|
39
39
|
// Skip existing edges unless requested
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-neighbors.js","sourceRoot":"","sources":["../../../src/link-prediction/common-neighbors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAyBvF;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAChC,KAAY,EACZ,MAAc,EACd,MAAc,EACd,UAAiC,EAAE;IAEnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,CAAC;IACb,CAAC;IAED,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAErC,+CAA+C;IAC/C,oFAAoF;IACpF,MAAM,kBAAkB,GAAG,QAAQ;QAC/B,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;QAC7C,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAEvD,OAAO,kBAAkB,CAAC,IAAI,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAY,EAAE,UAAiC,EAAE;IACvF,MAAM,EAAE,QAAQ,GAAG,KAAK,EAAE,eAAe,GAAG,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEpE,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAExB,IAAI,
|
|
1
|
+
{"version":3,"file":"common-neighbors.js","sourceRoot":"","sources":["../../../src/link-prediction/common-neighbors.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,10 @@ export interface Node {
|
|
|
16
16
|
export interface GraphConfig {
|
|
17
17
|
directed: boolean;
|
|
18
18
|
allowSelfLoops: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* When true, adding an edge between a pair that already has one REPLACES that edge (its
|
|
21
|
+
* weight and data) instead of throwing. The graph never holds two edges for one pair.
|
|
22
|
+
*/
|
|
19
23
|
allowParallelEdges: boolean;
|
|
20
24
|
}
|
|
21
25
|
export interface ShortestPathResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphty/algorithms",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "Graph algorithms library for browser environments implemented in TypeScript",
|
|
5
5
|
"author": "Adam Powers <apowers@ato.ms>",
|
|
6
6
|
"main": "dist/algorithms.js",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
},
|
|
93
93
|
"dependencies": {
|
|
94
94
|
"typedfastbitset": "^0.6.1",
|
|
95
|
-
"@graphty/graph-format": "^1.0.
|
|
95
|
+
"@graphty/graph-format": "^1.0.5"
|
|
96
96
|
},
|
|
97
97
|
"peerDependencies": {
|
|
98
98
|
"@graphty/graph-format": "^1.0.0"
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
"commit": "cz",
|
|
139
139
|
"ready:commit": "npm run build && npm run lint && npm run test:all",
|
|
140
140
|
"watch": "tsc --watch",
|
|
141
|
-
"docs:api": "typedoc && node
|
|
141
|
+
"docs:api": "typedoc && node ../tools/sanitize-api-docs.js docs/api/generated",
|
|
142
142
|
"docs:api:watch": "typedoc --watch",
|
|
143
143
|
"docs:dev": "vitepress dev docs --port ${PORT:?start it through servherd, which sets PORT} --strictPort",
|
|
144
144
|
"docs:watch": "npm run docs:api && (npm run docs:api:watch & npm run docs:dev & wait)",
|
|
@@ -2,8 +2,8 @@ import type { Graph } from "../../core/graph.js";
|
|
|
2
2
|
import type { NodeId } from "../../types/index.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Simplified Delta-based PageRank
|
|
6
|
-
*
|
|
5
|
+
* Simplified Delta-based PageRank. compute() runs the same power iteration as the standard
|
|
6
|
+
* algorithm; update() restarts it from the previous scores after a graph change.
|
|
7
7
|
*
|
|
8
8
|
* Key optimization: Supports incremental updates when graph structure changes,
|
|
9
9
|
* avoiding full recomputation from scratch.
|
|
@@ -13,6 +13,12 @@ export class SimpleDeltaPageRank {
|
|
|
13
13
|
private nodeCount: number;
|
|
14
14
|
private previousScores: Map<NodeId, number> | null = null;
|
|
15
15
|
|
|
16
|
+
/** Iterations the last compute() or update() actually ran. */
|
|
17
|
+
public iterations = 0;
|
|
18
|
+
|
|
19
|
+
/** Whether the last compute() or update() met its tolerance before maxIterations. */
|
|
20
|
+
public converged = false;
|
|
21
|
+
|
|
16
22
|
/**
|
|
17
23
|
* Creates a new SimpleDeltaPageRank instance for the given graph.
|
|
18
24
|
* @param graph - The directed graph to compute PageRank on
|
|
@@ -32,22 +38,35 @@ export class SimpleDeltaPageRank {
|
|
|
32
38
|
* @param options.dampingFactor - Probability of following a link (default: 0.85)
|
|
33
39
|
* @param options.tolerance - Convergence tolerance threshold (default: 1e-6)
|
|
34
40
|
* @param options.maxIterations - Maximum number of iterations (default: 100)
|
|
41
|
+
* @param options.initialRanks - Starting scores (missing nodes start at 1/n; normalized to sum 1)
|
|
35
42
|
* @param options.personalization - Personalization vector for Personalized PageRank
|
|
36
43
|
* @param options.weight - Edge attribute name for weighted PageRank
|
|
37
|
-
* @returns Map of node IDs to their PageRank scores
|
|
44
|
+
* @returns Map of node IDs to their PageRank scores; `iterations` and `converged` describe the run
|
|
38
45
|
*/
|
|
39
46
|
public compute(
|
|
40
47
|
options: {
|
|
41
48
|
dampingFactor?: number;
|
|
42
49
|
tolerance?: number;
|
|
43
50
|
maxIterations?: number;
|
|
51
|
+
initialRanks?: Map<NodeId, number>;
|
|
44
52
|
personalization?: Map<NodeId, number>;
|
|
45
53
|
weight?: string;
|
|
46
54
|
} = {},
|
|
47
55
|
): Map<NodeId, number> {
|
|
48
|
-
const {
|
|
56
|
+
const {
|
|
57
|
+
dampingFactor = 0.85,
|
|
58
|
+
tolerance = 1e-6,
|
|
59
|
+
maxIterations = 100,
|
|
60
|
+
initialRanks,
|
|
61
|
+
personalization,
|
|
62
|
+
weight,
|
|
63
|
+
} = options;
|
|
64
|
+
|
|
65
|
+
this.iterations = 0;
|
|
66
|
+
this.converged = false;
|
|
49
67
|
|
|
50
68
|
if (this.nodeCount === 0) {
|
|
69
|
+
this.converged = true;
|
|
51
70
|
return new Map();
|
|
52
71
|
}
|
|
53
72
|
|
|
@@ -56,9 +75,11 @@ export class SimpleDeltaPageRank {
|
|
|
56
75
|
const newScores = new Map<NodeId, number>();
|
|
57
76
|
|
|
58
77
|
for (const node of this.graph.nodes()) {
|
|
59
|
-
scores.set(node.id, 1.0 / this.nodeCount);
|
|
78
|
+
scores.set(node.id, initialRanks?.get(node.id) ?? 1.0 / this.nodeCount);
|
|
60
79
|
}
|
|
61
80
|
|
|
81
|
+
this.normalizeMap(scores);
|
|
82
|
+
|
|
62
83
|
// Precompute out-degrees and weights
|
|
63
84
|
const outWeights = new Map<NodeId, number>();
|
|
64
85
|
const danglingNodes = new Set<NodeId>();
|
|
@@ -69,8 +90,7 @@ export class SimpleDeltaPageRank {
|
|
|
69
90
|
|
|
70
91
|
for (const neighbor of Array.from(this.graph.neighbors(node.id))) {
|
|
71
92
|
outDegree++;
|
|
72
|
-
|
|
73
|
-
totalWeight += edge?.weight ?? 1;
|
|
93
|
+
totalWeight += weight ? (this.graph.getEdge(node.id, neighbor)?.weight ?? 1) : 1;
|
|
74
94
|
}
|
|
75
95
|
|
|
76
96
|
outWeights.set(node.id, totalWeight);
|
|
@@ -86,8 +106,9 @@ export class SimpleDeltaPageRank {
|
|
|
86
106
|
this.normalizeMap(personalVector);
|
|
87
107
|
}
|
|
88
108
|
|
|
89
|
-
// Power iteration
|
|
90
|
-
|
|
109
|
+
// Power iteration. Every node propagates every iteration: skipping a node whose score has
|
|
110
|
+
// settled drops its whole contribution from its neighbours, which leaks rank and stops the
|
|
111
|
+
// run from ever converging.
|
|
91
112
|
let iteration = 0;
|
|
92
113
|
|
|
93
114
|
for (iteration = 0; iteration < maxIterations; iteration++) {
|
|
@@ -119,8 +140,8 @@ export class SimpleDeltaPageRank {
|
|
|
119
140
|
}
|
|
120
141
|
}
|
|
121
142
|
|
|
122
|
-
// Propagate rank from
|
|
123
|
-
for (const nodeId of
|
|
143
|
+
// Propagate rank from every node
|
|
144
|
+
for (const nodeId of scores.keys()) {
|
|
124
145
|
const currentRank = scores.get(nodeId) ?? 0;
|
|
125
146
|
const nodeOutWeight = outWeights.get(nodeId) ?? 0;
|
|
126
147
|
|
|
@@ -139,27 +160,11 @@ export class SimpleDeltaPageRank {
|
|
|
139
160
|
}
|
|
140
161
|
}
|
|
141
162
|
|
|
142
|
-
// Check convergence
|
|
143
|
-
const nextActive = new Set<NodeId>();
|
|
163
|
+
// Check convergence
|
|
144
164
|
let maxDiff = 0;
|
|
145
165
|
|
|
146
166
|
for (const nodeId of scores.keys()) {
|
|
147
|
-
|
|
148
|
-
const newRank = newScores.get(nodeId) ?? 0;
|
|
149
|
-
const diff = Math.abs(newRank - oldRank);
|
|
150
|
-
maxDiff = Math.max(maxDiff, diff);
|
|
151
|
-
|
|
152
|
-
// Mark as active if change is significant
|
|
153
|
-
if (diff > tolerance / 10) {
|
|
154
|
-
nextActive.add(nodeId);
|
|
155
|
-
// Also mark neighbors as potentially active
|
|
156
|
-
for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {
|
|
157
|
-
nextActive.add(neighbor);
|
|
158
|
-
}
|
|
159
|
-
for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {
|
|
160
|
-
nextActive.add(neighbor);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
167
|
+
maxDiff = Math.max(maxDiff, Math.abs((newScores.get(nodeId) ?? 0) - (scores.get(nodeId) ?? 0)));
|
|
163
168
|
}
|
|
164
169
|
|
|
165
170
|
// Swap score maps
|
|
@@ -169,13 +174,14 @@ export class SimpleDeltaPageRank {
|
|
|
169
174
|
}
|
|
170
175
|
newScores.clear();
|
|
171
176
|
|
|
172
|
-
activeNodes = nextActive;
|
|
173
|
-
|
|
174
177
|
if (maxDiff < tolerance) {
|
|
178
|
+
this.converged = true;
|
|
175
179
|
break;
|
|
176
180
|
}
|
|
177
181
|
}
|
|
178
182
|
|
|
183
|
+
this.iterations = this.converged ? iteration + 1 : iteration;
|
|
184
|
+
|
|
179
185
|
// Store scores for potential incremental updates
|
|
180
186
|
this.previousScores = new Map(scores);
|
|
181
187
|
|
|
@@ -211,6 +217,9 @@ export class SimpleDeltaPageRank {
|
|
|
211
217
|
|
|
212
218
|
const { dampingFactor = 0.85, tolerance = 1e-6, maxIterations = 100, personalization, weight } = options;
|
|
213
219
|
|
|
220
|
+
this.iterations = 0;
|
|
221
|
+
this.converged = false;
|
|
222
|
+
|
|
214
223
|
// Initialize scores from previous computation
|
|
215
224
|
const scores = new Map(this.previousScores);
|
|
216
225
|
const newScores = new Map<NodeId, number>();
|
|
@@ -246,8 +255,7 @@ export class SimpleDeltaPageRank {
|
|
|
246
255
|
|
|
247
256
|
for (const neighbor of Array.from(this.graph.neighbors(node.id))) {
|
|
248
257
|
outDegree++;
|
|
249
|
-
|
|
250
|
-
totalWeight += edge?.weight ?? 1;
|
|
258
|
+
totalWeight += weight ? (this.graph.getEdge(node.id, neighbor)?.weight ?? 1) : 1;
|
|
251
259
|
}
|
|
252
260
|
|
|
253
261
|
outWeights.set(node.id, totalWeight);
|
|
@@ -349,10 +357,13 @@ export class SimpleDeltaPageRank {
|
|
|
349
357
|
activeNodes = nextActive;
|
|
350
358
|
|
|
351
359
|
if (maxDiff < tolerance) {
|
|
360
|
+
this.converged = true;
|
|
352
361
|
break;
|
|
353
362
|
}
|
|
354
363
|
}
|
|
355
364
|
|
|
365
|
+
this.iterations = this.converged ? iteration + 1 : iteration;
|
|
366
|
+
|
|
356
367
|
// Store scores for future incremental updates
|
|
357
368
|
this.previousScores = new Map(scores);
|
|
358
369
|
|
|
@@ -28,9 +28,12 @@ export interface EigenvectorCentralityOptions extends CentralityOptions {
|
|
|
28
28
|
* unshifted power iteration oscillate forever. The run stops when the L1 change summed over all
|
|
29
29
|
* nodes falls below `n * tolerance`, networkx's test.
|
|
30
30
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
31
|
+
* On a directed graph `mode` picks the edges that feed a node: `"in"` (the default, as networkx)
|
|
32
|
+
* scores a node by the nodes pointing AT it, `"out"` by the nodes it points at (networkx on
|
|
33
|
+
* `G.reverse()`), and `"total"` by both (networkx on `G.to_undirected()`). An undirected graph
|
|
34
|
+
* ignores `mode`. When the graph has no cycle along that relation (no edges, or a directed
|
|
35
|
+
* acyclic graph) the adjacency matrix is nilpotent, its only eigenvalue is 0, and every score is
|
|
36
|
+
* exactly 0.
|
|
34
37
|
* @param graph - The graph to compute eigenvector centrality on
|
|
35
38
|
* @param options - Configuration options for the computation
|
|
36
39
|
* @returns Object mapping node IDs to their eigenvector centrality scores
|
|
@@ -38,7 +41,7 @@ export interface EigenvectorCentralityOptions extends CentralityOptions {
|
|
|
38
41
|
* raises `PowerIterationFailedConvergence`. Raise `maxIterations` or `tolerance` and call again.
|
|
39
42
|
*/
|
|
40
43
|
export function eigenvectorCentrality(graph: Graph, options: EigenvectorCentralityOptions = {}): CentralityResult {
|
|
41
|
-
const { maxIterations = 100, tolerance = 1e-6, normalized = true, startVector } = options;
|
|
44
|
+
const { maxIterations = 100, tolerance = 1e-6, normalized = true, startVector, mode = "in" } = options;
|
|
42
45
|
|
|
43
46
|
const nodeIds = Array.from(graph.nodes(), (node) => node.id);
|
|
44
47
|
const keys = nodeIds.map((id) => id.toString());
|
|
@@ -50,7 +53,13 @@ export function eigenvectorCentrality(graph: Graph, options: EigenvectorCentrali
|
|
|
50
53
|
}
|
|
51
54
|
|
|
52
55
|
const index = new Map(keys.map((key, i) => [key, i]));
|
|
53
|
-
const
|
|
56
|
+
const feeders = (id: (typeof nodeIds)[number]): Iterable<(typeof nodeIds)[number]> => {
|
|
57
|
+
if (!graph.isDirected || mode === "out") {
|
|
58
|
+
return graph.neighbors(id);
|
|
59
|
+
}
|
|
60
|
+
return mode === "in" ? graph.inNeighbors(id) : new Set([...graph.inNeighbors(id), ...graph.neighbors(id)]);
|
|
61
|
+
};
|
|
62
|
+
const adjacency = nodeIds.map((id) => Array.from(feeders(id), (m) => index.get(m.toString()) ?? 0));
|
|
54
63
|
|
|
55
64
|
if (isNilpotent(adjacency)) {
|
|
56
65
|
for (const key of keys) {
|
|
@@ -116,6 +116,7 @@ export function pageRank(graph: Graph, options: PageRankOptions = {}): PageRankR
|
|
|
116
116
|
dampingFactor: number;
|
|
117
117
|
tolerance: number;
|
|
118
118
|
maxIterations: number;
|
|
119
|
+
initialRanks?: Map<NodeId, number>;
|
|
119
120
|
personalization?: Map<NodeId, number>;
|
|
120
121
|
weight?: string;
|
|
121
122
|
} = {
|
|
@@ -124,6 +125,10 @@ export function pageRank(graph: Graph, options: PageRankOptions = {}): PageRankR
|
|
|
124
125
|
maxIterations,
|
|
125
126
|
};
|
|
126
127
|
|
|
128
|
+
if (initialRanks) {
|
|
129
|
+
deltaOptions.initialRanks = initialRanks;
|
|
130
|
+
}
|
|
131
|
+
|
|
127
132
|
if (personalization) {
|
|
128
133
|
deltaOptions.personalization = personalization;
|
|
129
134
|
}
|
|
@@ -143,8 +148,8 @@ export function pageRank(graph: Graph, options: PageRankOptions = {}): PageRankR
|
|
|
143
148
|
|
|
144
149
|
return {
|
|
145
150
|
ranks: result,
|
|
146
|
-
iterations:
|
|
147
|
-
converged:
|
|
151
|
+
iterations: deltaPageRank.iterations,
|
|
152
|
+
converged: deltaPageRank.converged,
|
|
148
153
|
};
|
|
149
154
|
}
|
|
150
155
|
|
|
@@ -277,7 +282,8 @@ export function pageRank(graph: Graph, options: PageRankOptions = {}): PageRankR
|
|
|
277
282
|
|
|
278
283
|
return {
|
|
279
284
|
ranks: result,
|
|
280
|
-
|
|
285
|
+
// The loop breaks before incrementing on convergence, and leaves at maxIterations otherwise.
|
|
286
|
+
iterations: converged ? iteration + 1 : iteration,
|
|
281
287
|
converged,
|
|
282
288
|
};
|
|
283
289
|
}
|
package/src/core/graph.ts
CHANGED
|
@@ -124,8 +124,10 @@ export class Graph {
|
|
|
124
124
|
throw new Error("Self-loops are not allowed in this graph");
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
// Check parallel edges
|
|
128
|
-
|
|
127
|
+
// Check parallel edges. With allowParallelEdges the adjacency still holds one edge per
|
|
128
|
+
// pair, so a repeated pair replaces the earlier edge and must not be counted again.
|
|
129
|
+
const replacing = this.hasEdge(source, target);
|
|
130
|
+
if (!this.config.allowParallelEdges && replacing) {
|
|
129
131
|
throw new Error("Parallel edges are not allowed in this graph");
|
|
130
132
|
}
|
|
131
133
|
|
|
@@ -157,7 +159,10 @@ export class Graph {
|
|
|
157
159
|
}
|
|
158
160
|
}
|
|
159
161
|
|
|
160
|
-
|
|
162
|
+
if (!replacing) {
|
|
163
|
+
this.edgeCount++;
|
|
164
|
+
}
|
|
165
|
+
|
|
161
166
|
this.mutations++;
|
|
162
167
|
}
|
|
163
168
|
|
package/src/errors.ts
CHANGED
|
@@ -24,3 +24,32 @@ export class ConvergenceError extends Error {
|
|
|
24
24
|
);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Thrown when a shortest path cannot be walked back from its predecessor array: the walk met a
|
|
30
|
+
* missing or out-of-range predecessor before the source (`"gap"`), or took more than
|
|
31
|
+
* `nodeCount - 1` steps without reaching it (`"cycle"`).
|
|
32
|
+
*
|
|
33
|
+
* A CPU search never produces such an array; an accelerator's result can (a kernel bug, a lost
|
|
34
|
+
* device, a buffer read too early). The error surfaces it instead of hanging or returning a wrong
|
|
35
|
+
* path, and nothing recomputes the path on the CPU.
|
|
36
|
+
*/
|
|
37
|
+
export class PathWalkError extends Error {
|
|
38
|
+
override readonly name = "PathWalkError";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Builds the error and its message.
|
|
42
|
+
* @param source - The search's source node index
|
|
43
|
+
* @param target - The node index the walk started from
|
|
44
|
+
* @param reason - `"gap"` or `"cycle"`, as above
|
|
45
|
+
*/
|
|
46
|
+
constructor(
|
|
47
|
+
readonly source: number,
|
|
48
|
+
readonly target: number,
|
|
49
|
+
readonly reason: "cycle" | "gap",
|
|
50
|
+
) {
|
|
51
|
+
super(
|
|
52
|
+
`cannot walk the shortest path from node ${String(source)} to node ${String(target)}: the predecessor array has a ${reason}`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
}
|
package/src/index.ts
CHANGED