@graphty/algorithms 1.0.1

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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +193 -0
  3. package/dist/src/algorithms/centrality/betweenness.d.ts +34 -0
  4. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -0
  5. package/dist/src/algorithms/centrality/betweenness.js +223 -0
  6. package/dist/src/algorithms/centrality/betweenness.js.map +1 -0
  7. package/dist/src/algorithms/centrality/closeness.d.ts +43 -0
  8. package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -0
  9. package/dist/src/algorithms/centrality/closeness.js +202 -0
  10. package/dist/src/algorithms/centrality/closeness.js.map +1 -0
  11. package/dist/src/algorithms/centrality/degree.d.ts +17 -0
  12. package/dist/src/algorithms/centrality/degree.d.ts.map +1 -0
  13. package/dist/src/algorithms/centrality/degree.js +86 -0
  14. package/dist/src/algorithms/centrality/degree.js.map +1 -0
  15. package/dist/src/algorithms/centrality/index.d.ts +11 -0
  16. package/dist/src/algorithms/centrality/index.d.ts.map +1 -0
  17. package/dist/src/algorithms/centrality/index.js +8 -0
  18. package/dist/src/algorithms/centrality/index.js.map +1 -0
  19. package/dist/src/algorithms/centrality/pagerank.d.ts +74 -0
  20. package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -0
  21. package/dist/src/algorithms/centrality/pagerank.js +191 -0
  22. package/dist/src/algorithms/centrality/pagerank.js.map +1 -0
  23. package/dist/src/algorithms/components/connected.d.ts +58 -0
  24. package/dist/src/algorithms/components/connected.d.ts.map +1 -0
  25. package/dist/src/algorithms/components/connected.js +234 -0
  26. package/dist/src/algorithms/components/connected.js.map +1 -0
  27. package/dist/src/algorithms/components/index.d.ts +5 -0
  28. package/dist/src/algorithms/components/index.d.ts.map +1 -0
  29. package/dist/src/algorithms/components/index.js +5 -0
  30. package/dist/src/algorithms/components/index.js.map +1 -0
  31. package/dist/src/algorithms/index.d.ts +8 -0
  32. package/dist/src/algorithms/index.d.ts.map +1 -0
  33. package/dist/src/algorithms/index.js +12 -0
  34. package/dist/src/algorithms/index.js.map +1 -0
  35. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts +52 -0
  36. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -0
  37. package/dist/src/algorithms/shortest-path/bellman-ford.js +131 -0
  38. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -0
  39. package/dist/src/algorithms/shortest-path/dijkstra.d.ts +26 -0
  40. package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -0
  41. package/dist/src/algorithms/shortest-path/dijkstra.js +199 -0
  42. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -0
  43. package/dist/src/algorithms/shortest-path/index.d.ts +7 -0
  44. package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -0
  45. package/dist/src/algorithms/shortest-path/index.js +6 -0
  46. package/dist/src/algorithms/shortest-path/index.js.map +1 -0
  47. package/dist/src/algorithms/traversal/bfs.d.ts +25 -0
  48. package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -0
  49. package/dist/src/algorithms/traversal/bfs.js +189 -0
  50. package/dist/src/algorithms/traversal/bfs.js.map +1 -0
  51. package/dist/src/algorithms/traversal/dfs.d.ts +32 -0
  52. package/dist/src/algorithms/traversal/dfs.d.ts.map +1 -0
  53. package/dist/src/algorithms/traversal/dfs.js +259 -0
  54. package/dist/src/algorithms/traversal/dfs.js.map +1 -0
  55. package/dist/src/algorithms/traversal/index.d.ts +7 -0
  56. package/dist/src/algorithms/traversal/index.d.ts.map +1 -0
  57. package/dist/src/algorithms/traversal/index.js +6 -0
  58. package/dist/src/algorithms/traversal/index.js.map +1 -0
  59. package/dist/src/core/graph.d.ts +100 -0
  60. package/dist/src/core/graph.d.ts.map +1 -0
  61. package/dist/src/core/graph.js +276 -0
  62. package/dist/src/core/graph.js.map +1 -0
  63. package/dist/src/data-structures/index.d.ts +6 -0
  64. package/dist/src/data-structures/index.d.ts.map +1 -0
  65. package/dist/src/data-structures/index.js +6 -0
  66. package/dist/src/data-structures/index.js.map +1 -0
  67. package/dist/src/data-structures/priority-queue.d.ts +60 -0
  68. package/dist/src/data-structures/priority-queue.d.ts.map +1 -0
  69. package/dist/src/data-structures/priority-queue.js +152 -0
  70. package/dist/src/data-structures/priority-queue.js.map +1 -0
  71. package/dist/src/data-structures/union-find.d.ts +54 -0
  72. package/dist/src/data-structures/union-find.d.ts.map +1 -0
  73. package/dist/src/data-structures/union-find.js +145 -0
  74. package/dist/src/data-structures/union-find.js.map +1 -0
  75. package/dist/src/index.d.ts +11 -0
  76. package/dist/src/index.d.ts.map +1 -0
  77. package/dist/src/index.js +13 -0
  78. package/dist/src/index.js.map +1 -0
  79. package/dist/src/types/index.d.ts +74 -0
  80. package/dist/src/types/index.d.ts.map +1 -0
  81. package/dist/src/types/index.js +5 -0
  82. package/dist/src/types/index.js.map +1 -0
  83. package/dist/test/browser/basic.test.d.ts +2 -0
  84. package/dist/test/browser/basic.test.d.ts.map +1 -0
  85. package/dist/test/browser/basic.test.js +70 -0
  86. package/dist/test/browser/basic.test.js.map +1 -0
  87. package/dist/test/unit/bellman-ford.test.d.ts +2 -0
  88. package/dist/test/unit/bellman-ford.test.d.ts.map +1 -0
  89. package/dist/test/unit/bellman-ford.test.js +231 -0
  90. package/dist/test/unit/bellman-ford.test.js.map +1 -0
  91. package/dist/test/unit/betweenness-centrality.test.d.ts +2 -0
  92. package/dist/test/unit/betweenness-centrality.test.d.ts.map +1 -0
  93. package/dist/test/unit/betweenness-centrality.test.js +311 -0
  94. package/dist/test/unit/betweenness-centrality.test.js.map +1 -0
  95. package/dist/test/unit/bfs.test.d.ts +2 -0
  96. package/dist/test/unit/bfs.test.d.ts.map +1 -0
  97. package/dist/test/unit/bfs.test.js +277 -0
  98. package/dist/test/unit/bfs.test.js.map +1 -0
  99. package/dist/test/unit/closeness.test.d.ts +2 -0
  100. package/dist/test/unit/closeness.test.d.ts.map +1 -0
  101. package/dist/test/unit/closeness.test.js +266 -0
  102. package/dist/test/unit/closeness.test.js.map +1 -0
  103. package/dist/test/unit/connected-components.test.d.ts +2 -0
  104. package/dist/test/unit/connected-components.test.d.ts.map +1 -0
  105. package/dist/test/unit/connected-components.test.js +355 -0
  106. package/dist/test/unit/connected-components.test.js.map +1 -0
  107. package/dist/test/unit/degree-centrality.test.d.ts +2 -0
  108. package/dist/test/unit/degree-centrality.test.d.ts.map +1 -0
  109. package/dist/test/unit/degree-centrality.test.js +260 -0
  110. package/dist/test/unit/degree-centrality.test.js.map +1 -0
  111. package/dist/test/unit/dfs.test.d.ts +2 -0
  112. package/dist/test/unit/dfs.test.d.ts.map +1 -0
  113. package/dist/test/unit/dfs.test.js +350 -0
  114. package/dist/test/unit/dfs.test.js.map +1 -0
  115. package/dist/test/unit/dijkstra.test.d.ts +2 -0
  116. package/dist/test/unit/dijkstra.test.d.ts.map +1 -0
  117. package/dist/test/unit/dijkstra.test.js +311 -0
  118. package/dist/test/unit/dijkstra.test.js.map +1 -0
  119. package/dist/test/unit/graph.test.d.ts +2 -0
  120. package/dist/test/unit/graph.test.d.ts.map +1 -0
  121. package/dist/test/unit/graph.test.js +175 -0
  122. package/dist/test/unit/graph.test.js.map +1 -0
  123. package/dist/test/unit/pagerank.test.d.ts +2 -0
  124. package/dist/test/unit/pagerank.test.d.ts.map +1 -0
  125. package/dist/test/unit/pagerank.test.js +281 -0
  126. package/dist/test/unit/pagerank.test.js.map +1 -0
  127. package/dist/test/unit/priority-queue.test.d.ts +2 -0
  128. package/dist/test/unit/priority-queue.test.d.ts.map +1 -0
  129. package/dist/test/unit/priority-queue.test.js +189 -0
  130. package/dist/test/unit/priority-queue.test.js.map +1 -0
  131. package/dist/test/unit/union-find.test.d.ts +2 -0
  132. package/dist/test/unit/union-find.test.d.ts.map +1 -0
  133. package/dist/test/unit/union-find.test.js +245 -0
  134. package/dist/test/unit/union-find.test.js.map +1 -0
  135. package/package.json +100 -0
  136. package/src/algorithms/centrality/betweenness.ts +303 -0
  137. package/src/algorithms/centrality/closeness.ts +296 -0
  138. package/src/algorithms/centrality/degree.ts +105 -0
  139. package/src/algorithms/centrality/index.ts +11 -0
  140. package/src/algorithms/centrality/pagerank.ts +302 -0
  141. package/src/algorithms/components/connected.ts +298 -0
  142. package/src/algorithms/components/index.ts +17 -0
  143. package/src/algorithms/index.ts +15 -0
  144. package/src/algorithms/shortest-path/bellman-ford.ts +214 -0
  145. package/src/algorithms/shortest-path/dijkstra.ts +256 -0
  146. package/src/algorithms/shortest-path/index.ts +7 -0
  147. package/src/algorithms/traversal/bfs.ts +236 -0
  148. package/src/algorithms/traversal/dfs.ts +367 -0
  149. package/src/algorithms/traversal/index.ts +7 -0
  150. package/src/core/graph.ts +326 -0
  151. package/src/data-structures/index.ts +6 -0
  152. package/src/data-structures/priority-queue.ts +180 -0
  153. package/src/data-structures/union-find.ts +170 -0
  154. package/src/index.ts +35 -0
  155. package/src/types/index.ts +95 -0
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Calculate closeness centrality for all nodes
3
+ */
4
+ export function closenessCentrality(graph, options = {}) {
5
+ const nodes = Array.from(graph.nodes()).map((node) => node.id);
6
+ const centrality = {};
7
+ for (const sourceNode of nodes) {
8
+ centrality[String(sourceNode)] = nodeClosenessCentrality(graph, sourceNode, options);
9
+ }
10
+ return centrality;
11
+ }
12
+ /**
13
+ * Calculate closeness centrality for a specific node
14
+ */
15
+ export function nodeClosenessCentrality(graph, node, options = {}) {
16
+ if (!graph.hasNode(node)) {
17
+ throw new Error(`Node ${String(node)} not found in graph`);
18
+ }
19
+ const distances = singleSourceShortestPathLengths(graph, node, options.cutoff);
20
+ if (distances.size <= 1) {
21
+ return 0; // No other nodes reachable
22
+ }
23
+ let centrality = 0;
24
+ if (options.harmonic) {
25
+ // Harmonic centrality: sum of reciprocals of distances
26
+ for (const [targetNode, distance] of distances) {
27
+ if (targetNode !== node && distance > 0) {
28
+ centrality += 1 / distance;
29
+ }
30
+ }
31
+ }
32
+ else {
33
+ // Standard closeness: reciprocal of sum of distances
34
+ let totalDistance = 0;
35
+ let reachableNodes = 0;
36
+ for (const [targetNode, distance] of distances) {
37
+ if (targetNode !== node) {
38
+ totalDistance += distance;
39
+ reachableNodes++;
40
+ }
41
+ }
42
+ if (totalDistance > 0) {
43
+ centrality = 1 / totalDistance;
44
+ // Wasserman and Faust normalization for disconnected graphs
45
+ if (options.normalized) {
46
+ const n = Array.from(graph.nodes()).length;
47
+ centrality = centrality * reachableNodes / (n - 1);
48
+ }
49
+ }
50
+ }
51
+ // Normalization for harmonic centrality
52
+ if (options.harmonic && options.normalized) {
53
+ const n = Array.from(graph.nodes()).length;
54
+ if (n > 1) {
55
+ centrality = centrality / (n - 1);
56
+ }
57
+ }
58
+ return centrality;
59
+ }
60
+ /**
61
+ * Single-source shortest path lengths using BFS (for unweighted graphs)
62
+ */
63
+ function singleSourceShortestPathLengths(graph, source, cutoff) {
64
+ const distances = new Map();
65
+ const visited = new Set();
66
+ const queue = [];
67
+ // Initialize
68
+ queue.push({ node: source, distance: 0 });
69
+ visited.add(source);
70
+ distances.set(source, 0);
71
+ while (queue.length > 0) {
72
+ const current = queue.shift();
73
+ if (!current) {
74
+ break;
75
+ }
76
+ // Skip if beyond cutoff
77
+ if (cutoff !== undefined && current.distance >= cutoff) {
78
+ continue;
79
+ }
80
+ // Explore neighbors
81
+ for (const neighbor of graph.neighbors(current.node)) {
82
+ if (!visited.has(neighbor)) {
83
+ const newDistance = current.distance + 1;
84
+ // Skip if beyond cutoff
85
+ if (cutoff !== undefined && newDistance > cutoff) {
86
+ continue;
87
+ }
88
+ visited.add(neighbor);
89
+ distances.set(neighbor, newDistance);
90
+ queue.push({ node: neighbor, distance: newDistance });
91
+ }
92
+ }
93
+ }
94
+ return distances;
95
+ }
96
+ /**
97
+ * Calculate weighted closeness centrality using Dijkstra's algorithm
98
+ */
99
+ export function weightedClosenessCentrality(graph, options = {}) {
100
+ const nodes = Array.from(graph.nodes()).map((node) => node.id);
101
+ const centrality = {};
102
+ for (const sourceNode of nodes) {
103
+ centrality[String(sourceNode)] = nodeWeightedClosenessCentrality(graph, sourceNode, options);
104
+ }
105
+ return centrality;
106
+ }
107
+ /**
108
+ * Calculate weighted closeness centrality for a specific node using Dijkstra
109
+ */
110
+ export function nodeWeightedClosenessCentrality(graph, node, options = {}) {
111
+ if (!graph.hasNode(node)) {
112
+ throw new Error(`Node ${String(node)} not found in graph`);
113
+ }
114
+ const distances = dijkstraDistances(graph, node, options.cutoff);
115
+ if (distances.size <= 1) {
116
+ return 0; // No other nodes reachable
117
+ }
118
+ let centrality = 0;
119
+ if (options.harmonic) {
120
+ // Harmonic centrality: sum of reciprocals of distances
121
+ for (const [targetNode, distance] of distances) {
122
+ if (targetNode !== node && distance > 0 && distance < Infinity) {
123
+ centrality += 1 / distance;
124
+ }
125
+ }
126
+ }
127
+ else {
128
+ // Standard closeness: reciprocal of sum of distances
129
+ let totalDistance = 0;
130
+ let reachableNodes = 0;
131
+ for (const [targetNode, distance] of distances) {
132
+ if (targetNode !== node && distance < Infinity) {
133
+ totalDistance += distance;
134
+ reachableNodes++;
135
+ }
136
+ }
137
+ if (totalDistance > 0) {
138
+ centrality = 1 / totalDistance;
139
+ // Wasserman and Faust normalization for disconnected graphs
140
+ if (options.normalized) {
141
+ const n = Array.from(graph.nodes()).length;
142
+ centrality = centrality * reachableNodes / (n - 1);
143
+ }
144
+ }
145
+ }
146
+ // Normalization for harmonic centrality
147
+ if (options.harmonic && options.normalized) {
148
+ const n = Array.from(graph.nodes()).length;
149
+ if (n > 1) {
150
+ centrality = centrality / (n - 1);
151
+ }
152
+ }
153
+ return centrality;
154
+ }
155
+ /**
156
+ * Single-source shortest path distances using Dijkstra's algorithm
157
+ */
158
+ function dijkstraDistances(graph, source, cutoff) {
159
+ const distances = new Map();
160
+ const visited = new Set();
161
+ const pq = [];
162
+ // Initialize distances
163
+ for (const node of graph.nodes()) {
164
+ distances.set(node.id, node.id === source ? 0 : Infinity);
165
+ }
166
+ pq.push({ node: source, distance: 0 });
167
+ while (pq.length > 0) {
168
+ // Simple priority queue (could be optimized with a proper heap)
169
+ pq.sort((a, b) => a.distance - b.distance);
170
+ const current = pq.shift();
171
+ if (!current || visited.has(current.node)) {
172
+ continue;
173
+ }
174
+ visited.add(current.node);
175
+ // Skip if beyond cutoff
176
+ if (cutoff !== undefined && current.distance > cutoff) {
177
+ continue;
178
+ }
179
+ // Explore neighbors
180
+ for (const neighbor of graph.neighbors(current.node)) {
181
+ if (visited.has(neighbor)) {
182
+ continue;
183
+ }
184
+ const edge = graph.getEdge(current.node, neighbor);
185
+ if (!edge) {
186
+ continue;
187
+ }
188
+ const edgeWeight = edge.weight ?? 1;
189
+ const tentativeDistance = current.distance + edgeWeight;
190
+ const currentDistance = distances.get(neighbor) ?? Infinity;
191
+ if (tentativeDistance < currentDistance) {
192
+ distances.set(neighbor, tentativeDistance);
193
+ // Skip if beyond cutoff
194
+ if (cutoff === undefined || tentativeDistance <= cutoff) {
195
+ pq.push({ node: neighbor, distance: tentativeDistance });
196
+ }
197
+ }
198
+ }
199
+ }
200
+ return distances;
201
+ }
202
+ //# sourceMappingURL=closeness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closeness.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/closeness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Graph } from "../../core/graph.js";
2
+ import type { CentralityOptions, CentralityResult } from "../../types/index.js";
3
+ /**
4
+ * Degree centrality implementation
5
+ *
6
+ * Measures the importance of a node based on the number of connections it has.
7
+ * The most basic centrality measure that simply counts incident edges.
8
+ */
9
+ /**
10
+ * Calculate degree centrality for all nodes in the graph
11
+ */
12
+ export declare function degreeCentrality(graph: Graph, options?: CentralityOptions): CentralityResult;
13
+ /**
14
+ * Calculate degree centrality for a specific node
15
+ */
16
+ export declare function nodeDegreeCentrality(graph: Graph, nodeId: string | number, options?: CentralityOptions): number;
17
+ //# sourceMappingURL=degree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"degree.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/degree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAE9E;;;;;GAKG;AAEH;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,iBAAsB,GAChC,gBAAgB,CA2ClB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,OAAO,GAAE,iBAAsB,GAChC,MAAM,CAoCR"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Degree centrality implementation
3
+ *
4
+ * Measures the importance of a node based on the number of connections it has.
5
+ * The most basic centrality measure that simply counts incident edges.
6
+ */
7
+ /**
8
+ * Calculate degree centrality for all nodes in the graph
9
+ */
10
+ export function degreeCentrality(graph, options = {}) {
11
+ const centrality = {};
12
+ const { nodeCount } = graph;
13
+ // Calculate normalization factor
14
+ const maxPossibleDegree = graph.isDirected ? nodeCount - 1 : nodeCount - 1;
15
+ for (const node of graph.nodes()) {
16
+ let degree;
17
+ if (graph.isDirected && options.mode) {
18
+ // For directed graphs, calculate specific degree type
19
+ switch (options.mode) {
20
+ case "in": {
21
+ degree = graph.inDegree(node.id);
22
+ break;
23
+ }
24
+ case "out": {
25
+ degree = graph.outDegree(node.id);
26
+ break;
27
+ }
28
+ case "total": {
29
+ degree = graph.degree(node.id);
30
+ break;
31
+ }
32
+ default: {
33
+ degree = graph.degree(node.id);
34
+ }
35
+ }
36
+ }
37
+ else {
38
+ // For undirected graphs or default case
39
+ degree = graph.degree(node.id);
40
+ }
41
+ // Apply normalization if requested
42
+ const normalizedDegree = options.normalized && maxPossibleDegree > 0 ?
43
+ degree / maxPossibleDegree :
44
+ degree;
45
+ centrality[node.id.toString()] = normalizedDegree;
46
+ }
47
+ return centrality;
48
+ }
49
+ /**
50
+ * Calculate degree centrality for a specific node
51
+ */
52
+ export function nodeDegreeCentrality(graph, nodeId, options = {}) {
53
+ if (!graph.hasNode(nodeId)) {
54
+ throw new Error(`Node ${String(nodeId)} not found in graph`);
55
+ }
56
+ const { nodeCount } = graph;
57
+ let degree;
58
+ if (graph.isDirected && options.mode) {
59
+ switch (options.mode) {
60
+ case "in": {
61
+ degree = graph.inDegree(nodeId);
62
+ break;
63
+ }
64
+ case "out": {
65
+ degree = graph.outDegree(nodeId);
66
+ break;
67
+ }
68
+ case "total": {
69
+ degree = graph.degree(nodeId);
70
+ break;
71
+ }
72
+ default: {
73
+ degree = graph.degree(nodeId);
74
+ }
75
+ }
76
+ }
77
+ else {
78
+ degree = graph.degree(nodeId);
79
+ }
80
+ // Apply normalization if requested
81
+ const maxPossibleDegree = nodeCount - 1;
82
+ return options.normalized && maxPossibleDegree > 0 ?
83
+ degree / maxPossibleDegree :
84
+ degree;
85
+ }
86
+ //# sourceMappingURL=degree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"degree.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/degree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Centrality algorithms
3
+ */
4
+ export type { BetweennessCentralityOptions } from "./betweenness.js";
5
+ export { betweennessCentrality, edgeBetweennessCentrality, nodeBetweennessCentrality } from "./betweenness.js";
6
+ export type { ClosenessCentralityOptions } from "./closeness.js";
7
+ export { closenessCentrality, nodeClosenessCentrality, nodeWeightedClosenessCentrality, weightedClosenessCentrality } from "./closeness.js";
8
+ export { degreeCentrality, nodeDegreeCentrality } from "./degree.js";
9
+ export type { PageRankOptions, PageRankResult } from "./pagerank.js";
10
+ export { pageRank, pageRankCentrality, personalizedPageRank, topPageRankNodes } from "./pagerank.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAC,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAC7G,YAAY,EAAC,0BAA0B,EAAC,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAC,gBAAgB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AACnE,YAAY,EAAC,eAAe,EAAE,cAAc,EAAC,MAAM,eAAe,CAAC;AACnE,OAAO,EAAC,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAC,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Centrality algorithms
3
+ */
4
+ export { betweennessCentrality, edgeBetweennessCentrality, nodeBetweennessCentrality } from "./betweenness.js";
5
+ export { closenessCentrality, nodeClosenessCentrality, nodeWeightedClosenessCentrality, weightedClosenessCentrality } from "./closeness.js";
6
+ export { degreeCentrality, nodeDegreeCentrality } from "./degree.js";
7
+ export { pageRank, pageRankCentrality, personalizedPageRank, topPageRankNodes } from "./pagerank.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAE7G,OAAO,EAAC,mBAAmB,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAC,gBAAgB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAC,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAC,MAAM,eAAe,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { Graph } from "../../core/graph.js";
2
+ import type { NodeId } from "../../types/index.js";
3
+ /**
4
+ * PageRank algorithm implementation
5
+ *
6
+ * Measures the importance of nodes in a directed graph based on the
7
+ * structure of incoming links. Originally designed for ranking web pages.
8
+ */
9
+ /**
10
+ * PageRank algorithm options
11
+ */
12
+ export interface PageRankOptions {
13
+ /**
14
+ * Damping factor (probability of following a link) (default: 0.85)
15
+ */
16
+ dampingFactor?: number;
17
+ /**
18
+ * Maximum number of iterations (default: 100)
19
+ */
20
+ maxIterations?: number;
21
+ /**
22
+ * Convergence tolerance (default: 1e-6)
23
+ */
24
+ tolerance?: number;
25
+ /**
26
+ * Initial PageRank values for nodes (default: uniform distribution)
27
+ */
28
+ initialRanks?: Map<NodeId, number>;
29
+ /**
30
+ * Personalization vector for Personalized PageRank (default: null)
31
+ */
32
+ personalization?: Map<NodeId, number>;
33
+ /**
34
+ * Weight attribute for weighted PageRank (default: null = unweighted)
35
+ */
36
+ weight?: string;
37
+ }
38
+ /**
39
+ * PageRank algorithm result
40
+ */
41
+ export interface PageRankResult {
42
+ /**
43
+ * PageRank scores for each node
44
+ */
45
+ ranks: Record<string, number>;
46
+ /**
47
+ * Number of iterations until convergence
48
+ */
49
+ iterations: number;
50
+ /**
51
+ * Whether the algorithm converged
52
+ */
53
+ converged: boolean;
54
+ }
55
+ /**
56
+ * Calculate PageRank for all nodes in the graph
57
+ */
58
+ export declare function pageRank(graph: Graph, options?: PageRankOptions): PageRankResult;
59
+ /**
60
+ * Calculate Personalized PageRank for a specific set of source nodes
61
+ */
62
+ export declare function personalizedPageRank(graph: Graph, personalNodes: NodeId[], options?: Omit<PageRankOptions, "personalization">): PageRankResult;
63
+ /**
64
+ * Calculate PageRank centrality (normalized PageRank scores)
65
+ */
66
+ export declare function pageRankCentrality(graph: Graph, options?: PageRankOptions): Record<string, number>;
67
+ /**
68
+ * Get the top-k nodes by PageRank score
69
+ */
70
+ export declare function topPageRankNodes(graph: Graph, k: number, options?: PageRankOptions): {
71
+ node: NodeId;
72
+ rank: number;
73
+ }[];
74
+ //# sourceMappingURL=pagerank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagerank.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/pagerank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAEjD;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC;;OAEG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACpB,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,eAAoB,GAC9B,cAAc,CA6JhB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,GAAE,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAM,GACvD,cAAc,CAuBhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,eAAoB,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,KAAK,EACZ,CAAC,EAAE,MAAM,EACT,OAAO,GAAE,eAAoB,GAC9B;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,EAAE,CAYhC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Calculate PageRank for all nodes in the graph
3
+ */
4
+ export function pageRank(graph, options = {}) {
5
+ const { dampingFactor = 0.85, maxIterations = 100, tolerance = 1e-6, initialRanks, personalization, weight, } = options;
6
+ if (!graph.isDirected) {
7
+ throw new Error("PageRank requires a directed graph");
8
+ }
9
+ if (dampingFactor < 0 || dampingFactor > 1) {
10
+ throw new Error("Damping factor must be between 0 and 1");
11
+ }
12
+ const nodes = Array.from(graph.nodes()).map((node) => node.id);
13
+ const n = nodes.length;
14
+ if (n === 0) {
15
+ return { ranks: {}, iterations: 0, converged: true };
16
+ }
17
+ // Initialize PageRank values
18
+ let ranks = new Map();
19
+ if (initialRanks) {
20
+ for (const nodeId of nodes) {
21
+ ranks.set(nodeId, initialRanks.get(nodeId) ?? 1 / n);
22
+ }
23
+ }
24
+ else {
25
+ for (const nodeId of nodes) {
26
+ ranks.set(nodeId, 1 / n);
27
+ }
28
+ }
29
+ // Normalize initial ranks
30
+ normalizeRanks(ranks);
31
+ // Calculate out-degrees and handle dangling nodes
32
+ const outDegrees = new Map();
33
+ const outWeights = new Map();
34
+ const danglingNodes = [];
35
+ for (const nodeId of nodes) {
36
+ let outDegree = 0;
37
+ let totalOutWeight = 0;
38
+ for (const neighbor of graph.neighbors(nodeId)) {
39
+ outDegree++;
40
+ if (weight) {
41
+ const edge = graph.getEdge(nodeId, neighbor);
42
+ const edgeWeight = edge?.weight ?? 1;
43
+ totalOutWeight += edgeWeight;
44
+ }
45
+ else {
46
+ totalOutWeight += 1;
47
+ }
48
+ }
49
+ outDegrees.set(nodeId, outDegree);
50
+ outWeights.set(nodeId, totalOutWeight);
51
+ if (outDegree === 0) {
52
+ danglingNodes.push(nodeId);
53
+ }
54
+ }
55
+ // Setup personalization vector
56
+ let personalVector = null;
57
+ if (personalization) {
58
+ personalVector = new Map(personalization);
59
+ normalizeRanks(personalVector);
60
+ }
61
+ let converged = false;
62
+ let iteration = 0;
63
+ // Power iteration
64
+ for (iteration = 0; iteration < maxIterations; iteration++) {
65
+ const newRanks = new Map();
66
+ // Initialize with teleportation probability
67
+ for (const nodeId of nodes) {
68
+ if (personalVector) {
69
+ newRanks.set(nodeId, (1 - dampingFactor) * (personalVector.get(nodeId) ?? 0));
70
+ }
71
+ else {
72
+ newRanks.set(nodeId, (1 - dampingFactor) / n);
73
+ }
74
+ }
75
+ // Handle dangling nodes
76
+ let danglingSum = 0;
77
+ for (const danglingNode of danglingNodes) {
78
+ danglingSum += ranks.get(danglingNode) ?? 0;
79
+ }
80
+ if (danglingSum > 0) {
81
+ const danglingContribution = dampingFactor * danglingSum / n;
82
+ for (const nodeId of nodes) {
83
+ const currentRank = newRanks.get(nodeId) ?? 0;
84
+ if (personalVector) {
85
+ const personalContrib = danglingContribution * (personalVector.get(nodeId) ?? 0);
86
+ newRanks.set(nodeId, currentRank + personalContrib);
87
+ }
88
+ else {
89
+ newRanks.set(nodeId, currentRank + danglingContribution);
90
+ }
91
+ }
92
+ }
93
+ // Propagate rank from each node to its neighbors
94
+ for (const nodeId of nodes) {
95
+ const currentRank = ranks.get(nodeId) ?? 0;
96
+ const nodeOutWeight = outWeights.get(nodeId) ?? 0;
97
+ if (nodeOutWeight > 0) {
98
+ for (const neighbor of graph.neighbors(nodeId)) {
99
+ let edgeWeight = 1;
100
+ if (weight) {
101
+ const edge = graph.getEdge(nodeId, neighbor);
102
+ edgeWeight = edge?.weight ?? 1;
103
+ }
104
+ const contribution = dampingFactor * currentRank * (edgeWeight / nodeOutWeight);
105
+ const neighborRank = newRanks.get(neighbor) ?? 0;
106
+ newRanks.set(neighbor, neighborRank + contribution);
107
+ }
108
+ }
109
+ }
110
+ // Check for convergence
111
+ let maxDiff = 0;
112
+ for (const nodeId of nodes) {
113
+ const oldRank = ranks.get(nodeId) ?? 0;
114
+ const newRank = newRanks.get(nodeId) ?? 0;
115
+ maxDiff = Math.max(maxDiff, Math.abs(newRank - oldRank));
116
+ }
117
+ ranks = newRanks;
118
+ if (maxDiff < tolerance) {
119
+ converged = true;
120
+ break;
121
+ }
122
+ }
123
+ // Convert to string-keyed record
124
+ const result = {};
125
+ for (const nodeId of nodes) {
126
+ result[String(nodeId)] = ranks.get(nodeId) ?? 0;
127
+ }
128
+ return {
129
+ ranks: result,
130
+ iterations: iteration + 1,
131
+ converged,
132
+ };
133
+ }
134
+ /**
135
+ * Calculate Personalized PageRank for a specific set of source nodes
136
+ */
137
+ export function personalizedPageRank(graph, personalNodes, options = {}) {
138
+ const nodes = Array.from(graph.nodes()).map((node) => node.id);
139
+ const personalization = new Map();
140
+ // Initialize personalization vector
141
+ for (const nodeId of nodes) {
142
+ personalization.set(nodeId, 0);
143
+ }
144
+ // Set equal probability for personal nodes
145
+ const personalValue = 1 / personalNodes.length;
146
+ for (const personalNode of personalNodes) {
147
+ if (!graph.hasNode(personalNode)) {
148
+ throw new Error(`Personal node ${String(personalNode)} not found in graph`);
149
+ }
150
+ personalization.set(personalNode, personalValue);
151
+ }
152
+ return pageRank(graph, {
153
+ ...options,
154
+ personalization,
155
+ });
156
+ }
157
+ /**
158
+ * Calculate PageRank centrality (normalized PageRank scores)
159
+ */
160
+ export function pageRankCentrality(graph, options = {}) {
161
+ const result = pageRank(graph, options);
162
+ return result.ranks;
163
+ }
164
+ /**
165
+ * Get the top-k nodes by PageRank score
166
+ */
167
+ export function topPageRankNodes(graph, k, options = {}) {
168
+ const result = pageRank(graph, options);
169
+ const nodeRanks = [];
170
+ for (const [nodeStr, rank] of Object.entries(result.ranks)) {
171
+ nodeRanks.push({ node: nodeStr, rank });
172
+ }
173
+ // Sort by rank in descending order
174
+ nodeRanks.sort((a, b) => b.rank - a.rank);
175
+ return nodeRanks.slice(0, k);
176
+ }
177
+ /**
178
+ * Normalize ranks so they sum to 1
179
+ */
180
+ function normalizeRanks(ranks) {
181
+ let sum = 0;
182
+ for (const rank of ranks.values()) {
183
+ sum += rank;
184
+ }
185
+ if (sum > 0) {
186
+ for (const [nodeId, rank] of ranks) {
187
+ ranks.set(nodeId, rank / sum);
188
+ }
189
+ }
190
+ }
191
+ //# sourceMappingURL=pagerank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagerank.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/pagerank.ts"],"names":[],"mappings":"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"}